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