因此,我尝试编写一个代码,将csv文件加载到每个选项卡上的QTableWidget中,然后可以对其进行编辑和保存。但是,当我保存时,该程序由于各种原因而崩溃。尽管未设置自动加载功能,但我一次尝试解决一个问题!
我看到了很多帖子,似乎都在问同样的问题,但是在实现它们时似乎不起作用,有的原因是它们使用tableview而不是QTableWidget,还有一些可能是由于我是新手而未能正确实现它进行编码。
MyTabs(QWidget)类:
def __init__(self, parent):
super(QWidget, self).__init__(parent)
layout = QVBoxLayout(self)
# Initialize tab screen
self.tabs = QTabWidget()
self.tabmon = QWidget()
self.tabtue = QWidget()
# Add tabs
self.tabs.addTab(self.tabmon, "Monday")
self.tabs.addTab(self.tabtue, "Tuesday")
#Save Button
self.buttonSavemon = QtWidgets.QPushButton('Save', self)
self.buttonSavemon.clicked.connect(self.handleSavemon)
self.buttonSavetue = QtWidgets.QPushButton('Save', self)
self.buttonSavetue.clicked.connect(self.handleSavetue)
#Initiate Tables
self.createTable()
# Create Monday tab
self.tabmon_layout = QVBoxLayout(self.tabmon)
self.tabmon_layout.addWidget(self.tablewidgetmon)
self.tabmon_layout.addWidget(self.buttonSavemon)
# Create Tuesday tab
self.tabtue_layout = QVBoxLayout(self.tabtue)
self.tabtue_layout.addWidget(self.tablewidgettue)
self.tabtue_layout.addWidget(self.buttonSavetue)
# Add tabs to widget
layout.addWidget(self.tabs)
def createTable(self):
#Monday Table
self.tablewidgetmon = QTableWidget()
self.tablewidgetmon.setRowCount(10)
self.tablewidgetmon.setColumnCount(2)
self.tablewidgetmon.setHorizontalHeaderLabels(["Time", "File Name"])
#Tuesday Table
self.tablewidgettue = QTableWidget()
self.tablewidgettue.setRowCount(12)
self.tablewidgettue.setColumnCount(2)
self.tablewidgettue.setHorizontalHeaderLabels(["Time", "File Name"])
def handleSavemon(self):
with open('monschedule.csv', 'wb') as stream:
writer = csv.writer(stream)
for row in range(self.tablewidgetmon.rowCount()):
rowdata = []
for column in range(self.tablewidgetmon.columnCount()):
item = self.tablewidgetmon.item(row, column)
if item is not None:
rowdata.append(
unicode(item.text()).encode('utf8'))
else:
rowdata.append('')
writer.writerow(rowdata)
def handleSavetue(self):
with open('tueschedule.csv', "w") as fileOutput:
writer = csv.writer(fileOutput)
for rowNumber in range(self.tablewidgettue.rowCount()):
fields = [
self.tablewidgettue.data(
self.tablewidgettue.index(rowNumber, columnNumber),
QtCore.Qt.DisplayRole
)
for columnNumber in range(self.tablewidgettue.columnCount())
]
writer.writerow(fields)
我尝试了两种保存方法,其中星期一函数似乎是最有前途的,但是由于数据是字符串,所以给了我一个错误。
此后,通过查看csv文件,似乎已清除了原始文件,但未保存新数据。
答案 0 :(得分:0)
您正在以二进制文件而不是文本文件的形式打开文件。这就是writerow
函数期望一个类似字节的对象的原因。
要解决此问题,请删除open
调用中的'b'标志:
with open('monschedule.csv', 'w') as stream:
顺便说一下,行rowdata.append(unicode(item.text()).encode('utf8'))
应该是rowdata.append(item.text())
答案 1 :(得分:0)
尝试一下:
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import csv
class MyTabs(QWidget):
def __init__(self, parent=None):
super(QWidget, self).__init__(parent)
layout = QVBoxLayout(self)
# Initialize tab screen
self.tabs = QTabWidget()
self.tabmon = QWidget()
self.tabtue = QWidget()
# Add tabs
self.tabs.addTab(self.tabmon, "Monday")
self.tabs.addTab(self.tabtue, "Tuesday")
#Save Button
self.buttonSavemon = QtWidgets.QPushButton('Save', self)
self.buttonSavemon.clicked.connect(self.handleSavemon)
self.buttonSavetue = QtWidgets.QPushButton('Save', self)
self.buttonSavetue.clicked.connect(self.handleSavetue)
#Initiate Tables
self.createTable()
# Create Monday tab
self.tabmon_layout = QVBoxLayout(self.tabmon)
self.tabmon_layout.addWidget(self.tablewidgetmon)
self.tabmon_layout.addWidget(self.buttonSavemon)
# Create Tuesday tab
self.tabtue_layout = QVBoxLayout(self.tabtue)
self.tabtue_layout.addWidget(self.tablewidgettue)
self.tabtue_layout.addWidget(self.buttonSavetue)
# Add tabs to widget
layout.addWidget(self.tabs)
def createTable(self):
#Monday Table
self.tablewidgetmon = QTableWidget()
self.tablewidgetmon.setRowCount(10)
self.tablewidgetmon.setColumnCount(2)
self.tablewidgetmon.setHorizontalHeaderLabels(["Time", "File Name"])
#Tuesday Table
self.tablewidgettue = QTableWidget()
self.tablewidgettue.setRowCount(12)
self.tablewidgettue.setColumnCount(2)
self.tablewidgettue.setHorizontalHeaderLabels(["Time", "File Name"])
def handleSavemon(self):
# with open('monschedule.csv', 'wb') as stream:
with open('monschedule.csv', 'w') as stream: # 'w'
writer = csv.writer(stream, lineterminator='\n') # + , lineterminator='\n'
for row in range(self.tablewidgetmon.rowCount()):
rowdata = []
for column in range(self.tablewidgetmon.columnCount()):
item = self.tablewidgetmon.item(row, column)
if item is not None:
# rowdata.append(unicode(item.text()).encode('utf8'))
rowdata.append(item.text()) # +
else:
rowdata.append('')
writer.writerow(rowdata)
def handleSavetue(self):
with open('tueschedule.csv', "w") as fileOutput:
writer = csv.writer(fileOutput)
for rowNumber in range(self.tablewidgettue.rowCount()):
# +
fields = [
self.tablewidgettue.item(rowNumber, columnNumber).text() \
if self.tablewidgettue.item(rowNumber, columnNumber) is not None else ""
for columnNumber in range(self.tablewidgetmon.columnCount())
]
writer.writerow(fields)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
main = MyTabs()
main.show()
sys.exit(app.exec_())