Python 为什么在不同的方法上有不同的行为

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指出的是一个示

我想更改窗口的标题。为此,我使用了3种方法:

  • 方法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()