我认为我在这个问题上缺少一个基本的想法和结构。
我使用QTDesigner 4为pyqt5设计了一个UI。在此UI中,用户将在名为self.elaexpect的QLineEdit小部件中输入一个数字,并将第二个数字输入到名为self.elaact的第二个QLineEdit小部件中。然后,用户将单击名为addnew的按钮。然后该按钮将信息发送到同一Ui窗口(MainWindow)中的QTableWidget。这一切都按预期工作。我的麻烦在于下一个期望的结果。
我希望将数字除以(预期/实际)以形成比率,然后将其存储在列表中(不是Ui的一部分)。在此步骤之后,我希望程序找到百分比的平均值。因此,在数学术语中,它看起来像{[(预期/实际)+(预期2 +实际2)] / 2} * 100。此结果将在QTextBrowser中填充一行,说明百分比是多少。
我的包版试图将比率存储在列表中。正如您在我的代码中看到的那样,我尝试使用list.append()无效,将其存储在for循环中。在阅读之后,我还尝试使用copy.deepcopy,我需要附加列表的副本。当我构建代码时会发生什么,Ui打开,我输入我的数字,解释器处理比率并打印比率。然后我再输入两个数字并按下按钮,解释器处理这个比例并打印,但不是有两个数字,而是只得到最后一个。我被困在这里并花了大约10个小时尝试不同的解决方案,但不能动摇我错过一些基本的东西的感觉。
这是我的代码:
import sys
import copy
from PyQt5 import QtCore, QtGui, QtWidgets
from app3 import Ui_MainWindow
class Accapp(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
Ui_MainWindow.__init__(self)
Ui_MainWindow.__init__(self)
self.setupUi(self)
self.retranslateUi(self)
self.elaaddnew.clicked.connect(self.elaaddRow)
def elaaddRow(self):
# Retrieve text from QLineEdit
eladate = self.eladate.text()
elatname = self.elaname.text()
elaexpect = self.elaexp.text()
elaactual = self.elaact.text()
# Create a empty row at bottom of table
numRows = self.elatable.rowCount()
self.elatable.insertRow(numRows)
# Add text to the row
self.elatable.setItem(numRows, 0, QtWidgets.QTableWidgetItem(eladate))
self.elatable.setItem(numRows, 1, QtWidgets.QTableWidgetItem(elatname))
self.elatable.setItem(numRows, 2, QtWidgets.QTableWidgetItem(elaexpect))
self.elatable.setItem(numRows, 3, QtWidgets.QTableWidgetItem(elaactual))
# divide expected and actual times for ratio
elaratio= int(elaexpect)/int(elaactual)
# convert ratio to string
elaratiostr = str(elaratio)
#Split string to enter into list
elastrsp = elaratiostr.split()
# Create list
elaratiolst = []
#Create deepcopy of list
elaratiolstc = copy.deepcopy(elaratiolst)
#append values into list
for x in elastrsp:
elaratiolstc.append(x)
#Print list in python interpreter (not Ui)
print(elaratiolstc)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
window = Accapp()
window.show()
sys.exit(app.exec_())
以下是Ui的相关部分(实际上它是正确对齐的):
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1044, 936)
self.elatab = QtWidgets.QWidget()
self.elatab.setObjectName("elatab")
self.verticalLayout_9 = QtWidgets.QVBoxLayout(self.elatab)
self.verticalLayout_9.setObjectName("verticalLayout_9")
self.elagrpbx = QtWidgets.QGroupBox(self.elatab)
self.elagrpbx.setMinimumSize(QtCore.QSize(994, 812))
self.elagrpbx.setTitle("")
self.elagrpbx.setObjectName("elagrpbx")
self.formLayout_3 = QtWidgets.QFormLayout(self.elagrpbx)
self.formLayout_3.setObjectName("formLayout_3")
self.formLayout_2 = QtWidgets.QFormLayout()
self.formLayout_2.setSizeConstraint(QtWidgets.QLayout.SetFixedSize)
self.formLayout_2.setObjectName("formLayout_2")
self.elaname = QtWidgets.QLineEdit(self.elagrpbx)
self.elaname.setMaximumSize(QtCore.QSize(78, 20))
self.elaname.setObjectName("elaname")
self.formLayout_2.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.elaname)
self.label_35 = QtWidgets.QLabel(self.elagrpbx)
font = QtGui.QFont()
font.setPointSize(11)
self.label_35.setFont(font)
self.label_35.setObjectName("label_35")
self.formLayout_2.setWidget(5, QtWidgets.QFormLayout.LabelRole, self.label_35)
self.elaexp = QtWidgets.QLineEdit(self.elagrpbx)
self.elaexp.setMaximumSize(QtCore.QSize(78, 20))
self.elaexp.setObjectName("elaexp")
self.formLayout_2.setWidget(5, QtWidgets.QFormLayout.FieldRole, self.elaexp)
self.elaaddnew = QtWidgets.QPushButton(self.elagrpbx)
self.elaaddnew.setMaximumSize(QtCore.QSize(75, 23))
self.elaaddnew.setObjectName("elaaddnew")
self.formLayout_2.setWidget(9, QtWidgets.QFormLayout.FieldRole, self.elaaddnew)
self.eladate = QtWidgets.QDateEdit(self.elagrpbx)
self.eladate.setMaximumSize(QtCore.QSize(79, 22))
self.eladate.setMinimumDate(QtCore.QDate(2018, 9, 14))
self.eladate.setObjectName("eladate")
self.formLayout_2.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.eladate)
self.label_33 = QtWidgets.QLabel(self.elagrpbx)
font = QtGui.QFont()
font.setPointSize(11)
self.label_33.setFont(font)
self.label_33.setObjectName("label_33")
self.formLayout_2.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_33)
self.label_34 = QtWidgets.QLabel(self.elagrpbx)
font = QtGui.QFont()
font.setPointSize(11)
self.label_34.setFont(font)
self.label_34.setAlignment(QtCore.Qt.AlignCenter)
self.label_34.setWordWrap(True)
self.label_34.setObjectName("label_34")
self.formLayout_2.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.label_34)
self.label_36 = QtWidgets.QLabel(self.elagrpbx)
font = QtGui.QFont()
font.setPointSize(11)
self.label_36.setFont(font)
self.label_36.setObjectName("label_36")
self.formLayout_2.setWidget(7, QtWidgets.QFormLayout.LabelRole, self.label_36)
self.elaact = QtWidgets.QLineEdit(self.elagrpbx)
self.elaact.setMaximumSize(QtCore.QSize(78, 20))
self.elaact.setObjectName("elaact")
self.formLayout_2.setWidget(7, QtWidgets.QFormLayout.FieldRole, self.elaact)
self.formLayout_3.setLayout(0, QtWidgets.QFormLayout.LabelRole, self.formLayout_2)
self.elatable = QtWidgets.QTableWidget(self.elagrpbx)
self.elatable.setMinimumSize(QtCore.QSize(729, 600))
self.elatable.setMaximumSize(QtCore.QSize(729, 619))
self.elatable.setObjectName("elatable")
self.elatable.setColumnCount(4)
self.elatable.setRowCount(0)
item = QtWidgets.QTableWidgetItem()
item.setTextAlignment(QtCore.Qt.AlignCenter)
self.elatable.setHorizontalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
item.setTextAlignment(QtCore.Qt.AlignCenter)
self.elatable.setHorizontalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
item.setTextAlignment(QtCore.Qt.AlignCenter)
self.elatable.setHorizontalHeaderItem(2, item)
item = QtWidgets.QTableWidgetItem()
item.setTextAlignment(QtCore.Qt.AlignCenter)
self.elatable.setHorizontalHeaderItem(3, item)
self.elatable.horizontalHeader().setDefaultSectionSize(175)
self.elatable.verticalHeader().setCascadingSectionResizes(False)
self.elatable.verticalHeader().setDefaultSectionSize(46)
self.formLayout_3.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.elatable)
由于
答案 0 :(得分:0)
由于r / learnpython subreddit上的u / Thomasedv,答案是预期的一个简单修复。解决方案包括:
self.ratio_list=[]
在__init__
课程中添加
self.ratio_list.append(elaratio)
在elaaddrow。
这解决了这个问题。