如何在pyqt中循环时停止?

发布于 2025-02-12 13:57:01 字数 2926 浏览 0 评论 0原文

当我按“ x”将停止运行函数 a 计数器时,我尝试在“ x”中设计一个pyqt GUI,该怎么办?

我只知道使用以下代码

    def closeEvent(self,event):   
          pass  

逻辑代码

from PyQt5 import QtWidgets, QtGui, QtCore
from PyQt5.QtCore import *
import sys
import time
from GUI import Ui_MainWindow

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self) 
        self.thread = MyThread(self)        
        self.thread.trigger.connect(self.textBrowser)
        self.thread.start()       
           
    def textBrowser(self,a):  
       self.ui.textBrowser_4.clear()           
       self.ui.textBrowser_4.append(str(a))        
     
    def closeEvent(self,event):   
          pass  
 
    
    class MyThread(QThread):
        trigger = pyqtSignal(str) 

       def run(self):
            a = 0
            while True:     
                a = a + 1
                self.trigger.emit(str(a))
                time.sleep(1)
                

if __name__ == "__main__":   
    app = QtWidgets.QApplication([])
    MainWindow = MainWindow()    
    MainWindow.show()      
    sys.exit(app.exec_())

GUI代码

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(944, 587)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(30, 310, 181, 41))
        self.label_2.setObjectName("label_2")
        self.label_4 = QtWidgets.QLabel(self.centralwidget)
        self.label_4.setGeometry(QtCore.QRect(30, 20, 141, 21))
        self.label_4.setObjectName("label_4")
        self.textBrowser_4 = QtWidgets.QTextBrowser(self.centralwidget)
        self.textBrowser_4.setGeometry(QtCore.QRect(230, 300, 241, 61))
        self.textBrowser_4.setObjectName("textBrowser_4")
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label_2.setText(_translate("MainWindow", "counter"))

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

I tried to design a pyqt gui in when I press "x" will stop run function a counter , what should i do ?

I only know to use the following code

    def closeEvent(self,event):   
          pass  

Logic Code

from PyQt5 import QtWidgets, QtGui, QtCore
from PyQt5.QtCore import *
import sys
import time
from GUI import Ui_MainWindow

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self) 
        self.thread = MyThread(self)        
        self.thread.trigger.connect(self.textBrowser)
        self.thread.start()       
           
    def textBrowser(self,a):  
       self.ui.textBrowser_4.clear()           
       self.ui.textBrowser_4.append(str(a))        
     
    def closeEvent(self,event):   
          pass  
 
    
    class MyThread(QThread):
        trigger = pyqtSignal(str) 

       def run(self):
            a = 0
            while True:     
                a = a + 1
                self.trigger.emit(str(a))
                time.sleep(1)
                

if __name__ == "__main__":   
    app = QtWidgets.QApplication([])
    MainWindow = MainWindow()    
    MainWindow.show()      
    sys.exit(app.exec_())

GUI Code

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(944, 587)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(30, 310, 181, 41))
        self.label_2.setObjectName("label_2")
        self.label_4 = QtWidgets.QLabel(self.centralwidget)
        self.label_4.setGeometry(QtCore.QRect(30, 20, 141, 21))
        self.label_4.setObjectName("label_4")
        self.textBrowser_4 = QtWidgets.QTextBrowser(self.centralwidget)
        self.textBrowser_4.setGeometry(QtCore.QRect(230, 300, 241, 61))
        self.textBrowser_4.setObjectName("textBrowser_4")
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label_2.setText(_translate("MainWindow", "counter"))

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

送君千里 2025-02-19 13:57:01

在您的线程类中添加一个启动器和一个iS_running变量,

def __init__(self):
    self.is_running = True
           

然后使您的循环取决于此新变量的真实性:

def run(self):
    a = 0
    while self.is_running:  
         ... your logic here

最后,当您想退出CloseEvent():

self.thread.is_running = False

cheers: cheers:

Add an initiator and an is_running variable in your Thread class like so :

def __init__(self):
    self.is_running = True
           

Then make your loop depend on the truthness of this new variable :

def run(self):
    a = 0
    while self.is_running:  
         ... your logic here

And finally when you want to exit in closeEvent() :

self.thread.is_running = False

Cheers

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文