【问题标题】:Terminate thread终止线程
【发布时间】:2019-03-22 13:11:00
【问题描述】:

我在 pyqt5 上有一个应用程序。如果我点击按钮时间液晶显示器开始倒计时我创建的线程。倒计时结束后,我不能使用相同的线程进行相同的操作。如何终止该线程并通过单击按钮重新启动它

class window(QtWidgets.QMainWindow):   
   def __init__(self):      
     super(window,self).__init__()
     self.button1=QPushButton(self)
     self.lcd=QLCDNumber(self)
     self.tbutton1=threading.Thread(target=self.timing)
   def initUI(self):
       self.lcd.setVisible(False)
       self.button1.clicked.connect(self.timing)
   def timing(self):
      self.tbutton1.start()
      self.lcd.setVisible(True)
        timing=self.spin.value()
        for i in range(timing,-1,-1):
           time.sleep(1)
           if(i<10):
              self.lcd.display("00:0{}".format(i))
           else:
              self.lcd.display("00:{}".format(i))
        self.lcd.setVisible(False)
  if __name__=='__main__':       
     app=QApplication(sys.argv)
     win=window()
     sys.exit(app.exec_())

【问题讨论】:

  • 您需要向我们展示更多代码。例如,看起来按钮单击处理程序和线程操作是同一个函数,这听起来不对。
  • 在计时函数的最后一行我想杀死线程,如果我再次点击它,线程再次启动并执行所需的操作
  • 请向我们展示您当前的代码,而不是像这样的语法错误的 sn-p。
  • 所以整个代码是这样的,因为我认为没有必要全部写出来,所以人们所做的都是一样的
  • 当您使用 QT 时,我真的建议您也使用 QThread 而不是 Python 线程模块。

标签: python multithreading pyqt5


【解决方案1】:

试试看:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore    import *
from PyQt5.QtGui     import *
from PyQt5.QtWidgets import *
import threading


class window(QtWidgets.QMainWindow):   
    def __init__(self):      
        super(window,self).__init__()
        centralWidget = QWidget()
        self.setCentralWidget(centralWidget)

        self.button1 = QPushButton("Start to countdown", self)
        self.lcd     = QLCDNumber(self)
        self.spin    = QSpinBox(self)

        grid  = QGridLayout(centralWidget)
        grid.addWidget(self.lcd)
        grid.addWidget(self.spin)
        grid.addWidget(self.button1)

        self.initUI()

    def initUI(self):
#        self.lcd.setVisible(False)
        self.button1.clicked.connect(self.timing)

    def timing(self):
        self.tbutton1 = threading.Thread(target=self.timingThread)
        self.tbutton1.start()
#        self.lcd.setVisible(True)

    def timingThread(self):        
        timing=self.spin.value()
        for i in range(timing, -1, -1):
#            time.sleep(1)
            QtCore.QThread.msleep(1000)
            if(i<10):
                self.lcd.display("00:0{}".format(i))
            else:
                self.lcd.display("00:{}".format(i))
#        self.lcd.setVisible(False)


if __name__=='__main__':       
    app = QApplication(sys.argv)
    win = window()
    win.show()
    sys.exit(app.exec_())

【讨论】:

  • 问题是 time.sleep() 吗?你知道线程是如何在代码中终止的吗?
  • 您在另一条评论中说:小部件,包括窗口,不是线程安全的,只能在主线程中创建/更新,但在您的代码中:self.lcd.display("00:0{}".format(i))you从另一个线程(timingThread)更新GUI(self.lcd),你不觉得矛盾吗?
猜你喜欢
  • 1970-01-01
  • 2015-11-22
  • 2014-11-18
  • 2023-03-18
  • 1970-01-01
  • 2014-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多