【发布时间】:2019-01-18 22:41:50
【问题描述】:
我有一个 PyQt5 GUI 类,我希望能够从交互式控制台或正常运行创建多个实例。我需要这些 GUI 是非阻塞的,以便在后续代码运行时可以使用它们。
我已尝试像此答案一样为每个 GUI 在单独的线程中调用 app.exec__(),但程序有时会崩溃,因为答案的评论警告它会:
Run pyQT GUI main app in seperate Thread
现在我正试图让我根据这个答案制作的下面的代码工作:
Run Pyqt GUI main app as a separate, non-blocking process
但是当我运行它时,窗口会弹出并立即消失
import sys
from PyQt5 import QtWidgets, QtGui, QtCore
import time
class MainWindow(QtWidgets.QWidget):
def __init__(self):
# call super class constructor
super(MainWindow, self).__init__()
# build the objects one by one
layout = QtWidgets.QVBoxLayout(self)
self.pb_load = QtWidgets.QPushButton('Load')
self.pb_clear= QtWidgets.QPushButton('Clear')
self.edit = QtWidgets.QTextEdit()
layout.addWidget(self.edit)
layout.addWidget(self.pb_load)
layout.addWidget(self.pb_clear)
# connect the callbacks to the push-buttons
self.pb_load.clicked.connect(self.callback_pb_load)
self.pb_clear.clicked.connect(self.callback_pb_clear)
def callback_pb_load(self):
self.edit.append('hello world')
def callback_pb_clear(self):
self.edit.clear()
def show():
app = QtWidgets.QApplication.instance()
if not app:
app = QtWidgets.QApplication(sys.argv)
win = MainWindow()
win.show()
if __name__ == '__main__':
show()
show()
编辑 - 我看不出这个问题是如何重复的。 “重复”问题只是稍微相关,根本没有为我的问题提供解决方案。
我希望能够通过从交互式会话或脚本调用 show() 函数来创建 GUI 的多个实例(在我的示例中为 MainWindow),并且我希望这些窗口保留在我的屏幕上,而后续代码是正在运行。
EDIT2 - 当我将代码作为脚本运行时,我可以使用多处理来做我想做的事情,请参阅此演示:
https://www.screencast.com/t/5WvJNVSLm9OR
但是我仍然需要帮助,因为我希望它也可以在交互式 Python 控制台会话中工作,而多处理在这种情况下不起作用。
【问题讨论】:
-
您不需要单独的线程或进程。只需创建 一个
QApplication,然后打开多个窗口。显然,在控制台外运行时还必须调用app.exec_(),否则脚本将立即结束。 -
@ekhumoro 我在哪里调用 app.exec__() ?如果我将 app.exec__() 添加到 show() 然后它会阻塞,直到我关闭窗口。我希望能够调用 show() 两次以打开 2 个 GUI 窗口并让它们在后续代码运行时都可用
-
@ekhumoro 我希望能够在控制台会话期间通过重复调用 show() 创建任意数量的 GUI 实例,而不仅仅是 2。一旦你调用,你的代码仍然会阻塞app.exec_(),对吧?我希望在不必先关闭 GUI 的情况下运行后续代码。
-
@eyllanesc 我不想继续创建小部件。我的 GUI 类是一个电子表格,其目的是让您在使用 Pandas 进行数据分析时在 GUI 窗口中查看 Pandas DataFrames。因此,当我在控制台中输入命令时,需要打开 GUI 以供我查看。我希望我的模块被导入,然后我希望能够调用 show(df) 来弹出一个或多个电子表格,并且在运行后仍然有代码,无论是在交互式会话中还是在单个脚本中。
-
我添加了一个答案,它应该可以满足您的需求。它对我来说很好,但我只使用标准控制台进行测试,所以我不能保证它可以在所有 python IDE 中工作。
标签: python-3.x multithreading pyqt pyqt5