PyQt5打开和关闭窗口

时间:2016-04-16 11:44:44

标签: python multithreading qt pyqt pyqt5

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

所以看起来工作正常。我仍然不确定杀死线程的正确方法,文档似乎声明退出()或退出()。但是......显示了另一个脚本(L79Fuel.py)中的新窗口,旧窗口被破坏了。

然后新窗口执行某些操作,并且当调用信号时,它会触发类似的功能,我想要关闭该窗口,然后重新打开第一个窗口。

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

这只是以代码0退出。我使用调试器逐步完成它,似乎正在发生的是它运行start_first,执行函数中的所有操作,然后返回第一个窗口& #39; s sys.exit(app.exec_()),执行该行,然后循环回start_first函数(第二个窗口)并一遍又一遍地重复执行该代码。

我很难过。我尽可能多地阅读,但似乎没有解决这个问题。我猜错了我在线程上做错了什么(两个窗口都有一个线程)我并没有正确地杀死线程,或者是那些线路上的东西。

2 个答案:

答案 0 :(得分:0)

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

通常,您使用quit

杀死线程
self.thread.quit()

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

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

答案 1 :(得分:0)

答案是什么? self.hide()

我正在窗口上做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()