Python 单击按钮时调用脚本
我有一个程序,这是一个简单的想法。首先我运行main_window.py它将打开sub_window.py这个sub_窗口有两个按钮run和Stop 单击“运行”按钮时,我需要运行hello.py脚本并关闭子窗口GUI,与单击“停止”时相同,我需要停止hello.py脚本并关闭子窗口GUI 我的当前代码给出了“NameError:name'Dialog'未定义”错误 这是main_window.py代码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
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_())