Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用线程时Pyqt5 GUI仍然挂起_Python_Python 3.x_Pyqt_Pyqt5 - Fatal编程技术网

Python 使用线程时Pyqt5 GUI仍然挂起

Python 使用线程时Pyqt5 GUI仍然挂起,python,python-3.x,pyqt,pyqt5,Python,Python 3.x,Pyqt,Pyqt5,我不熟悉python和pyqt。 我正在学习如何使用GUI线程 我遵循了这个教程 我将for循环更改为无限while循环(增加“I”) 如果我执行程序,GUI仍然挂起,但是如果我删除循环中的发射信号,它就不再挂起 是否有一些技巧可以让它不挂起?我认为你在两件事上被否决了: 您只复制并粘贴了教程中的代码 你没有读教程 在本教程中,作者指出: 在上面的示例中,我们创建了QPushbutton和QTextEdit。单击该按钮时,它将创建一个从0到9计数的新线程,并发出信号,以便在QTextEdit中

我不熟悉python和pyqt。 我正在学习如何使用GUI线程

我遵循了这个教程

我将for循环更改为无限while循环(增加“I”)

如果我执行程序,GUI仍然挂起,但是如果我删除循环中的发射信号,它就不再挂起


是否有一些技巧可以让它不挂起?

我认为你在两件事上被否决了:

  • 您只复制并粘贴了教程中的代码
  • 你没有读教程
  • 在本教程中,作者指出:

    在上面的示例中,我们创建了QPushbutton和QTextEdit。单击该按钮时,它将创建一个从0到9计数的新线程,并发出信号,以便在QTextEdit中追加数字和数据。类内通信信号初始化为pyqtSignal(int,str)。这个int和str意味着当信号发出时,它还将传递两个参数,第一个参数是整数类型,第二个参数是字符串类型

    通过将循环更改为
    而为true
    ,可以继续发出信号并将文本附加到QTextEdit中。可能不是你想要的。
    另外,在内部注释
    emit
    语句将继续运行while循环。

    while True
    将在后台执行无休止的循环

    从PyQt5.QtCore导入*
    从PyQt5.QtWidgets导入*
    导入系统
    导入线程
    从上次导入时
    类通信(QObject):
    信号=pyqtSignal(int,str)
    类My_Gui(QWidget):
    定义初始化(自):
    super()。\uuuu init\uuuuu()
    self.comm=Communicate()
    self.comm.signal.connect(self.append_数据)
    self.initUI()
    def initUI(self):
    btn_count=QPushButton('count')
    btn\u计数。单击。连接(自启动\u计数)
    self.te=QTextEdit()
    vbox=QVBoxLayout()
    vbox.addWidget(btn_计数)
    vbox.addWidget(self.te)
    self.setLayout(vbox)
    self.setWindowTitle('PyQT5'中的多线程)
    self.setGeometry(400400400400)
    self.show()
    def计数(自身、通信):
    对于范围(10)内的i:
    data=“data”+str(一)
    通信信号发射(i,数据)
    #而下面的True将永远不会停止并导致程序卡住
    '''
    i=0
    尽管如此:
    data=“data”+str(一)
    通信信号发射(i,数据)
    i+=1
    '''
    def开始计数(自身):
    my_Thread=threading.Thread(target=self.count,args=(self.comm,))
    my_Thread.start()
    def附加_数据(self、num、data):
    self.te.append(str(num)+“”+数据)
    如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
    app=QApplication(sys.argv)
    my_gui=my_gui()
    sys.exit(app.exec_())
    
    请解释我的问题出了什么问题,不要投反对票。是因为我的问题太基本了吗?嗨,我读了教程,已经理解了,但我不知道为什么它挂起了。我没有复制所有的代码,我修改了循环代码。在Java中,可以使用invokeLater从后台线程更新UI,我认为“emit”在python中是等效的。使用相同的逻辑在Java中测试线程,我只想知道为什么它挂起在python中。“发射”是否有一些限制?或者这个例子是错误的?这就是我问的原因。对于Java和Python/PyQt,更新GUI的工作方式不同。请看这里:
    from PyQt5.QtCore import *
    from PyQt5.QtWidgets import *
    import sys
    import threading
    from _ast import While
    
    class Communicate(QObject):
        signal = pyqtSignal(int, str)
    
    class My_Gui(QWidget):
        def __init__(self):
            super().__init__()
    
            self.comm = Communicate()
            self.comm.signal.connect(self.append_data)
            self.initUI()
    
        def initUI(self):
    
            btn_count = QPushButton('Count')
            btn_count.clicked.connect(self.start_counting)
            self.te = QTextEdit()
    
            vbox = QVBoxLayout()
            vbox.addWidget(btn_count)
            vbox.addWidget(self.te)
    
            self.setLayout(vbox)
            self.setWindowTitle('MultiThreading in PyQT5')
            self.setGeometry(400, 400, 400, 400)
            self.show()
    
        def count(self, comm):
            '''
            for i in range(10):
                data = "Data "+str(i)
                comm.signal.emit(i, data)
            '''
            i = 0
            while True:
                data = "Data "+str(i)
                comm.signal.emit(i, data)
                i+=1
    
        def start_counting(self):
            my_Thread = threading.Thread(target=self.count, args=(self.comm,))
            my_Thread.start()
    
        def append_data(self, num, data):
            self.te.append(str(num) + " " + data)
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        my_gui = My_Gui()
        sys.exit(app.exec_())