- 论坛徽章:
- 0
|
小弟弄不清楚Pyqt中线程到底需要怎么样使用,虽然查过资料,感觉那么繁琐有没有简单的方法。 我下面做的例子是,一个标签,三个按钮。标签的内容会用定时器来刷新,一秒钟一次。另外三个按钮,button1,点击变成红色,再点击恢复成灰色。button2,点击开始蓝灰交替闪烁,再点击恢复成灰色,button3,点击开始绿灰交替闪烁,再点击恢复成灰色。button1没有问题,但是点击button2和button3时就死掉。不知道怎么弄。本人有三个问题:
1)QTimer也是属于子线程吗?
2)对象类型(如button)可以作为参数传递吗?
3)有人说界面上的东西不能通过线程来改变,是这样吗?
以下是我的代码,请高人帮忙解决一下,谢谢!
- import sys
- import threading
- from PyQt4 import QtCore, QtGui
- from PyQt4.QtGui import QPalette,QFont
- import random
- global flag1
- global flag2
- global flag3
- flag1=0
- flag2=0
- flag3=0
- class Main(QtGui.QMainWindow):
- def __init__(self, parent=None):
- super(Main, self).__init__(parent)
-
- self.label=QtGui.QLabel("") #每隔一秒刷新内容
-
- self.button1 = QtGui.QPushButton('Button1') #点击颜色变红,在点击颜色变灰
- self.button2 = QtGui.QPushButton('Button2') #点击闪烁(蓝),时间为0.5秒,再点击变灰
- self.button3 = QtGui.QPushButton('Button3') #点击闪烁(绿),时间为0.5秒,再点击变灰
-
- central_widget = QtGui.QWidget()
- central_layout = QtGui.QHBoxLayout()
- central_layout.addWidget(self.label)
- central_layout.addWidget(self.button1)
- central_layout.addWidget(self.button2)
- central_layout.addWidget(self.button3)
- central_widget.setLayout(central_layout)
- self.setCentralWidget(central_widget)
- QtCore.QObject.connect(self.button1, QtCore.SIGNAL("clicked()"), self.bt1)
- QtCore.QObject.connect(self.button2, QtCore.SIGNAL("clicked()"), self.bt2)
- QtCore.QObject.connect(self.button3, QtCore.SIGNAL("clicked()"), self.bt3)
-
- self.timer=QtCore.QTimer() #定时器
- QtCore.QObject.connect(self.timer,QtCore.SIGNAL("timeout()"), lambda:self.update())
- self.timer.start(1000)
- '''***********更新label****************'''
- def update(self):
- a=random.random()
- self.label.setText(str(a))
-
- '''*****按钮1***************'''
- def bt1(self):
- global flag1
- if not flag1:
- self.button1.setStyleSheet("background-color: red")
- flag1=1
- else:
- self.button1.setStyleSheet("background-color: window") # Pyqt 默认的窗体背景色是 window吗? 不确定,貌似是对的因为没报错
- flag1=0
-
- '''*****按钮2***************'''
- def bt2(self):
-
- global flag2
-
- if not flag2:
- flag2=1
-
- t=Status_Thread(bt2_flash,self.button2)
-
- t.start()
-
- else:
- flag2=0
-
- '''*****按钮3***************'''
- def bt3(self):
- global flag3
-
- if not flag3:
- flag3=1
- t=Status_Thread(bt3_flash,self.button3)
- t.start()
- else:
- flag3=0
- class Status_Thread(QtCore.QThread):
- def __init__(self, func,key): ##带参数(被调函数名和对象)
-
- super(Status_Thread, self).__init__()
- self.func=func
- self.key=key
- def run(self):
- self.func(self.key)
- def bt2_flash(widget):
- global flag2
- try:
- while flag2:
-
- widget.setStyleSheet("background-color: blue")
- time.sleep(0.5)
-
- widget.setStyleSheet("background-color: window")
- time.sleep(0.5)
- except:
- pass
- def bt3_flash(widget):
- global flag3
- try:
- while flag3:
-
- widget.setStyleSheet("background-color: green")
- time.sleep(0.5)
-
- widget.setStyleSheet("background-color: window")
- time.sleep(0.5)
- except:
- pass
-
- if __name__ == '__main__':
- app = QtGui.QApplication(sys.argv)
-
- mainwindow = Main()
- mainwindow.show()
-
- sys.exit(app.exec_())
复制代码
|
|