Python 3.x 单击按钮时Python PyQt5终端命令执行问题

Python 3.x 单击按钮时Python PyQt5终端命令执行问题,python-3.x,terminal,pyqt5,urxvt,Python 3.x,Terminal,Pyqt5,Urxvt,我正在尝试创建一个应用程序,它可以在每次单击按钮时执行嵌入式终端命令。实际问题发生在我单击按钮时,但什么也没有发生。 我有两个脚本,一个是终端小部件,另一个是主GUI。如有任何帮助,将不胜感激 这是第一个剧本 import sys from PyQt5 import QtCore, QtWidgets class EmbTerminal(QtWidgets.QWidget): def __init__(self, parent=None): super(EmbTer

我正在尝试创建一个应用程序,它可以在每次单击按钮时执行嵌入式终端命令。实际问题发生在我单击按钮时,但什么也没有发生。 我有两个脚本,一个是终端小部件,另一个是主GUI。如有任何帮助,将不胜感激

这是第一个剧本

import sys
from PyQt5 import QtCore, QtWidgets


class EmbTerminal(QtWidgets.QWidget):

    def __init__(self, parent=None):
        super(EmbTerminal, self).__init__(parent)
        self._process = []
        self.start_process('urxvt',['-embed', str(int(self.winId())),"-e","tmux"])

    def start_process(self,prog,options):
        child = QtCore.QProcess(self)
        self._process.append(child)
        child.start(prog,options)

    def run_command(self, command = "ls" ):
        program = "tmux"
        options = []
        options.extend(["send-keys"])
        options.extend([command])
        options.extend(["Enter"])
        self.start_process(program, options)
这是第二个剧本

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Dialog(object):

    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(745, 496)
        self.tabWidget = QtWidgets.QTabWidget(Dialog)
        self.tabWidget.setGeometry(QtCore.QRect(100, 190, 561, 261))
        self.tabWidget.setObjectName("tabWidget")
        self.tab = QtWidgets.QWidget()
        self.tab.setObjectName("tab")
        self.tabWidget.addTab(EmbTerminal(), "Terminal")
        self.tab_2 = QtWidgets.QWidget()
        self.tab_2.setObjectName("tab_2")
        self.tabWidget.addTab(self.tab_2, "")
        self.pushButton = QtWidgets.QPushButton(Dialog)
        self.pushButton.setGeometry(QtCore.QRect(280, 70, 211, 71))
        self.pushButton.setObjectName("pushButton")

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

        self.pushButton.clicked.connect(lambda: EmbTerminal.run_command(EmbTerminal(), "ls"))

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("Dialog", "Tab 1"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("Dialog", "Tab 2"))
        self.pushButton.setText(_translate("Dialog", "ls"))

from terminal5 import EmbTerminal

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_())

你应该考虑以下几点:

  • 您不应该修改Qt设计器生成的代码(除非您理解其逻辑)
  • 不要在Qt设计器生成的类中实现逻辑,建议创建一个从适当的小部件继承的新类,并使用另一个类来填充它
在您的情况下,问题在于
lambda:EmbTerminal.run_命令(EmbTerminal(),“ls”)
中的EmbTerminal()对象仅在lambda运行时存在,但lambda运行时间很短,导致命令无法发送,从而导致错误

考虑到上述情况,解决方案是:

