鱼C论坛

 找回密码
 立即注册
查看: 2218|回复: 6

[已解决]Pyqt 线程使用

[复制链接]
发表于 2016-11-2 13:41:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
小弟弄不清楚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_())
复制代码
最佳答案
2016-11-8 20:38:38
  1. #coding:utf-8
  2. import sys
  3. import threading
  4. import time

  5. from   PyQt4 import QtCore, QtGui
  6. from   PyQt4.QtGui import QPalette,QFont
  7. import random


  8. global flag1
  9. global flag2
  10. global flag3

  11. flag1=0
  12. flag2=0
  13. flag3=0

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

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

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


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

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

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

  52.             flag1=0

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

  63.             self.t.start()
  64.             
  65.         else:
  66.             flag2=0

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

  75.             self.t.start()
  76.         else:
  77.             flag3=0


  78. class Status_Thread(QtCore.QThread):

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


  86. def bt2_flash(widget):
  87.     global flag2
  88.     try:

  89.         while flag2:
  90.         
  91.             widget.setStyleSheet("background-color: yellow")

  92.             time.sleep(0.5)
  93.         
  94.             widget.setStyleSheet("background-color: window")

  95.             time.sleep(0.5)
  96.     except:
  97.         pass



  98. def bt3_flash(widget):
  99.     global flag3
  100.     try:

  101.         while flag3:
  102.         
  103.             widget.setStyleSheet("background-color: green")

  104.             time.sleep(0.5)
  105.         
  106.             widget.setStyleSheet("background-color: window")

  107.             time.sleep(0.5)
  108.     except:
  109.         pass




  110.         

  111. if __name__ == '__main__':
  112.     app = QtGui.QApplication(sys.argv)
  113.    
  114.     mainwindow = Main()
  115.     mainwindow.show()
  116.    
  117.     sys.exit(app.exec_())

复制代码


t是局域变量,随着时间结束,进程就结束。加上了self后。程序运行正常。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-11-2 19:41:51 | 显示全部楼层
自己顶一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-3 17:00:21 | 显示全部楼层
没人回复哈,我来回复你一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-6 21:55:06 | 显示全部楼层
估计是线程结束了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-6 22:04:38 | 显示全部楼层
本帖最后由 wuyaqi45 于 2016-11-6 22:05 编辑
  1. #coding:utf-8
  2. #!/usr/bin/python
  3. # -*- coding: utf-8 -*-
  4. # -*- coding: utf-8 -*-

  5. #!/usr/bin/python
  6. # -*- coding: utf-8 -*-

  7. import sys
  8. import threading
  9. import time

  10. from   PyQt4 import QtCore, QtGui
  11. from   PyQt4.QtGui import QPalette,QFont
  12. import random


  13. global flag1
  14. global flag2
  15. global flag3

  16. flag1=0
  17. flag2=0
  18. flag3=0

  19. class Main(QtGui.QMainWindow):
  20.     def __init__(self, parent=None):
  21.         super(Main, self).__init__(parent)
  22.         
  23.         self.label=QtGui.QLabel("")       #每隔一秒刷新内容
  24.         
  25.         self.button1 = QtGui.QPushButton('Button1')   #点击颜色变红,在点击颜色变灰

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

  27.         self.button3 = QtGui.QPushButton('Button3')   #点击闪烁(绿),时间为0.5秒,再点击变灰
  28.         
  29.         central_widget = QtGui.QWidget()
  30.         central_layout = QtGui.QHBoxLayout()
  31.         central_layout.addWidget(self.label)
  32.         central_layout.addWidget(self.button1)
  33.         central_layout.addWidget(self.button2)
  34.         central_layout.addWidget(self.button3)
  35.         central_widget.setLayout(central_layout)
  36.         self.setCentralWidget(central_widget)


  37.         QtCore.QObject.connect(self.button1, QtCore.SIGNAL("clicked()"), self.bt1)
  38.         QtCore.QObject.connect(self.button2, QtCore.SIGNAL("clicked()"), self.bt2)
  39.         QtCore.QObject.connect(self.button3, QtCore.SIGNAL("clicked()"), self.bt3)
  40.         
  41.         self.timer=QtCore.QTimer()       #定时器
  42.         QtCore.QObject.connect(self.timer,QtCore.SIGNAL("timeout()"), lambda:self.update())
  43.         self.timer.start(1000)

  44.     '''***********更新label****************'''
  45.     def update(self):
  46.         a=random.random()
  47.         self.label.setText(str(a))
  48.         
  49.     '''*****按钮1***************'''
  50.     def bt1(self):
  51.         global flag1

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

  57.             flag1=0

  58.             
  59.     '''*****按钮2***************'''
  60.     def bt2(self):
  61.         
  62.         global flag2
  63.         
  64.         if not flag2:
  65.             flag2=1
  66.             
  67.             t2=threading.Thread(target = bt2_flash)

  68.             t2.start()
  69.             
  70.         else:
  71.             flag2=0

  72.    
  73.     '''*****按钮3***************'''
  74.     def bt3(self):
  75.         global flag3
  76.         
  77.         if not flag3:
  78.             flag3=1
  79.             t3=threading.Thread(target = bt3_flash)

  80.             t3.start()
  81.         else:
  82.             flag3=0


  83. class Status_Thread(QtCore.QThread):

  84.     def __init__(self, func,key):            ##带参数(被调函数名和对象)
  85.         
  86.         super(Status_Thread, self).__init__()
  87.         self.func=func
  88.         self.key=key
  89.     def run(self):
  90.         self.func(self.key)


  91. def bt2_flash():
  92.     global flag2
  93.     print 'hello'
  94.     print flag2
  95.     try:

  96.         while flag2:
  97.         
  98.             Main.button2.setStyleSheet("background-color: blue")
  99.             

  100.             time.sleep(0.5)
  101.         
  102.             Main.button2.setStyleSheet("background-color: window")

  103.             time.sleep(0.5)
  104.     except:
  105.         pass



  106. def bt3_flash():
  107.     global flag3
  108.     try:

  109.         while flag3:
  110.         
  111.             Main.button3.setStyleSheet("background-color: green")

  112.             time.sleep(0.5)
  113.         
  114.             Main.button3.setStyleSheet("background-color: window")

  115.             time.sleep(0.5)
  116.     except:
  117.         pass




  118.         

  119. if __name__ == '__main__':
  120.     app = QtGui.QApplication(sys.argv)
  121.    
  122.     mainwindow = Main()
  123.     mainwindow.show()
  124.    
  125.     sys.exit(app.exec_())
