• 【多线程】python界面阻塞,白屏,not responding解决的简单例子


     1 # -*- coding: utf-8 -*-
    2
    3 import sys, time
    4 from PyQt4.QtCore import *
    5 from PyQt4.QtGui import *
    6 x = 0
    7 class Window(QWidget):
    8 def __init__(self, parent = None):
    9 QWidget.__init__(self, parent)
    10 self.thread = Worker()
    11
    12 # 提示信息
    13 self.xLable = QLabel("Number of xTimes:")
    14 # 下拉框
    15 self.spinBox = QSpinBox()
    16 self.spinBox.setMaximum(100)
    17 self.spinBox.setValue(10)
    18 self.startButton = QPushButton(self.tr("&Start"))
    19 # 布局
    20 layout = QGridLayout()
    21 layout.addWidget(self.xLable, 0, 0)
    22 layout.addWidget(self.spinBox, 0, 1)
    23 layout.addWidget(self.startButton, 0, 2)
    24 self.setLayout(layout)
    25 # 标题
    26 self.setWindowTitle(self.tr("Threading"))
    27
    28 # 信号
    29 self.connect(self.thread, SIGNAL("finished()"), self.finishSend)
    30 self.connect(self.thread, SIGNAL("update(int)"), self.updateGUIStatus)
    31 self.connect(self.startButton, SIGNAL("clicked()"), self.sendAdvMail)
    32
    33 def sendAdvMail(self):
    34 self.spinBox.setReadOnly(True)
    35 self.startButton.setEnabled(False)
    36 #传递值到线程中
    37 self.thread.render(self.spinBox.value())
    38
    39 def updateGUIStatus(self, leftTime):
    40 self.xLable.setText(str(leftTime))
    41
    42 def finishSend(self):
    43 self.spinBox.setReadOnly(False)
    44 self.startButton.setEnabled(True)
    45
    46 class Worker(QThread):
    47 def __init__(self, parent = None):
    48 QThread.__init__(self, parent)
    49 self.exiting = False
    50 self.xTimes = 0
    51
    52 def __del__(self):
    53 self.exiting = True
    54 self.wait()
    55
    56 def render(self, xTimes):
    57 self.xTimes = xTimes
    58 self.start()
    59
    60 def run(self):
    61 # Note: This is never called directly. It is called by Qt once the
    62 # thread environment has been set up.
    63 n = self.xTimes
    64 while not self.exiting and n > 0:
    65 time.sleep(1)
    66 #该信号引起界面更新
    67 n -= 1
    68 self.emit(SIGNAL("update(int)"), n)
    69
    70
    71 if __name__ == "__main__":
    72 app = QApplication(sys.argv)
    73 window = Window()
    74 window.show()
    75 sys.exit(app.exec_())


    编辑器加载中...

  • 相关阅读:
    Java中的引用
    JVM参数调优
    GCRoots
    JVM体系结构
    死锁编码及定位分析
    线程池(Java中有哪些方法获取多线程)
    Synchronized和Lock的区别
    阻塞队列BlockingQueue
    CountDownLatch/CyclicBarrier/Semaphore
    浅谈二分
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6468621.html
走看看 - 开发者的网上家园