【问题标题】:Why the different behavior on different approach为什么不同方法的不同行为
【发布时间】:2021-03-08 07:41:21
【问题描述】:
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()

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

  • 方法一:直接调用函数
  • 方法二:在不同的线程中直接调用函数
  • 方法 3: 在包装函数中调用该函数,然后在不同的线程中调用该包装函数。

注意:我不知道我为什么使用method 3,但令人震惊的是为什么method 2method 3 运行方式不同。 为什么?

Method 2 冻结了应用程序,而Method 3 工作完全正常。 我认为两者都会给出相同的结果,但事实并非如此。如果有人能给出适当的解释,那将是一个很大的帮助。

【问题讨论】:

  • 在 linux 中使用方法 2 我没有看到任何冻结
  • @eyllanesc 您的代码是否使用方法 2 完美运行(更改了标题并且没有冻结)?因为我在windows上,只有方法3有效

标签: python python-3.x multithreading pyqt pyqt5


【解决方案1】:

Qt 建议不要从辅助线程修改 GUI,这不是因为它无法执行,而是它不能保证在所有情况下都能正确操作。

OP 指出的是它的一个示例,因为例如该代码在 Linux 中工作,KDE 作为桌面管理器,但在 Windows 中不工作。

建议:不要直接从另一个线程创建或修改 GUI 元素。

【讨论】:

  • 如何修改gui元素,如果需要连续运行两个线程,(主gui线程和一个函数线程,基于函数线程,需要修改一个gui元素)。例如:基于其他线程设置setVisible(True/False)
  • @EctoRuseff 然后使用信号。看到这个stackoverflow.com/a/66268548/6622587
猜你喜欢
  • 1970-01-01
  • 2016-10-31
  • 2020-04-27
  • 2019-02-12
  • 2014-01-13
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
  • 2012-07-01
相关资源
最近更新 更多