【发布时间】:2022-06-13 06:22:52
【问题描述】:
我正在构建一个 GUI,我需要在其中将几个 CSV 文件中的数据显示到屏幕上。我已经尝试过,但无法提出解决方案。我对编程和 python 有点陌生。我会接受我能得到的任何建议。
您可以使用 CSV 模块吗?例如:
def loadCsvFile(self, test.csv):
with open(test.csv, "r") as stream:
for row in csv.reader(stream):
Bellow 是我的 UI 文件的 sn-p,它很大。但我想用 CSV 内容填充名为 Xerox_work_centre_db 的 QTableWidget。我想知道如何才能做到这一点?
self.verticalLayout_13.addWidget(self.Monitor_header, 0, Qt.AlignTop)
self.Monitor_main_content = QFrame(self.Monitor)
self.Monitor_main_content.setObjectName(u"Monitor_main_content")
sizePolicy.setHeightForWidth(self.Monitor_main_content.sizePolicy().hasHeightForWidth())
self.Monitor_main_content.setSizePolicy(sizePolicy)
self.Monitor_main_content.setFrameShape(QFrame.StyledPanel)
self.Monitor_main_content.setFrameShadow(QFrame.Raised)
self.Xerox_workcentre_db = QTableWidget(self.Monitor_main_content)
self.Xerox_workcentre_db.setObjectName(u"Xerox_workcentre_db")
self.Xerox_workcentre_db.setGeometry(QRect(0, 1, 801, 611))
self.verticalLayout_13.addWidget(self.Monitor_main_content)
self.stackedWidget.addWidget(self.Monitor)
self.Alerts = QWidget()
self.Alerts.setObjectName(u"Alerts")
self.stackedWidget.addWidget(self.Alerts)
self.Order = QWidget()
self.Order.setObjectName(u"Order")
self.stackedWidget.addWidget(self.Order)
self.verticalLayout_12.addWidget(self.stackedWidget)
self.verticalLayout.addWidget(self.main_body_content)
self.footer = QFrame(self.main_body)
self.footer.setObjectName(u"footer")
self.footer.setStyleSheet(u"QFrame{\n"
更新代码,现在返回如下错误:
文件“C:\Temp\GitHub\CSV_to_UI\main.py”,第 176 行,在 loadCsv self.model.appendRow(项目) AttributeError: 'MainWindow' 对象没有属性 'model'
来自 ui_interface.py
self.verticalLayout_13.addWidget(self.Monitor_header, 0, Qt.AlignTop)
self.Monitor_main_content = QFrame(self.Monitor)
self.Monitor_main_content.setObjectName(u"Monitor_main_content")
sizePolicy.setHeightForWidth(self.Monitor_main_content.sizePolicy().hasHeightForWidth())
self.Monitor_main_content.setSizePolicy(sizePolicy)
self.Monitor_main_content.setFrameShape(QFrame.StyledPanel)
self.Monitor_main_content.setFrameShadow(QFrame.Raised)
self.verticalLayout_18 = QVBoxLayout(self.Monitor_main_content)
self.verticalLayout_18.setSpacing(0)
self.verticalLayout_18.setObjectName(u"verticalLayout_18")
self.verticalLayout_18.setContentsMargins(0, 0, 0, 0)
#######################################
### CSV CONTENT
self.model = QStandardItemModel(MainWindow)
self.Xerox_workcentre_db = QTableView(self.Monitor_main_content)
self.Xerox_workcentre_db.setObjectName(u"Xerox_workcentre_db")
self.Xerox_workcentre_db.setModel(self.model)
self.Xerox_workcentre_db.horizontalHeader().setStretchLastSection(True)
self.verticalLayout_18.addWidget(self.Xerox_workcentre_db)
#######################################
来自 main.py
## MAIN WINDOW CLASS
########################################################################
class MainWindow(QMainWindow):
def __init__(self, parent=None):
QMainWindow.__init__(self)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.setWindowFlags(Qt.FramelessWindowHint)
self.setAttribute(Qt.WA_TranslucentBackground)
self.shadow = QGraphicsDropShadowEffect(self)
self.shadow.setBlurRadius(50)
self.shadow.setXOffset(0)
self.shadow.setYOffset(0)
self.shadow.setColor(QColor(0, 92, 157, 550))
self.ui.centralwidget.setGraphicsEffect(self.shadow)
self.setWindowIcon(QIcon(""))
# Set window tittle
self.setWindowTitle("Printer Monitoring v1.0")
QSizeGrip(self.ui.size_grip)
#######################################################################
## Button for loadCsv
self.ui.Xerox_workcentre_button.clicked.connect(self.loadCsv)
#######################################################################
self.ui.minimize_window_button.clicked.connect(lambda: self.showMinimized())
self.ui.close_window_button.clicked.connect(lambda: self.close())
self.ui.exit_button.clicked.connect(lambda: self.close())
self.ui.restore_window_button.clicked.connect(lambda: self.restore_or_maximize_window())
def moveWindow(e):
if self.isMaximized() == False: # Not maximized
if e.buttons() == Qt.LeftButton:
self.move(self.pos() + e.globalPos() - self.clickPosition)
self.clickPosition = e.globalPos()
e.accept()
self.ui.header_frame.mouseMoveEvent = moveWindow
self.ui.open_close_side_bar_btn.clicked.connect(lambda: self.slideLeftMenu())
self.show()
def slideLeftMenu(self):
# Get current left menu width
width = self.ui.slide_menu_container.width()
# If minimized
if width == 0:
# Expand menu
newWidth = 200
self.ui.open_close_side_bar_btn.setIcon(QIcon(u":/icons/icons/chevron-left-solid-white.svg"))
# If maximized
else:
# Restore menu
newWidth = 0
self.ui.open_close_side_bar_btn.setIcon(QIcon(u":/icons/icons/bars-solid-white.svg"))
# Animate the transition
self.animation = QPropertyAnimation(self.ui.slide_menu_container, b"minimumWidth") # Animate minimumWidth
self.animation.setDuration(350)
self.animation.setStartValue(width) # Start value is the current menu width
self.animation.setEndValue(newWidth) # end value is the new menu width
self.animation.setEasingCurve(QEasingCurve.InOutQuart)
self.animation.start()
def mousePressEvent(self, event):
self.clickPosition = event.globalPos()
def restore_or_maximize_window(self):
# If window is maximized
if self.isMaximized():
self.showNormal()
# Change Icon
self.ui.restore_window_button.setIcon(QIcon(u":/icons/icons/window-maximize-regular-white.svg"))
else:
self.showMaximized()
self.ui.restore_window_button.setIcon(QIcon(u":/icons/icons/window-restore-solid-white.svg"))
#######################################################################
# CALL XEROX CSV FUNCTION
def loadCsv(self):
fileName= 'Xerox_workcentre_test.csv'
with open(fileName, "r") as fileInput:
for row in csv.reader(fileInput):
items = [
QtGui.QStandardItem(field)
for field in row
]
self.model.appendRow(items)
【问题讨论】:
-
遵循documentation 中的说明(虽然它是为 C++ 编写的,但函数调用与 Python 相同)。请注意,您应该不尝试编辑 pyuic 的输出,而应遵循有关 using Designer 的官方指南。然后,确保 所有 小部件都包含在 layout managers 中(似乎该表只是“浮动”在
Monitor_main_content中)。最后,只有类和常量应该有大写的名称。 -
感谢您的回答。正如我所说,我正在接受我能得到的每一个指针。我很感激我能得到的每一个答案。
-
我现在已经更新了我的代码,但是它返回了一个我无法完全理解的错误。
-
那是因为
self.model是在Ui_MainWindow中创建的,而不是在MainWindow中创建的。这是您应该不修改 pyuic 文件的另一个原因,因为它会造成对象结构的不一致和混乱。重建 ui 文件,并在MainWindow类中创建self.model。 -
是的,我注意到那天之后我太累了。我改变了我的方法,没有触摸 UI 文件而是从 main.py 初始化所有内容!
标签: python arrays database csv pyqt5