python - PyQt5 从多个 Qwidget 读取值并转换为类
问题描述
为了进行一些计算,我需要读取一些信息值,这些信息值由用户在不同的小部件上设置,并且值应该稍后通过单击按钮传递给一个类。该类激活并计算一些数据,然后将该数据传递给其他一些小部件以进行绘图或写入....
在开始上课之前,我们还需要在缺少一个或多个数据时进行标记。
可视化:
图 1:用户单击按钮,然后它继续从多个 Widget 选项卡读取值并将这些数据传递给一个类。
图 2:通常由用户设置以供进一步阅读的信息。
图 3:通常由用户设置用于阅读的信息。
图 4:通常由用户设置以供阅读的信息。
图 5:通常由用户设置用于阅读的信息。
整个代码:
import sys
from PyQt5 import QtCore, QtWidgets, QtGui
class Tabwidget(QtWidgets.QWidget):
def __init__(self, parent=None):
super( Tabwidget, self).__init__()
self.setFixedSize(400, 230)
tab = QtWidgets.QTabWidget()
self.geometry = firsttab()
self.roundsection = self.geometry
self.A = ClassA()
self.B = ClassB()
self.C = ClassC()
tab.addTab(self.geometry,'A')
tab.addTab(self.A,'B')
tab.addTab(self.B,'C')
tab.addTab(self.C, 'D')
tab.addTab(LoadTable(), 'E')
tab.setFont(QtGui.QFont("Georgia",9,QtGui.QFont.Normal))
vboxlayout = QtWidgets.QVBoxLayout()
vboxlayout.addWidget(tab)
self.setLayout(vboxlayout)
class firsttab(QtWidgets.QWidget):
valueChanged = QtCore.pyqtSignal(int)
valuesChanged = QtCore.pyqtSignal(int, int)
def __init__(self, parent=None):
super(firsttab, self).__init__(parent)
font = QtGui.QFont("Georgia",8,QtGui.QFont.Normal)
sectiontypegroupbox = QtWidgets.QGroupBox('&Type',self)
sectiontypegroupbox.setFont(QtGui.QFont("Georgia",10,QtGui.QFont.Normal))
tab1button = QtWidgets.QPushButton('')
circularlabel = QtWidgets.QLabel("Calculate",self)
circularlabel.setSizePolicy(QtWidgets.QSizePolicy.Expanding,QtWidgets.QSizePolicy.Expanding)
circularlabel.setFont(font)
circularlay = QtWidgets.QHBoxLayout()
circularlay.addWidget(tab1button)
circularlay.addWidget(circularlabel)
vboxlayout = QtWidgets.QVBoxLayout()
vboxlayout.addLayout(circularlay)
vboxlayout.setSizeConstraint(vboxlayout.SetFixedSize)
vboxlayout.setContentsMargins(25,25,25,25)
sectiontypegroupbox.setLayout(vboxlayout)
hboxlayout = QtWidgets.QHBoxLayout()
hboxlayout.addWidget(sectiontypegroupbox)
self.setLayout(hboxlayout)
# self.button = Calculate()
# tab1button.clicked.connect(self.button.parse_file)
class ClassA(QtWidgets.QWidget):
def __init__(self, parent=None):
super(ClassA, self).__init__(parent)
self.setFont(QtGui.QFont("Helvetica", 10, QtGui.QFont.Normal, italic=False))
self.c_lay = QtWidgets.QHBoxLayout()
fctd = "One\n\nTwo\n\nThree"
con_strength = QtWidgets.QLabel(fctd)
self.value = QtWidgets.QLineEdit('Test')
self.c_lay.addWidget(con_strength)
self.c_lay.addWidget(self.value, alignment=QtCore.Qt.AlignRight)
self.combo = QtWidgets.QComboBox()
self.combo.addItems(["10","12","14","16"])
self.hbox = QtWidgets.QHBoxLayout()
self.con = QtWidgets.QLabel("Number: ")
self.hbox.addWidget(self.con)
self.hbox.addWidget(self.combo)
self.vlay = QtWidgets.QVBoxLayout()
self.vlay.addLayout(self.hbox)
self.vlay.addLayout(self.c_lay)
self.vlay.addStretch()
Concrete_Group = QtWidgets.QGroupBox()
Concrete_Group.setTitle("&GroupA")
Concrete_Group.setLayout(self.vlay)
lay = QtWidgets.QVBoxLayout(self)
lay.addWidget(Concrete_Group)
self.comth = ["10","12","14","16"]
self.combo.activated.connect(self.setdatastrength)
@QtCore.pyqtSlot(int)
def setdatastrength(self, index):
value = self.comth[index]
self.display_data(value)
def display_data(self, value):
try:
f = value
f_value = "{}"
self.value.setText(f_value.format(f))
except ValueError:
print("Error")
class ClassB(QtWidgets.QWidget):
def __init__(self, parent=None):
super(ClassB, self).__init__(parent)
self.setFont(QtGui.QFont("Helvetica", 10, QtGui.QFont.Normal, italic=False))
self.combo_exclass = QtWidgets.QComboBox()
self.combo_exclass.addItems([" Very dry area"," Dry or permanently wet"," Wet, rarely dry"," Moderate humidity"," Tidal splash & spray zones"])
self.combo_lclass = QtWidgets.QComboBox()
self.combo_lclass.addItems(["L2","L4","L6","L8"])
self.combo_vct = QtWidgets.QComboBox()
self.combo_vct.addItems(["0.10","0.20","0.30","0.40",
"0.50","0.60","0.70"])
self.combo_in = QtWidgets.QComboBox()
self.combo_in.addItems(["Class1","Class2","Class3"])
self.tbox = QtWidgets.QHBoxLayout()
self.exclass = QtWidgets.QLabel("Class1: ")
self.tbox.addWidget(self.exclass)
self.tbox.addWidget(self.combo_exclass)
self.mtbox = QtWidgets.QHBoxLayout()
self.lclass = QtWidgets.QLabel("Class2: ")
self.mtbox.addWidget(self.lclass)
self.mtbox.addWidget(self.combo_lclass)
self.mbbox = QtWidgets.QHBoxLayout()
self.vct = QtWidgets.QLabel("Class3: ")
self.mbbox.addWidget(self.vct)
self.mbbox.addWidget(self.combo_vct)
self.bbox = QtWidgets.QHBoxLayout()
self.inl = QtWidgets.QLabel("Class4: ")
self.bbox.addWidget(self.inl)
self.bbox.addWidget(self.combo_in)
self.grid = QtWidgets.QGridLayout()
self.grid.addLayout(self.tbox, 0, 0, 1, 2)
self.grid.addLayout(self.mtbox, 1, 0)
self.grid.addLayout(self.mbbox, 2, 0)
self.grid.addLayout(self.bbox, 3, 0)
Environment_Group = QtWidgets.QGroupBox()
Environment_Group.setTitle("&Group2")
Environment_Group.setLayout(self.grid)
vlay = QtWidgets.QVBoxLayout(self)
vlay.addWidget(Environment_Group)
class ClassC(QtWidgets.QWidget):
def __init__(self, parent=None):
super(ClassC, self).__init__(parent)
self.setFont(QtGui.QFont("Helvetica", 10, QtGui.QFont.Normal, italic=False))
filenameLabel = QtWidgets.QLabel("Name number:")
fileNameEdit = QtWidgets.QLineEdit()
ftablayout = QtWidgets.QVBoxLayout()
ftablayout.addWidget(filenameLabel)
ftablayout.addWidget(fileNameEdit)
self.setLayout(ftablayout)
class LoadTable(QtWidgets.QTableWidget):
def __init__(self, parent=None):
super(LoadTable, self).__init__(1, 3, parent)
self.setFont(QtGui.QFont("Helvetica", 10, QtGui.QFont.Normal, italic=False))
headertitle = ("A","B","C")
self.setHorizontalHeaderLabels(headertitle)
self.verticalHeader().hide()
self.horizontalHeader().setHighlightSections(False)
self.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Fixed)
self.setSelectionMode(QtWidgets.QAbstractItemView.NoSelection)
self.setColumnWidth(0, 130)
combox_lay = QtWidgets.QComboBox(self)
combox_lay.addItems(["I","II"])
self.setCellWidget(0, 2, combox_lay)
class Calculate():
def __init__(self,a,b,c,d,e,f,g):
self.x_value = None
self.a_frc = None
self.b_cap = None
self.bsst = None
self.tsst = None
self.bsst = None
self.tsstr = None
self.parse_file(a,b,c,d,e,f,g)
def parse_file(self,a,b,c,d,e,f,g):
#all the code for calculation where:
pass
self.x_value = '{:.3f}'.format(a)
self.a_frc = '{:.3f}'.format(b)
self.b_cap = '{:.3f}'.format(c)
self.bsst = '{:.3f}'.format(d)
self.tsst = '{:.3f}'.format(e)
self.bsst = '{:.3f}'.format(f)
self.tsstr = '{:.3f}'.format(g)
def __str__(self):
return ('\nx value: {0} \nAforce: {1} \nb capacity : {2} \nBottom strain : {3} '
'\nTop strain : {4} \nBottom stress :{5} \nTop stress : {6}'
.format(self.x_value, self.a_frc, self.b_cap, self.bsst, self.tsst, self.bsst, self.tsstr))
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = Tabwidget()
w.show()
sys.exit(app.exec_())
谢谢你的帮助。
解决方案
既然你没有指出你想得到什么,我就指出一般的方法:你必须有一个获取数据的方法:
class Some_Widget(FooWidget):
# ...
def get_data(self):
return some_values
在 FirstTab 的情况下,我不理解您创建的信号,恕我直言,我认为您只需要一个称为 clicked 的信号,该信号在传输按钮的单击信号并将其传输到数据的主窗口时发出访问。
另一方面,删除该{:.3f}
部分,因为数据不是数字而是字符串(也许您必须将它们转换为字符串,但由于没有详细信息,仅此而已)所以我将其打印出来
考虑到上述情况并假设几件事,因为您没有指出任何具体的内容,因此以下代码是一个可能的解决方案:
import sys
from PyQt5 import QtCore, QtWidgets, QtGui
class Tabwidget(QtWidgets.QWidget):
def __init__(self, parent=None):
super( Tabwidget, self).__init__()
self.setFixedSize(400, 230)
tab = QtWidgets.QTabWidget()
self.geometry = FirstTab()
self.geometry.clicked.connect(self.on_clicked)
self.A = ClassA()
self.B = ClassB()
self.C = ClassC()
self.load_table = LoadTable()
tab.addTab(self.geometry,'A')
tab.addTab(self.A,'B')
tab.addTab(self.B,'C')
tab.addTab(self.C, 'D')
tab.addTab(self.load_table, 'E')
tab.setFont(QtGui.QFont("Georgia",9,QtGui.QFont.Normal))
vboxlayout = QtWidgets.QVBoxLayout()
vboxlayout.addWidget(tab)
self.setLayout(vboxlayout)
self._calculate = Calculate()
def on_clicked(self):
d1 = self.A.get_data()
d2 = self.B.get_data()
d3 = self.C.get_data()
d4 = self.load_table.get_data()
self._calculate.parse_file(*d1, *d2, *d3, *d4)
class FirstTab(QtWidgets.QWidget):
clicked = QtCore.pyqtSignal()
def __init__(self, parent=None):
super(FirstTab, self).__init__(parent)
font = QtGui.QFont("Georgia",8,QtGui.QFont.Normal)
sectiontypegroupbox = QtWidgets.QGroupBox('&Type',self)
sectiontypegroupbox.setFont(QtGui.QFont("Georgia",10,QtGui.QFont.Normal))
tab1button = QtWidgets.QPushButton()
circularlabel = QtWidgets.QLabel("Calculate",self)
circularlabel.setSizePolicy(QtWidgets.QSizePolicy.Expanding,QtWidgets.QSizePolicy.Expanding)
circularlabel.setFont(font)
circularlay = QtWidgets.QHBoxLayout()
circularlay.addWidget(tab1button)
circularlay.addWidget(circularlabel)
vboxlayout = QtWidgets.QVBoxLayout()
vboxlayout.addLayout(circularlay)
vboxlayout.setSizeConstraint(vboxlayout.SetFixedSize)
vboxlayout.setContentsMargins(25,25,25,25)
sectiontypegroupbox.setLayout(vboxlayout)
hboxlayout = QtWidgets.QHBoxLayout(self)
hboxlayout.addWidget(sectiontypegroupbox)
tab1button.clicked.connect(self.clicked)
class ClassA(QtWidgets.QWidget):
def __init__(self, parent=None):
super(ClassA, self).__init__(parent)
self.setFont(QtGui.QFont("Helvetica", 10, QtGui.QFont.Normal, italic=False))
self.c_lay = QtWidgets.QHBoxLayout()
fctd = "One\n\nTwo\n\nThree"
con_strength = QtWidgets.QLabel(fctd)
self.value = QtWidgets.QLineEdit('Test')
self.c_lay.addWidget(con_strength)
self.c_lay.addWidget(self.value, alignment=QtCore.Qt.AlignRight)
self.combo = QtWidgets.QComboBox()
self.combo.addItems(["10","12","14","16"])
self.hbox = QtWidgets.QHBoxLayout()
self.con = QtWidgets.QLabel("Number: ")
self.hbox.addWidget(self.con)
self.hbox.addWidget(self.combo)
self.vlay = QtWidgets.QVBoxLayout()
self.vlay.addLayout(self.hbox)
self.vlay.addLayout(self.c_lay)
self.vlay.addStretch()
Concrete_Group = QtWidgets.QGroupBox()
Concrete_Group.setTitle("&GroupA")
Concrete_Group.setLayout(self.vlay)
lay = QtWidgets.QVBoxLayout(self)
lay.addWidget(Concrete_Group)
self.combo.activated[str].connect(self.display_data)
@QtCore.pyqtSlot(str)
def display_data(self, value):
try:
f = value
f_value = "{}"
self.value.setText(f_value.format(f))
except ValueError:
print("Error")
def get_data(self):
return tuple([self.combo.currentText(), self.value.text()])
class ClassB(QtWidgets.QWidget):
def __init__(self, parent=None):
super(ClassB, self).__init__(parent)
self.setFont(QtGui.QFont("Helvetica", 10, QtGui.QFont.Normal, italic=False))
self.combo_exclass = QtWidgets.QComboBox()
self.combo_exclass.addItems([" Very dry area"," Dry or permanently wet"," Wet, rarely dry"," Moderate humidity"," Tidal splash & spray zones"])
self.combo_lclass = QtWidgets.QComboBox()
self.combo_lclass.addItems(["L2","L4","L6","L8"])
self.combo_vct = QtWidgets.QComboBox()
self.combo_vct.addItems(["0.10","0.20","0.30","0.40",
"0.50","0.60","0.70"])
self.combo_in = QtWidgets.QComboBox()
self.combo_in.addItems(["Class1","Class2","Class3"])
self.tbox = QtWidgets.QHBoxLayout()
self.exclass = QtWidgets.QLabel("Class1: ")
self.tbox.addWidget(self.exclass)
self.tbox.addWidget(self.combo_exclass)
self.mtbox = QtWidgets.QHBoxLayout()
self.lclass = QtWidgets.QLabel("Class2: ")
self.mtbox.addWidget(self.lclass)
self.mtbox.addWidget(self.combo_lclass)
self.mbbox = QtWidgets.QHBoxLayout()
self.vct = QtWidgets.QLabel("Class3: ")
self.mbbox.addWidget(self.vct)
self.mbbox.addWidget(self.combo_vct)
self.bbox = QtWidgets.QHBoxLayout()
self.inl = QtWidgets.QLabel("Class4: ")
self.bbox.addWidget(self.inl)
self.bbox.addWidget(self.combo_in)
self.grid = QtWidgets.QGridLayout()
self.grid.addLayout(self.tbox, 0, 0, 1, 2)
self.grid.addLayout(self.mtbox, 1, 0)
self.grid.addLayout(self.mbbox, 2, 0)
self.grid.addLayout(self.bbox, 3, 0)
Environment_Group = QtWidgets.QGroupBox()
Environment_Group.setTitle("&Group2")
Environment_Group.setLayout(self.grid)
vlay = QtWidgets.QVBoxLayout(self)
vlay.addWidget(Environment_Group)
def get_data(self):
return tuple(combo.currentText() for combo in (self.combo_exclass, self.combo_lclass, self.combo_vct, self.combo_in))
class ClassC(QtWidgets.QWidget):
def __init__(self, parent=None):
super(ClassC, self).__init__(parent)
self.setFont(QtGui.QFont("Helvetica", 10, QtGui.QFont.Normal, italic=False))
filenameLabel = QtWidgets.QLabel("Name number:")
self.fileNameEdit = QtWidgets.QLineEdit()
ftablayout = QtWidgets.QVBoxLayout(self)
ftablayout.addWidget(filenameLabel)
ftablayout.addWidget(self.fileNameEdit)
def get_data(self):
return tuple(self.fileNameEdit.text(),)
class LoadTable(QtWidgets.QTableWidget):
def __init__(self, parent=None):
super(LoadTable, self).__init__(1, 3, parent)
self.setFont(QtGui.QFont("Helvetica", 10, QtGui.QFont.Normal, italic=False))
headertitle = ("A","B","C")
self.setHorizontalHeaderLabels(headertitle)
self.verticalHeader().hide()
self.horizontalHeader().setHighlightSections(False)
self.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Fixed)
self.setSelectionMode(QtWidgets.QAbstractItemView.NoSelection)
self.setColumnWidth(0, 130)
combox_lay = QtWidgets.QComboBox(self)
combox_lay.addItems(["I","II"])
self.setCellWidget(0, 2, combox_lay)
def get_data(self):
return tuple([self.cellWidget(0, 2).currentText()])
class Calculate():
def parse_file(self,a,b,c,d,e,f,g):
print(a, b, c, d, e, f, g)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = Tabwidget()
w.show()
sys.exit(app.exec_())
更新:
# ...
class LoadTable(QtWidgets.QTableWidget):
# ...
def get_data(self):
val1 = self.item(0, 0).text() if self.item(0, 0) else ""
val2 = self.item(0, 1).text() if self.item(0, 1) else ""
return tuple([val1, val2, self.cellWidget(0, 2).currentText()])
# ...
class Calculate():
def parse_file(self,a,b,c,d,e,f,g, h, i):
print(a, b, c, d, e, f, g, h, i)
推荐阅读
- meshlab - 2020.12 Meshlabserver.exe在哪里
- c - Timing Quake III hack 仅在使用优化编译时有效
- python - 如何在 GridLayout 中拉伸 QSvgWidget
- wordpress - 事件日历查询未来和未结束的事件
- jquery - 如何在 Pos Receipt (Odoo13) 中显示产品默认代码(内部参考)
- kubernetes - 如何在 Kubernetes 集群中通过 WebSockets 从 Kafka 推送事件
- php - 如何使用 PHP 在图像文件中添加关键字?
- python - Python Selenium 随机行为 - findElement 有时有效,有时与看似相同的代码无关
- python - 如何定义具有 2 个参数的函数,其中一个是 Tkinter 的“事件”参数?
- javascript - React Native 使用 Expo 加载标志问题