我正在寻找从 python 或 ipython 控制台运行 pyqt GUI 的可能性。
基本上主要的想法是使用 Pyqt GUI 就像使用 matplotlib 绘图或图像一样,您可以在其中将参数从控制台传递给 GUI 以查看数据,继续在控制台中执行操作,或者打开另一个窗口,关闭第一个,在控制台中做更多的事情等等。
我已经使用线程(在单独的线程中运行 pyQT GUI 主应用程序)实现了这个解决方案,并且正如评论中预测的那样,它在几个周期后崩溃了 python 控制台。
这是飞行员代码:
import sys
from PyQt5 import QtWidgets, QtGui, QtCore
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 mythread():
app = QtWidgets.QApplication(sys.argv)
win = MainWindow()
win.show()
app.exec_()
def show():
import threading
t = threading.Thread(target = mythread)
t.daemon = True
t.start()
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
win = MainWindow()
win.show()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)
运行该文件将正常运行 GUI。导入它然后运行 show() 将尝试以非阻塞方式从控制台运行 GUI。
有没有办法产生一个线程或进程嵌入 PyQt 应用程序,其行为类似于 matplotlib 窗口?
线程在这里无关紧要。PyQt 已经设计为在普通的 python 交互式会话中工作,因此无需执行任何特殊操作即可使其工作。
我建议您删除mythread和show函数并将它们替换为如下所示:
if QtWidgets.QApplication.instance() is None:
app = QtWidgets.QApplication(sys.argv)
Run Code Online (Sandbox Code Playgroud)
然后你可以像这样使用你的 gui 模块:
>>> from mygui import MainWindow
>>> win = MainWindow()
>>> win.show()
>>> win.callback_pb_load()
Run Code Online (Sandbox Code Playgroud)
永远不要打电话app.exec_()。PyQt 将处理事件循环本身。
| 归档时间: |
|
| 查看次数: |
3528 次 |
| 最近记录: |