导入.csv数据以填充QTableWidget
我正在建立一个GUI,我需要在屏幕上显示几个CSV文件的数据。我尝试过,但不能提出解决方案。我是编程和Python的新手。我会得到我能得到的任何建议。
您可以使用CSV模块吗?例如:
def loadCsvFile(self, test.csv):
with open(test.csv, "r") as stream:
for row in csv.reader(stream):
Bellow是我的UI文件的片段,这是巨大的。但是我想用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'对象从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 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)
Im building a GUI where i have the need to display data from a few CSV-files onto the screen. I've tried but cant come up with a solution. I'm sort of new to programing and python. I'll take any advice I can get.
Could you use the CSV module? for instance:
def loadCsvFile(self, test.csv):
with open(test.csv, "r") as stream:
for row in csv.reader(stream):
Bellow is a snippet of my UI file, which is huge. But i want to fill the QTableWidget called Xerox_work_centre_db with the CSV contents. And I was wondering how I could achieve this?
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"
Updated Code, it now returns the following error:
File "C:\Temp\GitHub\CSV_to_UI\main.py", line 176, in loadCsv
self.model.appendRow(items)
AttributeError: 'MainWindow' object has no attribute 'model'
From 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)
#######################################
From 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)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
由于我在main.py中具有函数loadCSV,而其余的则在ui_interface.py中。我称self.model错误。
我只是简单地从main.py初始化所有内容。
Since i had the Function loadCsv in the main.py and the rest in ui_interface.py. I called the self.model wrong.
I just simply had initialize everything from the main.py.