复制代码


按钮2可以调用函数2了。改色语句可能有点问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-8 20:38:38 | 显示全部楼层    本楼为最佳答案   
  1. #coding:utf-8
  2. import sys
  3. import threading
  4. import time

  5. from   PyQt4 import QtCore, QtGui
  6. from   PyQt4.QtGui import QPalette,QFont
  7. import random


  8. global flag1
  9. global flag2
  10. global flag3

  11. flag1=0
  12. flag2=0
  13. flag3=0

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

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

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


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

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

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

  52.             flag1=0

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

  63.             self.t.start()
  64.             
  65.         else:
  66.             flag2=0

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

  75.             self.t.start()
  76.         else:
  77.             flag3=0


  78. class Status_Thread(QtCore.QThread):

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


  86. def bt2_flash(widget):
  87.     global flag2
  88.     try:

  89.         while flag2:
  90.         
  91.             widget.setStyleSheet("background-color: yellow")

  92.             time.sleep(0.5)
  93.         
  94.             widget.setStyleSheet("background-color: window")

  95.             time.sleep(0.5)
  96.     except:
  97.         pass



  98. def bt3_flash(widget):
  99.     global flag3
  100.     try:

  101.         while flag3:
  102.         
  103.             widget.setStyleSheet("background-color: green")

  104.             time.sleep(0.5)
  105.         
  106.             widget.setStyleSheet("background-color: window")

  107.             time.sleep(0.5)
  108.     except:
  109.         pass




  110.         

  111. if __name__ == '__main__':
  112.     app = QtGui.QApplication(sys.argv)
  113.    
  114.     mainwindow = Main()
  115.     mainwindow.show()
  116.    
  117.     sys.exit(app.exec_())

复制代码


t是局域变量,随着时间结束,进程就结束。加上了self后。程序运行正常。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-14 12:39:02 | 显示全部楼层
@wuyaqi45,你用的是什么系统跑的? 我的系统是win7 64位机,装的是python3.4, 你改的程序在我机器上跑还是不行,会死掉,请看截图。
1.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 15:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表