从PyQt5导入QtCore、QtGui、qtwidget
类Ui_对话框(对象):
def设置UI(自我,对话框):
setObjectName(“对话框”)
对话框。调整大小(745496)
self.tabWidget=qtwidts.QTabWidget(对话框)
self.tabWidget.setGeometry(QtCore.QRect(100190561261))
self.tabWidget.setObjectName(“tabWidget”)
self.pushButton=qtwidts.QPushButton(对话框)
自身按钮设置几何(QtCore.QRect(280、70、211、71))
self.butdown.setObjectName(“butdown”)
自重传(对话框)
QtCore.QMetaObject.connectSlotsByName(对话框)
def重新传输(自我,对话框):
_translate=QtCore.QCoreApplication.translate
setWindowTitle(_translate(“Dialog”,“Dialog”))
self.putton.setText(_translate(“Dialog”,“ls”))
从终端5导入EMB终端
类对话框(QtWidgets.QDialog,Ui_对话框):
def uuu init uuu(self,parent=None):
super()。\uuuu init\uuuu(父级)
self.setupUi(self)
self.terminal=EmbTerminal()
self.tabWidget.addTab(self.terminal,“terminal”)
self.button.clicked.connect(self.on_clicked)
@QtCore.pyqtSlot()
已单击的def(自身):
self.terminal.run_命令(“ls”)
如果名称=“\uuuuu main\uuuuuuuu”:
导入系统
app=qtwidts.QApplication(sys.argv)
w=对话框()
w、 show()
sys.exit(app.exec_())
另一方面,如果您只想发送命令,则无需存储QProcess,而是使用QProcess:startDetached并使
run\u命令
成为classmethod:

class EmbTerminal(QtWidgets.QWidget):
    # ...

    @staticmethod
    def run_command(command = "ls" ):
        program = "tmux"
        options = []
        options.extend(["send-keys"])
        options.extend([command])
        options.extend(["Enter"])
        QtCore.QProcess.startDetached(program, options)

你应该考虑以下几点:

  • 您不应该修改Qt设计器生成的代码(除非您理解其逻辑)
  • 不要在Qt设计器生成的类中实现逻辑,建议创建一个从适当的小部件继承的新类,并使用另一个类来填充它
在您的情况下,问题在于
lambda:EmbTerminal.run_命令(EmbTerminal(),“ls”)
中的EmbTerminal()对象仅在lambda运行时存在,但lambda运行时间很短,导致命令无法发送,从而导致错误

考虑到上述情况,解决方案是:

从PyQt5导入QtCore、QtGui、qtwidget
类Ui_对话框(对象):
def设置UI(自我,对话框):
setObjectName(“对话框”)
对话框。调整大小(745496)
self.tabWidget=qtwidts.QTabWidget(对话框)
self.tabWidget.setGeometry(QtCore.QRect(100190561261))
self.tabWidget.setObjectName(“tabWidget”)
self.pushButton=qtwidts.QPushButton(对话框)
自身按钮设置几何(QtCore.QRect(280、70、211、71))
self.butdown.setObjectName(“butdown”)
自重传(对话框)
QtCore.QMetaObject.connectSlotsByName(对话框)
def重新传输(自我,对话框):
_translate=QtCore.QCoreApplication.translate
setWindowTitle(_translate(“Dialog”,“Dialog”))
self.putton.setText(_translate(“Dialog”,“ls”))
从终端5导入EMB终端
类对话框(QtWidgets.QDialog,Ui_对话框):
def uuu init uuu(self,parent=None):
super()。\uuuu init\uuuu(父级)
self.setupUi(self)
self.terminal=EmbTerminal()
self.tabWidget.addTab(self.terminal,“terminal”)
self.button.clicked.connect(self.on_clicked)
@QtCore.pyqtSlot()
已单击的def(自身):
self.terminal.run_命令(“ls”)
如果名称=“\uuuuu main\uuuuuuuu”:
导入系统
app=qtwidts.QApplication(sys.argv)
w=对话框()
w、 show()
sys.exit(app.exec_())
另一方面,如果您只想发送命令,则无需存储QProcess,而是使用QProcess:startDetached并使
run\u命令
成为classmethod:

class EmbTerminal(QtWidgets.QWidget):
    # ...

    @staticmethod
    def run_command(command = "ls" ):
        program = "tmux"
        options = []
        options.extend(["send-keys"])
        options.extend([command])
        options.extend(["Enter"])
        QtCore.QProcess.startDetached(program, options)

非常感谢你宝贵的时间。我设法修改了Qt设计器生成的代码,现在它工作得很好,再次感谢你,非常感谢你宝贵的时间。我设法修改了Qt设计器生成的代码,现在工作正常,再次感谢大家。