Python 为什么在不同的方法上有不同的行为
我想更改窗口的标题。为此,我使用了3种方法:Python 为什么在不同的方法上有不同的行为,python,python-3.x,multithreading,pyqt,pyqt5,Python,Python 3.x,Multithreading,Pyqt,Pyqt5,我想更改窗口的标题。为此,我使用了3种方法: 方法1:直接调用函数 方法2:在不同线程中直接调用函数 方法3:调用包装函数中的函数,然后在另一个线程中调用该包装函数 注意:我不知道为什么我使用方法3,但令人震惊的是方法2和方法3的运行方式不同为什么? 方法2冻结了应用程序,而方法3工作得非常好我原以为两者的结果相同,但它们没有。如果有人能给出正确的解释,那将是一个很大的帮助。Qt建议不要从辅助线程修改GUI,这不是因为它不能执行,而是因为它不能保证在所有情况下都能正确操作 OP指出的是一个示
- 方法1:直接调用函数
- 方法2:在不同线程中直接调用函数
- 方法3:调用包装函数中的函数,然后在另一个线程中调用该包装函数
方法3
,但令人震惊的是方法2
和方法3
的运行方式不同为什么?
方法2
冻结了应用程序,而方法3
工作得非常好我原以为两者的结果相同,但它们没有。如果有人能给出正确的解释,那将是一个很大的帮助。Qt建议不要从辅助线程修改GUI,这不是因为它不能执行,而是因为它不能保证在所有情况下都能正确操作
OP指出的是一个示例,因为例如,代码在Linux中工作,KDE作为桌面管理器,但在Windows中不工作
建议:不要直接从另一个线程创建或修改GUI元素。在使用方法2的linux中,我看不到任何GUI元素freezing@eyllanesc您的代码是否与方法2完美地运行(更改了标题并且没有冻结)?因为我在windows上,只有方法3能够处理如何修改gui元素的问题,如果需要连续运行两个线程(主gui线程和函数线程,以及基于函数线程,需要修改gui元素)。例如:基于其他线程设置
setVisible(真/假)
。@EctoRuseff然后使用信号。看到这个了吗
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys, time, threading
class Main_(QMainWindow):
def __init__(self, *args, **kwargs):
super(Main_, self).__init__(*args, **kwargs)
self.resize(QSize(300, 250))
self.show()
def change_window_title(self, title):
self.setWindowTitle(title)
def fctn(title_fctn):
print('START')
time.sleep(5)
title_fctn('Test')
print('DONE')
app = QApplication(sys.argv)
window = Main_()
# Method 1
fctn(window.change_window_title)
# Method 2
threading.Thread(
target=lambda: window.change_window_title('test')
).start()
# Method 3
threading.Thread(
target=lambda: fctn(window.change_window_title)
).start()
app.exec()