如何在pyqt5 ui小部件代码中使用python脚本

Posted

技术标签:

【中文标题】如何在pyqt5 ui小部件代码中使用python脚本【英文标题】:how to use python script in pyqt5 ui widget code 【发布时间】:2018-06-27 06:22:02 【问题描述】:

我有一个 pyhton 脚本,其中包含如下代码,并且 .ui 文件转换为 .py 文件。现在我想在 gui 小部件的小部件代码中执行 python 脚本? 请帮助我如何做到这一点。

from PyQt5 import QtCore, QtGui, QtWidgets
import DC_gimbal as backend
import hudsup as hp

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(978, 600)
        self.hudsup = hudsup()
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(0, 0, 291, 261))
        self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")

        self.Heads_up = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
        self.Heads_up.setContentsMargins(0, 0, 0, 0)
        self.Heads_up.setObjectName("Heads_up")
        self.widget = QtWidgets.QWidget(self.verticalLayoutWidget)
        self.widget.setObjectName("widget")
        self.HeadsWidget = QtWidgets.QWidget(self.widget)
        self.HeadsWidget.setGeometry(QtCore.QRect(0, 0, 291, 261))
        self.HeadsWidget.setObjectName("HeadsWidget")
        self.Heads_up.addWidget(self.widget)
        self.Heads_up.addWidget(self.huds_Up())

        self.verticalLayoutWidget_2 = QtWidgets.QWidget(self.centralwidget)
        self.verticalLayoutWidget_2.setGeometry(QtCore.QRect(0, 260, 291, 291))
        self.verticalLayoutWidget_2.setObjectName("verticalLayoutWidget_2")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget_2)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")

        self.widget_3 = QtWidgets.QWidget(self.verticalLayoutWidget_2)
        self.widget_3.setObjectName("widget_3")
        self.displayWidget = QtWidgets.QWidget(self.widget_3)
        self.displayWidget.setGeometry(QtCore.QRect(0, 0, 291, 281))
        self.displayWidget.setObjectName("displayWidget")
        self.verticalLayout.addWidget(self.widget_3)

        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(500, 10, 93, 28))
        self.pushButton.setObjectName("connect")
        self.pushButton.clicked.connect(backend.Noctua_initialise())

        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(620, 10, 93, 28))
        self.pushButton_2.setObjectName("pushButton_2")

        self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_3.setGeometry(QtCore.QRect(740, 10, 93, 28))
        self.pushButton_3.setObjectName("pushButton_3")
        self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
        self.tabWidget.setGeometry(QtCore.QRect(290, 330, 561, 211))
        self.tabWidget.setObjectName("tabWidget")
        self.tab = QtWidgets.QWidget()
        self.tab.setObjectName("tab")
        self.tabWidget.addTab(self.tab, "")
        self.tab_2 = QtWidgets.QWidget()
        self.tab_2.setObjectName("tab_2")
        self.tabWidget.addTab(self.tab_2, "")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 978, 26))
        self.menubar.setObjectName("menubar")
        self.menuconnect = QtWidgets.QMenu(self.menubar)
        self.menuconnect.setObjectName("menuconnect")
        self.menuDisconnect = QtWidgets.QMenu(self.menubar)
        self.menuDisconnect.setObjectName("menuDisconnect")
        self.menuMode = QtWidgets.QMenu(self.menubar)
        self.menuMode.setObjectName("menuMode")
        self.menuSensors = QtWidgets.QMenu(self.menubar)
        self.menuSensors.setObjectName("menuSensors")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.actionLIDAR = QtWidgets.QAction(MainWindow)
        self.actionLIDAR.setObjectName("actionLIDAR")
        self.actionOpen_CV = QtWidgets.QAction(MainWindow)
        self.actionOpen_CV.setObjectName("actionOpen_CV")
        self.actionManual = QtWidgets.QAction(MainWindow)
        self.actionManual.setObjectName("actionManual")
        self.actionAuto = QtWidgets.QAction(MainWindow)
        self.actionAuto.setObjectName("actionAuto")
        self.actionSettings = QtWidgets.QAction(MainWindow)
        self.actionSettings.setObjectName("actionSettings")
        self.actionCalib = QtWidgets.QAction(MainWindow)
        self.actionCalib.setObjectName("actionCalib")
        self.actionDisconnect = QtWidgets.QAction(MainWindow)
        self.actionDisconnect.setObjectName("actionDisconnect")
        self.menuconnect.addAction(self.actionDisconnect)
        self.menuDisconnect.addAction(self.actionSettings)
        self.menuDisconnect.addAction(self.actionCalib)
        self.menuMode.addAction(self.actionManual)
        self.menuMode.addAction(self.actionAuto)
        self.menuSensors.addAction(self.actionLIDAR)
        self.menuSensors.addAction(self.actionOpen_CV)
        self.menubar.addAction(self.menuconnect.menuAction())
        self.menubar.addAction(self.menuDisconnect.menuAction())
        self.menubar.addAction(self.menuMode.menuAction())
        self.menubar.addAction(self.menuSensors.menuAction())

        self.retranslateUi(MainWindow)
        self.tabWidget.setCurrentIndex(1)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "PushButton"))
        self.pushButton_2.setText(_translate("MainWindow", "PushButton"))
        self.pushButton_3.setText(_translate("MainWindow", "PushButton"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "Tab 1"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Tab 2"))
        self.menuconnect.setTitle(_translate("MainWindow", "connect"))
        self.menuDisconnect.setTitle(_translate("MainWindow", "configure"))
        self.menuMode.setTitle(_translate("MainWindow", "Mode"))
        self.menuSensors.setTitle(_translate("MainWindow", "Sensors"))
        self.actionLIDAR.setText(_translate("MainWindow", "LIDAR"))
        self.actionOpen_CV.setText(_translate("MainWindow", "Open CV"))
        self.actionManual.setText(_translate("MainWindow", "Manual"))
        self.actionAuto.setText(_translate("MainWindow", "Auto"))
        self.actionSettings.setText(_translate("MainWindow", "Settings"))
        self.actionCalib.setText(_translate("MainWindow", "Calib"))
        self.actionDisconnect.setText(_translate("MainWindow", "Disconnect"))


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

这是我的 gui 代码,我想在 headwidget 中添加以下文件,文件名为 hudsup.py:

import sys

import math

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

def rec_line_cord(i,list,xc,origin_list,pitch,roll):
    .
    .

def rec_drawLine(self,i,list,painter,roll,metrics):
    .
    .
    .


def drawMarkings(self, painter):

    .
    .
    .

def drawNeedle(self, painter,roll):

    .
    .
    .

def Compass(self,painter,yaw,r):
  .
  .
  .



class Manager(QObject):
    changedValue = pyqtSignal(tuple)
    def __init__(self):
        QObject.__init__(self)
        filename = "Attitude_data_Manual_1232018_1158.txt"
        res = self.read_content(filename)
        self.results = zip(*res)

        self.timer = QTimer(self)
        self.timer.timeout.connect(self.update_value)
        self.timer.start(100)

    @pyqtSlot()
    def update_value(self):
        try:
            self.changedValue.emit(next(self.results))
        except StopIteration:
            self.timer.stop()


    def read_content(self, filename):
        .
        .
        .

class Widget(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)
        self.v = None

    @pyqtSlot(tuple)
    def update_value(self, v):
        self.v = v
        self.update()

    def paintEvent(self, event):
        QWidget.paintEvent(self, event)
        painter = QPainter(self)
        r = self.rect()

        .
        .


if __name__ == '__main__':
    app = QApplication(sys.argv)
    manager = Manager()
    w = Widget()
    manager.changedValue.connect(w.update_value)
    w.show()
    sys.exit(app.exec_())

这是我的 python 脚本示例。 这是 hudsup.py 输出: animated huds_up display

我的用户界面看起来像这样,我希望我的 hudsup 像上面提到的那样显示: Gui

【问题讨论】:

【参考方案1】:

您不应该直接使用生成的代码,而是创建一个新的小部件类并从它继承:

class MainWindow(Ui_MainWindow, QMainWindow):
    def __init__(self):
        Ui_MainWindow.__init__(self)
        QMainWindow.__init__(self)

        self.setupUi(self)

要集成您的第二个小部件,您可以像现在一样将其添加到Heads_up,但不需要调用exec_

        self.hud_sup = HudSup()
        self.Heads_up.addWidget(self.hud_sup)

【讨论】:

是的,我发布的这段代码应该可以工作,你试过了吗? 不,它不起作用..我收到此错误:回溯(最近一次调用最后一次):文件“layproject.py”,第 142 行,在 ui.setupUi(MainWindow) 文件中“ layproject.py",第 17 行,在 setupUi self.hudsup = hudsup() NameError: name 'hudsup' is not defined 你的班级名称是 hudsup 吗? hudsup.py 是我的 python 脚本文件名。 是的,但是里面有类吗?您需要知道小部件的名称。如果您将整个源代码发布在某个地方,我可以看看。

以上是关于如何在pyqt5 ui小部件代码中使用python脚本的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PyQt5 Python 中更改表格小部件中滚动条的颜色

在 pyqt5 小部件中更新 matplotlib

如何在PyQt5中叠加小部件?

在pyqt5中单击登录按钮时获取小部件未定义错误

PyQt5 QWidget不填充父

使用 PyQt5 在 Qt Designer 中的自定义(升级)小部件中获取另一个小部件的当前值