Python 单击按钮时调用脚本

Python 单击按钮时调用脚本,python,pyqt5,Python,Pyqt5,我有一个程序,这是一个简单的想法。首先我运行main_window.py它将打开sub_window.py这个sub_窗口有两个按钮run和Stop 单击“运行”按钮时,我需要运行hello.py脚本并关闭子窗口GUI,与单击“停止”时相同,我需要停止hello.py脚本并关闭子窗口GUI 我的当前代码给出了“NameError:name'Dialog'未定义”错误 这是main_window.py代码 from PyQt5 import QtCore, QtGui, QtWidgets imp

我有一个程序,这是一个简单的想法。首先我运行main_window.py它将打开sub_window.py这个sub_窗口有两个按钮run和Stop

单击“运行”按钮时,我需要运行hello.py脚本并关闭子窗口GUI,与单击“停止”时相同,我需要停止hello.py脚本并关闭子窗口GUI

我的当前代码给出了“NameError:name'Dialog'未定义”错误

这是main_window.py代码

from PyQt5 import QtCore, QtGui, QtWidgets
import sub_window

class Ui_MainWindow(object):

    def sub(self):
        self.subwin = QtWidgets.QDialog()
        self.ui =  sub_window.Ui_Dialog()
        self.ui.setupUi(self.subwin)  
        self.subwin.show()

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(397, 157)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.btnClick = QtWidgets.QPushButton(self.centralwidget)
        self.btnClick.setGeometry(QtCore.QRect(100, 50, 161, 51))
        self.btnClick.setObjectName("btnClick")
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)

        ################### Butten Event ##################################
        self.btnClick.clicked.connect(self.sub)


        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Main Window"))
        self.btnClick.setText(_translate("MainWindow", "Click"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Dialog(object):

    def funRun(self):
        Dialog.hide()
        exec(open("hello.py").read())

    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(332, 108)
        self.btnRun = QtWidgets.QPushButton(Dialog)
        self.btnRun.setGeometry(QtCore.QRect(50, 40, 101, 31))
        self.btnRun.setObjectName("btnRun")
        self.btnStop = QtWidgets.QPushButton(Dialog)
        self.btnStop.setGeometry(QtCore.QRect(180, 40, 101, 31))
        self.btnStop.setObjectName("btnStop")

        self.retranslateUi(Dialog)

        ################### Butten Event ##################################
        self.btnRun.clicked.connect(self.funRun)

        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Sub Window"))
        self.btnRun.setText(_translate("Dialog", "Run"))
        self.btnStop.setText(_translate("Dialog", "Stop"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Dialog = QtWidgets.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    sys.exit(app.exec_())
这是sub_window.py代码

from PyQt5 import QtCore, QtGui, QtWidgets
import sub_window

class Ui_MainWindow(object):

    def sub(self):
        self.subwin = QtWidgets.QDialog()
        self.ui =  sub_window.Ui_Dialog()
        self.ui.setupUi(self.subwin)  
        self.subwin.show()

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(397, 157)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.btnClick = QtWidgets.QPushButton(self.centralwidget)
        self.btnClick.setGeometry(QtCore.QRect(100, 50, 161, 51))
        self.btnClick.setObjectName("btnClick")
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)

        ################### Butten Event ##################################
        self.btnClick.clicked.connect(self.sub)


        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Main Window"))
        self.btnClick.setText(_translate("MainWindow", "Click"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Dialog(object):

    def funRun(self):
        Dialog.hide()
        exec(open("hello.py").read())

    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(332, 108)
        self.btnRun = QtWidgets.QPushButton(Dialog)
        self.btnRun.setGeometry(QtCore.QRect(50, 40, 101, 31))
        self.btnRun.setObjectName("btnRun")
        self.btnStop = QtWidgets.QPushButton(Dialog)
        self.btnStop.setGeometry(QtCore.QRect(180, 40, 101, 31))
        self.btnStop.setObjectName("btnStop")

        self.retranslateUi(Dialog)

        ################### Butten Event ##################################
        self.btnRun.clicked.connect(self.funRun)

        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Sub Window"))
        self.btnRun.setText(_translate("Dialog", "Run"))
        self.btnStop.setText(_translate("Dialog", "Stop"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Dialog = QtWidgets.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    sys.exit(app.exec_())
这是hello.py代码

import time

while True:
    print("Hello")
    time.sleep(1)

首先,您不应该按照生成文件的警告来修改pyuic生成的.py,因此您必须通过再次运行pyuic命令来恢复这些文件

考虑到上述情况,您必须在实现逻辑的地方创建main.py。另一方面,使用
exec()。您还必须记住,无限循环不能在同一GUI线程中执行,因此必须在辅助线程中执行:

main.py

import time


def task():
    while True:
        print("Hello")
        time.sleep(1)
从PyQt5导入QtCore、QtGui、qtwidget
从主窗口导入Ui\u主窗口
从子窗口导入用户界面对话框
导入线程
从hello导入任务
类MainWindow(QtWidgets.QMainWindow,Ui_MainWindow):
def uuu init uuu(self,parent=None):
超级(主窗口,自我)。\uuuuu初始化\uuuuuuu(父级)
self.setupUi(self)
self.dialog=dialog()
self.btnClick.clicked.connect(self.dialog.show)
类对话框(QtWidgets.QDialog,Ui_对话框):
def uuu init uuu(self,parent=None):
超级(对话框,自我)。\uuuu初始化\uuuuu(父级)
self.setupUi(self)
self.btnRun.clicked.connect(self.run)
@QtCore.pyqtSlot()
def运行(自):
threading.Thread(target=task,daemon=True).start()
self.hide()
如果名称=“\uuuuu main\uuuuuuuu”:
导入系统
app=qtwidts.QApplication(sys.argv)
w=主窗口()
w、 show()
sys.exit(app.exec_())
你好.py

import time


def task():
    while True:
        print("Hello")
        time.sleep(1)

如果无法修改hello.py或必须使用
exec()
,则必须创建执行该任务的函数:

main.py

import time


def task():
    while True:
        print("Hello")
        time.sleep(1)
从PyQt5导入QtCore、QtGui、qtwidget
从主窗口导入Ui\u主窗口
从子窗口导入用户界面对话框
导入线程
def任务():
将open(“hello.py”)作为f:
exec(f.read())
类MainWindow(QtWidgets.QMainWindow,Ui_MainWindow):
def uuu init uuu(self,parent=None):
超级(主窗口,自我)。\uuuuu初始化\uuuuuuu(父级)
self.setupUi(self)
self.dialog=dialog()
self.btnClick.clicked.connect(self.dialog.show)
类对话框(QtWidgets.QDialog,Ui_对话框):
def uuu init uuu(self,parent=None):
超级(对话框,自我)。\uuuu初始化\uuuuu(父级)
self.setupUi(self)
self.btnRun.clicked.connect(self.run)
@QtCore.pyqtSlot()
def运行(自):
threading.Thread(target=task,daemon=True).start()
self.hide()
如果名称=“\uuuuu main\uuuuuuuu”:
导入系统
app=qtwidts.QApplication(sys.argv)
w=主窗口()
w、 show()
sys.exit(app.exec_())