打赏
随笔 - 111,  文章 - 0,  评论 - 36,  阅读 - 29万

学习PyQt UI编程笔记。相对PyQt来说,PySide资料为少。

此篇记录异步获取代码后,同步显示于界面窗体中,涉及线程网步,此为知识点。

直录代码:

复制代码
# encoding: utf-8

from PySide.QtGui import *
from PySide.QtCore import *
from gethtml_ui import *
from options_ui import *
import threading

# Make main window class
class OptionsDialog(QDialog):
    def __init__(self, parent=None, title=''):
        super(OptionsDialog, self).__init__(parent)

        self.setWindowFlags(Qt.Dialog | Qt.WindowCloseButtonHint | Qt.MSWindowsFixedSizeDialogHint)
        self.ui = Ui_Options()
        self.ui.setupUi(self)
        self.setWindowTitle(title)

class GetHtmlDialog(QDialog):
    htmlGet = Signal(str)

    def __init__(self, parent=None):
        super(GetHtmlDialog, self).__init__(parent)

        # 最大化&最小化按钮
        self.setWindowFlags(Qt.Window)
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)
        self.setWindowTitle('Get Html')

        self.ui.btnGet.setEnabled(False)
        clipboard = QApplication.clipboard()
        # url = clipboard.text()
        # if url == '':
        url = 'https://www.baidu.com'
        self.ui.edtUrl.setText(url)

        # 同步更新内容
        self.htmlGet.connect(lambda s: self.ui.txtHtml.setPlainText(s))

    def get_html(self, url):
        import urllib2

        if not 'http' in url:
            url = 'http://' + url
        try:
            req = urllib2.Request(url)
            req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.9.5.1000 Chrome/39.0.2146.0 Safari/537.36')
            res = urllib2.urlopen(req)
            html = res.read().decode('utf-8')
            # 同步到主线程
            self.htmlGet.emit(html)
        except BaseException, e:
            self.updateHtml.emit(e.message)
        finally:
            self.ui.edtUrl.setEnabled(True)
            self.ui.btnGet.setEnabled(True)

    @QtCore.Slot(str)
    def on_edtUrl_textChanged(self, s):
        self.ui.btnGet.setEnabled(s != '')

    @QtCore.Slot(QKeyEvent)
    def edtUrl_keyPressEvent(self, event):
        if event.key() == QtCore.Qt.Key_Enter and self.ui.btnGet.isEnabled():
            self.ui.btnGet.click()

    @QtCore.Slot()
    def on_btnGet_clicked(self):
        self.ui.edtUrl.setEnabled(False)
        self.ui.btnGet.setEnabled(False)
        t = threading.Thread(target=GetHtmlDialog.get_html, args=(self, self.ui.edtUrl.text()), name='thread')
        t.start()
        # self.get_html(self.ui.edtUrl.text())

    @QtCore.Slot()
    def on_btnClose_clicked(self):
        app.exit()

    @QtCore.Slot()
    def on_btnOptions_clicked(self):
        od = OptionsDialog(self, self.ui.edtUrl.text())
        # QDialog.Accepted
        if od.exec_():
            print 'yeah!'
        else:
            print 'cancel.'

# End of main window class

if __name__ == '__main__':
    import sys

    app = QApplication(sys.argv)
    ud = GetHtmlDialog()
    ud.show()
    sys.exit(app.exec_())
复制代码

显示效果如图:

 

工欲善其事必先利其器,熟悉本不熟的东西,本是个摸索过程,希望能更多探索它的功能

posted on   楚人无衣  阅读(949)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
阅读排行:
· 【译】我们最喜欢的2024年的 Visual Studio 新功能
· 个人数据保全计划:从印象笔记迁移到joplin
· Vue3.5常用特性整理
· 重拾 SSH:从基础到安全加固
· 为什么UNIX使用init进程启动其他进程?

< 2025年1月 >
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8
点击右上角即可分享
微信分享提示