PyQt5开闭windows

PyQt5 opening and closing windows

我用 QT Designer 创建了两个 UI windows。我有两个单独的 python 脚本,每个 UI。我想要做的是第一个脚本打开 window,创建一个线程来查找特定条件,然后在找到时打开第二个 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) 中的新 window,而旧的 window 被销毁了。

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

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

这只是以代码 0 退出。我用调试器单步执行它,似乎正在发生的事情是它运行通过 start_first,执行函数中的所有操作,然后返回到第一个 window 的 sys.exit(app.exec_()),执行该行,然后循环回到 start_first 函数(第二个 window)并再次执行该代码,在一个循环中,结束及以上。

我被难住了。我已经阅读了尽可能多的内容,但似乎没有任何内容可以解决这个问题。我猜我在线程方面做错了什么(windows 都有一个线程在运行)而且我没有正确地终止线程,或者类似的东西。

只有主线程才能创建 GUI 元素。您将无法在另一个线程中创建第二个 window。根据你问题中的两个回调槽,很难准确地看出你的程序是如何设置的。

通常,您使用 quit

终止线程
self.thread.quit()

如果需要,可以等到完全退出后再删除引用

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

答案? self.hide()

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

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()

虽然线程不是问题,但我认为最好在创建下一个 window 之前完全终止线程。 self.thread.stop() 如下所示。我意识到 .terminate() 不被推荐,但我并不是真的在线程中写或试图保存任何东西,所以我不担心它何时关闭,只担心它会关闭。

def stop(self):
    self.terminate()