我看过这个有关 Python 费用跟踪器的 YouTube 教程,并尝试通过允许您将数据导入或导出到 CSV 来添加更多功能。我不断面临错误。我还尝试创建一个使用字典写入 CSV 的函数,但遇到了更多问题。
这是代码:
import csv
import sys
from PySide6.QtCore import Qt, Slot
from PySide6.QtGui import QAction , QPainter
from PySide6.QtWidgets import (QApplication, QHeaderView, QHBoxLayout, QLabel, QLineEdit,
QMainWindow, QPushButton, QTableWidget, QTableWidgetItem, QVBoxLayout,
QWidget)
from PySide6.QtCharts import QChartView, QPieSeries, QChart
class Widget(QWidget):
def __init__(self):
QWidget.__init__(self)
self.items = 0
#Dummy Data
self._data = {"Water": [24],
"Rent": [1000],
"Coffee": [30],
"Grocery": [300],
"Phone": [45],
"Internet": [70]}
with open("aib_october.csv", 'w', newline='') as file:
writer = csv.DictWriter(file,fieldnames=self._data)
writer.writeheader()
writer.writerow(self._data)
# Left Widget
self.table = QTableWidget()
self.table.setColumnCount(2)
self.table.setHorizontalHeaderLabels(["Description", "Price"])
self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
# Chart
self.chart_view = QChartView()
self.chart_view.setRenderHint(QPainter.Antialiasing)
# Right Widget
self.description = QLineEdit()
self.price = QLineEdit()
self.add = QPushButton("Add")
self.clear = QPushButton("Clear")
self.quit = QPushButton("Quit")
self.plot = QPushButton("Plot")
self.export = QPushButton("export")
# Disabling 'Add' button
self.add.setEnabled(False)
self.right = QVBoxLayout()
self.right.addWidget(QLabel("Description"))
self.right.addWidget(self.description)
self.right.addWidget(QLabel("Price"))
self.right.addWidget(self.price)
self.right.addWidget(self.add)
self.right.addWidget(self.plot)
self.right.addWidget(self.chart_view)
self.right.addWidget(self.export)
self.right.addWidget(self.clear)
self.right.addWidget(self.quit)
# QWidget Layout
self.layout = QHBoxLayout()
#self.table_view.setSizePolicy(size)
self.layout.addWidget(self.table)
self.layout.addLayout(self.right)
# Set the layout to the QWidget
self.setLayout(self.layout)
# Signals and Slots
self.add.clicked.connect(self.add_element)
self.quit.clicked.connect(self.quit_application)
self.plot.clicked.connect(self.plot_data)
self.clear.clicked.connect(self.clear_table)
self.export.clicked.connect(self.clear_table)
self.description.textChanged[str].connect(self.check_disable)
self.price.textChanged[str].connect(self.check_disable)
# Fill example data
self.fill_table()
@Slot()
def add_element(self):
des = self.description.text()
price = self.price.text()
try:
price_item = QTableWidgetItem(f"{float(price):.2f}")
price_item.setTextAlignment(Qt.AlignRight)
self.table.insertRow(self.items)
description_item = QTableWidgetItem(des)
self.table.setItem(self.items, 0, description_item)
self.table.setItem(self.items, 1, price_item)
self.description.setText("")
self.price.setText("")
self.items += 1
except ValueError:
print("That is not an invalid input:", price, "Make sure to enter a price!")
@Slot()
def check_disable(self, x):
if not self.description.text() or not self.price.text():
self.add.setEnabled(False)
else:
self.add.setEnabled(True)
@Slot()
def plot_data(self):
# Get table information
series = QPieSeries()
for i in range(self.table.rowCount()):
text = self.table.item(i, 0).text()
number = float(self.table.item(i, 1).text())
series.append(text, number)
chart = QChart()
chart.addSeries(series)
chart.legend().setAlignment(Qt.AlignLeft)
self.chart_view.setChart(chart)
@Slot()
def quit_application(self):
QApplication.quit()
def fill_table(self, data=None):
data = self._data if not data else data
for desc, price in data.items():
description_item = QTableWidgetItem(desc)
price_item = QTableWidgetItem(f"{price:.2f}")
price_item.setTextAlignment(Qt.AlignRight)
self.table.insertRow(self.items)
self.table.setItem(self.items, 0, description_item)
self.table.setItem(self.items, 1, price_item)
self.items += 1
@Slot()
def clear_table(self):
self.table.setRowCount(0)
self.items = 0
class MainWindow(QMainWindow):
def __init__(self, widget):
QMainWindow.__init__(self)
self.setWindowTitle("The pynancial advisor")
# Menu
self.menu = self.menuBar()
self.file_menu = self.menu.addMenu("File")
# Exit QAction
exit_action = QAction("Exit", self)
exit_action.setShortcut("Ctrl+Q")
exit_action.triggered.connect(self.exit_app)
self.file_menu.addAction(exit_action)
self.setCentralWidget(widget)
@Slot()
def exit_app(self, checked):
QApplication.quit()
if __name__ == "__main__":
# Qt Application
app = QApplication(sys.argv)
# QWidget
widget = Widget()
# QMainWindow using QWidget as central widget
window = MainWindow(widget)
window.resize(800, 600)
window.show()
# Execute application
sys.exit(app.exec())
你的问题出在这条线上。
price_item = QTableWidgetItem(f"{price:.2f}")
错误提示“传递了不支持的格式字符串”。删除 :.2f 似乎可以修复它。我不确定为什么 QTableWidgetItem 似乎无法处理这个问题,但是使用 .format 可以工作并且默认为小数点后两位。
price_item = QTableWidgetItem("{}".format(price))