第一个程序简单收费系统

看完这个程序,一般的小程序需求应该已经可以去开发了,但是作为一个程序狗,希望还是把文档给看完比较好,知其然知其所以然,所以我还会坚持下去。

import sys 42from PySide6.QtCore import Qt, Slot 43from PySide6.QtGui import QAction, QPainter 44from PySide6.QtWidgets import (QApplication, QHeaderView, QHBoxLayout, QLabel, QLineEdit, 45 QMainWindow, QPushButton, QTableWidget, QTableWidgetItem, 46 QVBoxLayout, QWidget) 47from PySide6.QtCharts import QChartView, QPieSeries, QChart 48 49 50class Widget(QWidget): 51 def __init__(self): 52 QWidget.__init__(self) 53 self.items = 0 54 55 # Example data 56 self._data = {"Water": 24.5, "Electricity": 55.1, "Rent": 850.0, 57 "Supermarket": 230.4, "Internet": 29.99, "Bars": 21.85, 58 "Public transportation": 60.0, "Coffee": 22.45, "Restaurants": 120} 59 60 # Left 61 self.table = QTableWidget() 62 self.table.setColumnCount(2) 63 self.table.setHorizontalHeaderLabels(["Description", "Price"]) 64 self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) 65 66 # Chart 67 self.chart_view = QChartView() 68 self.chart_view.setRenderHint(QPainter.Antialiasing) 69 70 # Right 71 self.description = QLineEdit() 72 self.price = QLineEdit() 73 self.add = QPushButton("Add") 74 self.clear = QPushButton("Clear") 75 self.quit = QPushButton("Quit") 76 self.plot = QPushButton("Plot") 77 78 # Disabling 'Add' button 79 self.add.setEnabled(False) 80 81 self.right = QVBoxLayout() 82 self.right.addWidget(QLabel("Description")) 83 self.right.addWidget(self.description) 84 self.right.addWidget(QLabel("Price")) 85 self.right.addWidget(self.price) 86 self.right.addWidget(self.add) 87 self.right.addWidget(self.plot) 88 self.right.addWidget(self.chart_view) 89 self.right.addWidget(self.clear) 90 self.right.addWidget(self.quit) 91 92 # QWidget Layout 93 self.layout = QHBoxLayout() 94 95 #self.table_view.setSizePolicy(size) 96 self.layout.addWidget(self.table) 97 self.layout.addLayout(self.right) 98 99 # Set the layout to the QWidget 100 self.setLayout(self.layout) 101 102 # Signals and Slots 103 self.add.clicked.connect(self.add_element) 104 self.quit.clicked.connect(self.quit_application) 105 self.plot.clicked.connect(self.plot_data) 106 self.clear.clicked.connect(self.clear_table) 107 self.description.textChanged[str].connect(self.check_disable) 108 self.price.textChanged[str].connect(self.check_disable) 109 110 # Fill example data 111 self.fill_table() 112 113 @Slot() 114 def add_element(self): 115 des = self.description.text() 116 price = self.price.text() 117 118 try: 119 price_item = QTableWidgetItem(f"{float(price):.2f}") 120 price_item.setTextAlignment(Qt.AlignRight) 121 122 self.table.insertRow(self.items) 123 description_item = QTableWidgetItem(des) 124 125 self.table.setItem(self.items, 0, description_item) 126 self.table.setItem(self.items, 1, price_item) 127 128 self.description.setText("") 129 self.price.setText("") 130 131 self.items += 1 132 except ValueError: 133 print("Wrong price", price) 134 135 136 @Slot() 137 def check_disable(self, s): 138 if not self.description.text() or not self.price.text(): 139 self.add.setEnabled(False) 140 else: 141 self.add.setEnabled(True) 142 143 @Slot() 144 def plot_data(self): 145 # Get table information 146 series = QPieSeries() 147 for i in range(self.table.rowCount()): 148 text = self.table.item(i, 0).text() 149 number = float(self.table.item(i, 1).text()) 150 series.append(text, number) 151 152 chart = QChart() 153 chart.addSeries(series) 154 chart.legend().setAlignment(Qt.AlignLeft) 155 self.chart_view.setChart(chart) 156 157 @Slot() 158 def quit_application(self): 159 QApplication.quit() 160 161 def fill_table(self, data=None): 162 data = self._data if not data else data 163 for desc, price in data.items(): 164 description_item = QTableWidgetItem(desc) 165 price_item = QTableWidgetItem(f"{price:.2f}") 166 price_item.setTextAlignment(Qt.AlignRight) 167 self.table.insertRow(self.items) 168 self.table.setItem(self.items, 0, description_item) 169 self.table.setItem(self.items, 1, price_item) 170 self.items += 1 171 172 @Slot() 173 def clear_table(self): 174 self.table.setRowCount(0) 175 self.items = 0 176 177 178class MainWindow(QMainWindow): 179 def __init__(self, widget): 180 QMainWindow.__init__(self) 181 self.setWindowTitle("Tutorial") 182 183 # Menu 184 self.menu = self.menuBar() 185 self.file_menu = self.menu.addMenu("File") 186 187 # Exit QAction 188 exit_action = QAction("Exit", self) 189 exit_action.setShortcut("Ctrl+Q") 190 exit_action.triggered.connect(self.exit_app) 191 192 self.file_menu.addAction(exit_action) 193 self.setCentralWidget(widget) 194 195 @Slot() 196 def exit_app(self, checked): 197 QApplication.quit() 198 199 200if __name__ == "__main__": 201 # Qt Application 202 app = QApplication(sys.argv) 203 # QWidget 204 widget = Widget() 205 # QMainWindow using QWidget as central widget 206 window = MainWindow(widget) 207 window.resize(800, 600) 208 window.show() 209 210 # Execute application 211 sys.exit(app.exec())


结果

 

posted @   菩提浪子  阅读(131)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示