我想创建一个接口来控制电源电压。我用 PyQt5 设计了一个界面,其中包含我编写电压的所有字段,以及我需要应用电压、检查电压等的按钮。我想要几张桌子。这个界面看起来像这样。
我使用了
QDoubleSpinBoxes
和 QPushButton
,我希望当按下按钮时,旋转框中的值会传递到实际施加电压的函数。从那里开始,它依赖于我没有包含的 nidaqmx
库,但使用 print()
来实现它们的位置。在程序中,所有函数都在一个类中。 ui 的一个功能,以及一些其他要应用、检查等的功能。
按钮不会将数值从旋转框传递到应应用或检查电压的功能。这很奇怪,因为我正在关注来自官方 Qt 网站的 这个示例,他们使用文档中的 这种方式 做了一些非常相似的事情(检查另一个示例)。
我想提供一个清晰的 MWE,所以假设我有:一个旋转框,一个选项卡,只有两个按钮:检查和应用。
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5 import QtWidgets
# Some functions needed in every tabs
class Commands:
def __init__(self):
self.AuxVolt = [0]*16
self.BufferVolt = [0]*16
def check(self):
print(f"DC01 = {self.DC01.value():.3f} V")
def apply(self):
print(f"Applying voltages")
# Some functions from nidaqmx to control the instruments.
# Main UI class
class Ui_MainWindow(QtWidgets.QWidget,Commands): # object QtWidgets.QTabWidget
def __init__(self, parent: QtWidgets.QWidget = None):
super().__init__(parent)
self.setFixedSize(500, 400)
tabs = QtWidgets.QTabWidget()
tabs.addTab(tab1UI(),"Tab 1")
tabs.addTab(tab2UI(),"Tab 2")
RESET = QtWidgets.QPushButton('RESET')
RESET.setObjectName("RESET")
RESET.clicked.connect(self.reset)
main_layout = QtWidgets.QVBoxLayout()
main_layout.addWidget(tabs)
main_layout.addWidget(RESET)
self.setLayout(main_layout)
self.setWindowTitle("Voltage control")
class tab1UI(QtWidgets.QWidget,Commands):
def __init__(self, parent: QtWidgets.QWidget):
super().__init__(parent)
main_layout = QtWidgets.QGridLayout()
DC01 = QtWidgets.QDoubleSpinBox()
DC01.setObjectName("DC01")
DC02 = QtWidgets.QDoubleSpinBox()
DC02.setObjectName("DC02")
main_layout.addWidget(DC01,0,1)
main_layout.addWidget(DC02,1,1)
CHECK = QtWidgets.QPushButton('CHECK')
CHECK.setObjectName("CHECK")
main_layout.addWidget(CHECK,10,0)
CHECK.clicked.connect(self.check)
self.setLayout(main_layout)
class tab2UI(QtWidgets.QWidget,Commands):
def __init__(self, parent: QtWidgets.QWidget):
super().__init__(parent)
main_layout = QtWidgets.QGridLayout()
DC01 = QtWidgets.QDoubleSpinBox()
DC01.setObjectName("DC01")
DC02 = QtWidgets.QDoubleSpinBox()
DC02.setObjectName("DC02")
main_layout.addWidget(DC01,0,1)
main_layout.addWidget(DC02,1,1)
CHECK = QtWidgets.QPushButton('CHECK')
CHECK.setObjectName("CHECK")
main_layout.addWidget(CHECK,10,0)
CHECK.clicked.connect(self.check)
self.setLayout(main_layout)
# running the program
def main():
app = QtWidgets.QApplication(sys.argv)
ex = Ui_MainWindow()
ex.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
如果我按下“检查”按钮,则会出现以下错误。
print(f"DC01 = {self.DC01.value():.3f} V")
^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'value'
按下任何按钮,我都会发现类似的错误,就好像
QDoubleSpinBoxes
没有正确传递给函数一样,即使我使用 self
。
需要 使用
self
作为参数调用类
tabs.addTab(tab1UI(self),"Tab 1")
tabs.addTab(tab2UI(self),"Tab 2")
并将
QDoubleSpinBox
定义为
self.DC01 = QtWidgets.QDoubleSpinBox()
self.DC02 = QtWidgets.QDoubleSpinBox()
此外,无需使用
self
作为参数来调用小部件,例如 main_layout.addWidget(QtWidgets.QLabel(f'V',self),i,2)
。