免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1432 | 回复: 0
打印 上一主题 下一主题

Pyqt 线程如何使用 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-11-02 13:45 |只看该作者 |倒序浏览
小弟弄不清楚Pyqt中线程到底需要怎么样使用,虽然查过资料,感觉那么繁琐有没有简单的方法。 我下面做的例子是,一个标签,三个按钮。标签的内容会用定时器来刷新,一秒钟一次。另外三个按钮,button1,点击变成红色,再点击恢复成灰色。button2,点击开始蓝灰交替闪烁,再点击恢复成灰色,button3,点击开始绿灰交替闪烁,再点击恢复成灰色。button1没有问题,但是点击button2和button3时就死掉。不知道怎么弄。本人有三个问题:
1)QTimer也是属于子线程吗?
2)对象类型(如button)可以作为参数传递吗?
3)有人说界面上的东西不能通过线程来改变,是这样吗?

以下是我的代码,请高人帮忙解决一下,谢谢!
  1. import sys
  2. import threading

  3. from   PyQt4 import QtCore, QtGui
  4. from   PyQt4.QtGui import QPalette,QFont
  5. import random


  6. global flag1
  7. global flag2
  8. global flag3

  9. flag1=0
  10. flag2=0
  11. flag3=0

  12. class Main(QtGui.QMainWindow):
  13.     def __init__(self, parent=None):
  14.         super(Main, self).__init__(parent)
  15.         
  16.         self.label=QtGui.QLabel("")       #每隔一秒刷新内容
  17.         
  18.         self.button1 = QtGui.QPushButton('Button1')   #点击颜色变红,在点击颜色变灰

  19.         self.button2 = QtGui.QPushButton('Button2')   #点击闪烁(蓝),时间为0.5秒,再点击变灰

  20.         self.button3 = QtGui.QPushButton('Button3')   #点击闪烁(绿),时间为0.5秒,再点击变灰
  21.         
  22.         central_widget = QtGui.QWidget()
  23.         central_layout = QtGui.QHBoxLayout()
  24.         central_layout.addWidget(self.label)
  25.         central_layout.addWidget(self.button1)
  26.         central_layout.addWidget(self.button2)
  27.         central_layout.addWidget(self.button3)
  28.         central_widget.setLayout(central_layout)
  29.         self.setCentralWidget(central_widget)


  30.         QtCore.QObject.connect(self.button1, QtCore.SIGNAL("clicked()"), self.bt1)
  31.         QtCore.QObject.connect(self.button2, QtCore.SIGNAL("clicked()"), self.bt2)
  32.         QtCore.QObject.connect(self.button3, QtCore.SIGNAL("clicked()"), self.bt3)
  33.         
  34.         self.timer=QtCore.QTimer()       #定时器
  35.         QtCore.QObject.connect(self.timer,QtCore.SIGNAL("timeout()"), lambda:self.update())
  36.         self.timer.start(1000)

  37.     '''***********更新label****************'''
  38.     def update(self):
  39.         a=random.random()
  40.         self.label.setText(str(a))
  41.         
  42.     '''*****按钮1***************'''
  43.     def bt1(self):
  44.         global flag1

  45.         if not flag1:
  46.             self.button1.setStyleSheet("background-color: red")
  47.             flag1=1
  48.         else:
  49.             self.button1.setStyleSheet("background-color: window")    # Pyqt 默认的窗体背景色是 window吗? 不确定,貌似是对的因为没报错

  50.             flag1=0

  51.             
  52.     '''*****按钮2***************'''
  53.     def bt2(self):
  54.         
  55.         global flag2
  56.         
  57.         if not flag2:
  58.             flag2=1
  59.             
  60.             t=Status_Thread(bt2_flash,self.button2)

  61.             t.start()
  62.             
  63.         else:
  64.             flag2=0

  65.    
  66.     '''*****按钮3***************'''
  67.     def bt3(self):
  68.         global flag3
  69.         
  70.         if not flag3:
  71.             flag3=1
  72.             t=Status_Thread(bt3_flash,self.button3)

  73.             t.start()
  74.         else:
  75.             flag3=0


  76. class Status_Thread(QtCore.QThread):

  77.     def __init__(self, func,key):            ##带参数(被调函数名和对象)
  78.         
  79.         super(Status_Thread, self).__init__()
  80.         self.func=func
  81.         self.key=key
  82.     def run(self):
  83.         self.func(self.key)


  84. def bt2_flash(widget):
  85.     global flag2
  86.     try:

  87.         while flag2:
  88.         
  89.             widget.setStyleSheet("background-color: blue")

  90.             time.sleep(0.5)
  91.         
  92.             widget.setStyleSheet("background-color: window")

  93.             time.sleep(0.5)
  94.     except:
  95.         pass



  96. def bt3_flash(widget):
  97.     global flag3
  98.     try:

  99.         while flag3:
  100.         
  101.             widget.setStyleSheet("background-color: green")

  102.             time.sleep(0.5)
  103.         
  104.             widget.setStyleSheet("background-color: window")

  105.             time.sleep(0.5)
  106.     except:
  107.         pass




  108.         

  109. if __name__ == '__main__':
  110.     app = QtGui.QApplication(sys.argv)
  111.    
  112.     mainwindow = Main()
  113.     mainwindow.show()
  114.    
  115.     sys.exit(app.exec_())
复制代码



您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP