通过外部可交换的Python脚本与连续运行的Python Gui交互

2024-05-01 22:11:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我的长期目标是为实验物理实验建立一个图形用户界面,它有一个连续运行的图形用户界面。通过按下一个按钮,我希望能够运行我选择的pyhton脚本,它可以与正在运行的gui交互。例如,将数字设定为数字调整框。 我附加了一个启动项目。一个数字调整框和一个按钮。如果按下按钮,则会在数字调整框中设置一个随机数字,一旦数字调整框中的数字发生变化,它就会打印数字。 有没有一种方法可以通过按下按钮来调用脚本(目前有一个硬编码的路径),然后将gui中的数字设置为我的选择。脚本的内容(在本例中为数字调整框设置的数字)必须在gui运行时可编辑。 如果你能提供一个例子,我将不胜感激,并可以建立其余的自己。在

提前谢谢!在

import sys
import random
from PyQt5 import QtCore, QtGui
from PyQt5.QtWidgets import QApplication, QWidget, QDoubleSpinBox, QPushButton

class GuiInteraction(QWidget):

    def __init__(self):
        super().__init__()
        self.initGUI()
        self.CallBackFunctions()

    def initGUI(self):
        self.resize(400, 500)
        self.move(300, 300)
        self.setWindowTitle('Gui Interaction')
        self.doubleSpinBox = QDoubleSpinBox(self)
        self.doubleSpinBox.setGeometry(QtCore.QRect(120, 130, 120, 25))
        self.doubleSpinBox.setDecimals(5)
        self.doubleSpinBox.setMaximum(1000)
        self.doubleSpinBox.setObjectName("doubleSpinBox")
        self.pushButton = QPushButton("Run Script", self)
        self.pushButton.setGeometry(QtCore.QRect(100, 300, 100, 40))
        self.pushButton.setObjectName("pushButton")

    def CallBackFunctions(self):
        self.pushButton.clicked.connect(self.buttonClicked)
        self.doubleSpinBox.valueChanged.connect(self.valueChanged)

    def buttonClicked(self):
        self.doubleSpinBox.setValue(random.uniform(1, 200))

    def valueChanged(self):
        print(self.doubleSpinBox.value())


if __name__ == '__main__':

        app = QApplication(sys.argv)

        MyWindow = GuiInteraction()
        MyWindow.show()

        sys.exit(app.exec_())

Tags: fromimportself脚本defsysgui数字
3条回答

我想你可以调用一个FileDialog,选择一个脚本并使用:

   mod =  __import__(path)

,而脚本应该充分构建为某种“运行”函数,您可以通过以下方式启动它:

^{pr2}$

{也检查^ a1。在

一种方法是通过stdin/stdout与外部脚本通信

我的_脚本.py

def main():
    print '4.2'

if __name__ == '__main__':
    main()

图形用户界面_脚本.py

^{pr2}$

如果需要将参数传递给函数,只需将它们作为附加参数传递给subprocess.check_output调用,然后它们从sys.argv读取它们(它们都是以字符串形式出现的,因此如果需要,您必须转换类型,或者使用像argparse这样的库,可以为您进行类型转换)。在

我选择了“无敌舰队”的解决方案,尽管我改变了一点。经过简短的研究,__import__似乎被{}库所取代,我现在使用这个库。添加了以下行:

页眉:

import importlib
import threading

在主要功能中:

^{pr2}$

我的问题由importlib行回答。我还想在一个子线程中启动脚本,因此,在它由于打字错误或其他原因而崩溃的情况下,整个gui不会跟着崩溃而崩溃。在

ExternalScript位于同一文件夹中,名为ExternalScript.py在

import random
def execute(self):
    self.doubleSpinBox.setValue(random.uniform(1, 5))

三行简单的代码。我可以在运行时更改这些行,并在数字调整框中获取不同的值。效果很好!在

相关问题 更多 >