python qt5 数据改变 触发信号_pyqt5 使用 QTimer, QThread, pyqtSignal 实现自动执行,多线程,自定义信号触发。...

渣渣用法,请等待我心情好的时候更新。

1.第一个例子

1.1 先看mainwindow.py

from PyQt5 importQtCore, QtGui, QtWidgetsclassUi_MainWindow(object):defsetupUi(self, MainWindow):

MainWindow.setObjectName("MainWindow")

MainWindow.resize(640, 320)

self.centralwidget=QtWidgets.QWidget(MainWindow)

self.centralwidget.setObjectName("centralwidget")

self.textBrowser=QtWidgets.QTextBrowser(self.centralwidget)

self.textBrowser.setGeometry(QtCore.QRect(0, 0,320, 320))

self.textBrowser.setObjectName("textBrowser")

self.pushButton=QtWidgets.QPushButton(self.centralwidget)

self.pushButton.setGeometry(QtCore.QRect(450, 150, 75, 23))

self.pushButton.setObjectName("pushButton")

MainWindow.setCentralWidget(self.centralwidget)

self.retranslateUi(MainWindow)

self.pushButton.clicked.connect(MainWindow.start)

QtCore.QMetaObject.connectSlotsByName(MainWindow)defretranslateUi(self, MainWindow):

_translate=QtCore.QCoreApplication.translate

MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))

self.pushButton.setText(_translate("MainWindow", "开始"))

定义了一个窗口UI_MainWindow,有一个textBrowser,有一个pushButton

pushButton点击连接到MainWindow.start

1.2 看main.py

importsys, timefrom PyQt5 importQtWidgetsfrom PyQt5.QtCore importQTimer, QThread, pyqtSignalfrom mainwindow importUi_MainWindowclassMainWindow(QtWidgets.QMainWindow, Ui_MainWindow):def __init__(self, parent=None):

super(MainWindow, self).__init__(parent=parent)

self.setupUi(self)defstart(self):

time.sleep(2)

self.textBrowser.append('test1')if __name__ == "__main__":

app=QtWidgets.QApplication(sys.argv)

w=MainWindow()

w.show()

sys.exit(app.exec_())

简单的继承UI_MainWindow,并且定义了MainWindow.start,延迟两秒给textBrowser写进test

2.引入QTimer

QTimer是一个定时任务,可以在指定的时间运行制定的函数,电子钟示例都用的它。

我要用它来实现窗口加载完毕后就自动执行的任务,一般是程序的自检任务。

2.1看main.py

importsys, timefrom PyQt5 importQtWidgetsfrom PyQt5.QtCore importQTimer, QThread, pyqtSignalfrom mainwindow importUi_MainWindowclassMainWindow(QtWidgets.QMainWindow, Ui_MainWindow):def __init__(self, parent=None):

super(MainWindow, self).__init__(parent=parent)

self.setupUi(self)#初始化一个定时器

self.timer =QTimer(self)#定义时间超时连接start_app

self.timer.timeout.connect(self.start)#定义时间任务是一次性任务

self.timer.setSingleShot(True)#启动时间任务

self.timer.start()defstart(self):

time.sleep(2)

self.textBrowser.append('test1')if __name__ == "__main__":

app=QtWidgets.QApplication(sys.argv)

w=MainWindow()

w.show()

sys.exit(app.exec_())

增加的4行就能实现启动即执行。

但是问题是,都执行完MainWindow.start,窗体才显现出来。这个体验可是真差了。

3.引入QThread

QThread是一个多线程调度器,和python的threading性质一样,看名字都像。

3.1 看main.py

importsys, timefrom PyQt5 importQtWidgetsfrom PyQt5.QtCore importQTimer, QThread, pyqtSignalfrom mainwindow importUi_MainWindowclassMainWindow(QtWidgets.QMainWindow, Ui_MainWindow):def __init__(self, parent=None):

super(MainWindow, self).__init__(parent=parent)

self.setupUi(self)#初始化一个定时器

self.timer =QTimer(self)#定义时间超时连接start_app

self.timer.timeout.connect(self.start)#定义时间任务是一次性任务

self.timer.setSingleShot(True)#启动时间任务

self.timer.start()#实例化一个线程

self.work =WorkThread()#多线程的信号触发连接到UpText

self.work.trigger.connect(self.UpText)defstart(self):#time.sleep(2)

#self.textBrowser.append('test1')

#启动另一个线程

self.work.start()defUpText(self, str):

time.sleep(2)

self.textBrowser.append('test2')classWorkThread(QThread):#定义一个信号

trigger =pyqtSignal(str)def __int__(self):#初始化函数,默认

super(WorkThread, self).__init__()defrun(self):

time.sleep(5)#等待5秒后,给触发信号,并传递test

self.trigger.emit('test2')if __name__ == "__main__":

app=QtWidgets.QApplication(sys.argv)

w=MainWindow()

w.show()

sys.exit(app.exec_())

3.2讲解一下对这个程序的理解:

窗口启动后,用QTimer启动一个一次性任务MainWindow.start

MainWindow.start,则是通过QThread启动另一个线程 WrokThread.run

WrokThread.run触发一个信号WrokThread.tragger,并传入字符串‘test2’

MainWindow中的work是实例化的WrokThread

work.trigger连接到MainWindow.UpText

执行了MainWindow.UpText,就更新了textBrowser

由于是多线程执行,一个线程再展示GUI窗口,另一个线程在执行WrokThread.run,所以GUI窗口无卡顿了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值