【问题标题】:PyQt5 opening and closing windowsPyQt5 打开和关闭窗口
【发布时间】:2016-08-08 09:43:36
【问题描述】:

我有两个使用 QT Designer 创建的 UI 窗口。每个 UI 都有两个单独的 python 脚本。我想要做的是第一个脚本打开一个窗口,创建一个寻找特定条件的线程,然后在找到时打开第二个 UI。然后第二个 UI 创建一个线程,完成后打开第一个 UI。

这似乎工作正常,这是调用信号时触发的部分代码:

def run_fuel(self):
    self.st_window = L79Fuel.FuelWindow(self)
    self.thread.exit()
    self.st_window.show()
    self.destroy()

所以这似乎工作正常。我仍然不确定终止线程的正确方法,文档似乎声明了 exit() 或 quit()。但是...显示来自另一个脚本(L79Fuel.py)的新窗口并且旧窗口被破坏。

然后新窗口做一些事情,当一个信号被调用时,它会触发一个类似的函数,我想关闭那个窗口,然后重新打开第一个窗口。

def start_first(self):
    self.r_window = L79Tools.FirstWindow(self)
    self.thread.exit()
    self.r_window.show()
    self.destroy()

这只是以代码 0 退出。我用调试器逐步完成了它,似乎正在发生的事情是它运行通过 start_first,在函数中执行所有操作,然后返回到第一个窗口的 @987654324 @,执行该行,然后循环回到 start_first 函数(第二个窗口)并再次执行该代码,循环,一遍又一遍。

我被难住了。我已经阅读了尽可能多的内容,但似乎没有任何内容可以解决这个问题。我猜我在线程方面做错了(两个窗口都有一个线程)并且我没有正确地杀死线程,或者类似的东西。

【问题讨论】:

    标签: python multithreading qt pyqt pyqt5


    【解决方案1】:

    只有主线程可以创建 GUI 元素。您将无法在另一个线程中创建第二个窗口。根据您问题中的两个回调槽,很难确切地看到您的程序是如何设置的。

    通常,您使用quit 杀死线程

    self.thread.quit()
    

    如果你愿意,你可以等到它完全退出再删除引用

    self.thread.wait()
    self.thread = Nonee
    

    【讨论】:

    • 很可能,您通过不在其他线程中的函数创建它们,即使它们是从其他线程触发的
    • 我找到了答案。其实很简单。我会发布并标记它。
    【解决方案2】:

    答案? self.hide()

    我在 windows 上做self.destroy 以摆脱它们,但我没有意识到这也导致程序启动进程完全退出。所以看起来答案是杀死线程,然后简单地.hide()窗口。现在,每个窗口都会在启动和停止线程时多次打开和关闭,如果需要的话。新代码(各功能基本相同)如下:

    def run_race(self):
        self.thread.stop()
        self.thread.wait()
        self.thread = None
        self.r_window = L79Race.RaceWindow(self)
        self.r_window.show()
        self.hide()
    

    虽然线程不是问题,但我认为最好在创建下一个窗口之前完全终止线程。 self.thread.stop() 如下所示。我意识到不推荐.terminate(),但我并没有真正在线程中编写或尝试保存任何内容,所以我不担心它何时关闭,只是它确实如此。

    def stop(self):
        self.terminate()
    

    【讨论】:

      猜你喜欢
      • 2018-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多