日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

python日常記賬本源代碼

汽車(chē)電子技術(shù) ? 來(lái)源:Python代碼大全 ? 作者:Python代碼狂人 ? 2023-02-24 09:54 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

python日常記賬本源代碼,基于PySide6(Qt for Python 6)的賬本,界面簡(jiǎn)潔、功能強(qiáng)大,支持保存文件、快速查詢(xún)、繪制圖表等,是平時(shí)記賬的不錯(cuò)選擇。賬目查詢(xún)、賬本編輯、添加/刪除、撤銷(xiāo)/重做、統(tǒng)計(jì)數(shù)據(jù)、生成圖表。

poYBAGP4GFeADw76AABXQLMlXRk378.png

pYYBAGP4GGiAaPo5AAELzN41XNY945.png

pYYBAGP4GHyAdYuvAABR6HNqPFM498.png

pYYBAGP4GIaAWPbfAAEGRDmVkHU033.png

main.py

import sys
from bisect import insort_right
from functools import partial
from os.path import basename
from webbrowser import open_new_tab

from PySide6.QtWidgets import *
from PySide6.QtCore import Slot, QDate
from PySide6.QtGui import QStandardItem, QStandardItemModel

from api import ApiError, openFile, query, saveFile
from dlgAdd import dlgAdd
from dlgCharts import dlgCharts
from dlgSettings import dlgSettings
from ui_dlgHelp import Ui_Dialog as Ui_dlgHelp
from ui_MainWindow import Ui_MainWindow

# Version info
VERSION = '1.2.1'
CHANNEL = 'stable'
BUILD_DATE = '2022-08-25'
FULL_VERSION = f'{VERSION}-{CHANNEL} ({BUILD_DATE}) on {sys.platform}'

app = QApplication(sys.argv)

class AccountBookMainWindow(QMainWindow):
    version_str = '賬本 ' + VERSION
    unsaved_tip = '*'
    SUPPORTED_FILTERS = '賬本文件(*.abf);;文本文件(*.txt);;所有文件(*.*)'

    def __init__(self, parent=None):
        # Initialize window
        super().__init__(parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.setWindowTitle('賬本 ' + VERSION)
        self.labStatus = QLabel(self)
        self.ui.statusBar.addWidget(self.labStatus)

        # Initialize table
        self.model = QStandardItemModel(0, 4, self)
        self.model.setHorizontalHeaderLabels(['日期', '事項(xiàng)', '金額', '備注'])
        self.ui.table.setModel(self.model)
        self.ui.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)

        self.__data = []
        self.on_actFile_New_triggered()
        self.ui.actEdit_Remove.setEnabled(False)

        # Connect slots
        self.ui.table.selectionModel().selectionChanged.connect(self.__selectionChanged)
        self.model.itemChanged.connect(self.__itemChanged)

    def __updateTable(self, data):
        self.model.itemChanged.disconnect(self.__itemChanged)
        self.model.setRowCount(len(data))
        for row in range(len(data)):
            for col in range(len(data[row])):
                self.model.setItem(row, col, QStandardItem(data[row][col]))
        self.model.itemChanged.connect(self.__itemChanged)

    def __openFile(self, filename):
        try:
            self.__data = openFile(filename)
        except IOError:
            QMessageBox.critical(self, '錯(cuò)誤', '文件打開(kāi)失敗。請(qǐng)稍后再試。')
        except ApiError:
            QMessageBox.critical(self, '錯(cuò)誤', '文件格式錯(cuò)誤。請(qǐng)檢查文件完整性。')
        except Exception as e:
            QMessageBox.critical(self, '錯(cuò)誤', '未知錯(cuò)誤:' + str(e.with_traceback()))
        else:
            self.ui.searchEdit.clear()
            self.__key = ''
            self.__updateTable(self.__data)
            self.labStatus.setText(filename)
            self.setWindowTitle(self.version_str)
            self.__filename = filename

    def __saveFile(self, filename):
        try:
            saveFile(filename, self.__data)
        except IOError:
            QMessageBox.critical(self, '錯(cuò)誤', '文件保存錯(cuò)誤。請(qǐng)稍后再試。')
        except Exception as e:
            QMessageBox.critical(self, '錯(cuò)誤', '未知錯(cuò)誤:' + str(e.with_traceback()))
        else:
            self.labStatus.setText('保存成功:' + filename)
            self.setWindowTitle(self.version_str)
            self.__filename = filename

    @Slot()
    def on_actFile_New_triggered(self):
        self.__filename = self.__key = ''
        self.setWindowTitle(self.unsaved_tip + self.version_str)
        self.labStatus.setText('新文件')
        self.model.setRowCount(0)
        self.__data.clear()

    @Slot()
    def on_actFile_Open_triggered(self):
        filename, _ = QFileDialog.getOpenFileName(self, '打開(kāi)', filter=self.SUPPORTED_FILTERS)
        if filename:
            self.__openFile(filename)

    @Slot()
    def on_actFile_Save_triggered(self):
        if self.__filename:
            self.__saveFile(self.__filename)
        else:
            filename, _ = QFileDialog.getSaveFileName(self, '保存', filter=self.SUPPORTED_FILTERS)
            if filename:
                self.__saveFile(filename)

    @Slot()
    def on_actFile_SaveAs_triggered(self):
        filename, _ = QFileDialog.getSaveFileName(self, '另存為', filter=self.SUPPORTED_FILTERS)
        if filename:
            self.__saveFile(filename)

    @Slot()
    def on_actFile_Settings_triggered(self):
        dlgSettings(self).exec()

    @Slot()
    def on_actHelp_About_triggered(self):
        dialog = QDialog(self)
        ui = Ui_dlgHelp()
        ui.setupUi(dialog)
        for link in (ui.githubLink, ui.giteeLink, ui.licenseLink, ui.readmeLink):
            link.clicked.connect(partial(open_new_tab, link.description()))
        ui.labVersion.setText('版本號(hào):' + FULL_VERSION)
        ui.btnUpdate.clicked.connect(partial(open_new_tab, 'https://github.com/GoodCoder666/AccountBook/releases'))
        dialog.exec()

    @Slot()
    def on_actHelp_AboutQt_triggered(self):
        QMessageBox.aboutQt(self, '關(guān)于Qt')

    @Slot()
    def on_actEdit_Add_triggered(self):
        dialog = dlgAdd(self)
        if dialog.exec() == QDialog.Accepted:
            row = dialog.getRow()
            insort_right(self.__data, row)
            self.__updateTable(query(self.__data, self.__key))
            self.setWindowTitle(self.unsaved_tip + self.version_str)

    @Slot()
    def on_actEdit_Remove_triggered(self):
        rows = list(set(map(lambda idx: idx.row(), self.ui.table.selectedIndexes())))
        for row in rows:
            self.__data.remove([self.model.item(row, col).text() for col in range(self.model.columnCount())])
        self.model.itemChanged.disconnect(self.__itemChanged)
        self.model.removeRows(rows[0], len(rows))
        self.model.itemChanged.connect(self.__itemChanged)
        self.setWindowTitle(self.unsaved_tip + self.version_str)

    def __selectionChanged(self):
        self.ui.actEdit_Remove.setEnabled(self.ui.table.selectionModel().hasSelection())

    def __itemChanged(self, item: QStandardItem):
        i, j, new = item.row(), item.column(), item.text()
        if (old := self.__data[i][j]) == new: return
        if j == 0 and not QDate.fromString(new, 'yyyy/MM/dd').isValid():
            QMessageBox.critical(self, '錯(cuò)誤', '日期格式錯(cuò)誤。')
            self.model.itemChanged.disconnect(self.__itemChanged)
            item.setText(old)
            self.model.itemChanged.connect(self.__itemChanged)
            return
        row = self.__data.pop(i)
        row[j] = new
        insort_right(self.__data, row)
        self.__updateTable(query(self.__data, self.__key))
        self.setWindowTitle(self.unsaved_tip + self.version_str)

    @Slot()
    def on_searchEdit_textChanged(self):
        self.__key = self.ui.searchEdit.text()
        self.__updateTable(query(self.__data, self.__key))

    @Slot()
    def on_actStat_Show_triggered(self):
        if self.__data:
            dlgCharts(self.__data, self).exec()
        else:
            QMessageBox.information(self, '提示', '請(qǐng)?zhí)砑訑?shù)據(jù)以使用統(tǒng)計(jì)功能。')

    def closeEvent(self, event):
        if not self.windowTitle().startswith(self.unsaved_tip): return
        filename = basename(self.__filename) if self.__filename else '新文件'
        messageBox = QMessageBox(
            parent=self, icon=QMessageBox.Warning, windowTitle='提示',
            text=f'是否要保存對(duì) {filename} 的更改?', informativeText='如果不保存,你的更改將丟失。',
            standardButtons=QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel
        )
        messageBox.setButtonText(QMessageBox.Save, '保存')
        messageBox.setButtonText(QMessageBox.Discard, '不保存')
        messageBox.setButtonText(QMessageBox.Cancel, '取消')
        reply = messageBox.exec()
        if reply == QMessageBox.Save:
            self.on_actFile_Save_triggered()
            event.accept()
        elif reply == QMessageBox.Discard:
            event.accept()
        else:
            event.ignore()

    def dragEnterEvent(self, event):
        event.accept()

    def dropEvent(self, event):
        self.__openFile(event.mimeData().text()[8:]) # [8:] is to get rid of 'file:///'

mainform = AccountBookMainWindow()
mainform.show()

sys.exit(app.exec())

完整程序下載地址:

https://download.csdn.net/download/weixin_42756970/86845889

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 文件
    +關(guān)注

    關(guān)注

    1

    文章

    598

    瀏覽量

    26120
  • 源代碼
    +關(guān)注

    關(guān)注

    96

    文章

    2953

    瀏覽量

    70684
  • python
    +關(guān)注

    關(guān)注

    58

    文章

    4889

    瀏覽量

    90327
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    選手SHOW|確認(rèn)過(guò)眼神,是我最想要的記賬APP!

    。不僅如此,圈子賬本還考慮到日常記賬習(xí)慣,開(kāi)發(fā)出了圈子功能,讓商業(yè)伙伴、家庭成員、結(jié)伴出行的小伙伴都可以在同一賬本記賬。不僅拉近了彼此之間的
    發(fā)表于 07-02 11:48

    uCOS-II-V280是當(dāng)前UCosII最新版本源代碼

    uCOS-II-V280是當(dāng)前UCosII最新版本源代碼 /***********************************************************************************************************   &n
    發(fā)表于 02-24 14:24 ?0次下載

    Python微服務(wù)開(kāi)發(fā)的源代碼合集免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是Python微服務(wù)開(kāi)發(fā)的源代碼合集免費(fèi)下載。
    發(fā)表于 09-20 08:00 ?3次下載

    區(qū)塊高度和記賬本之間有什么關(guān)聯(lián)

    區(qū)塊鏈就像是一個(gè)記賬本,而區(qū)塊就像是這個(gè)記賬本里面的一頁(yè)頁(yè)記賬紙,區(qū)塊高度就是記賬紙的頁(yè)碼,當(dāng)同時(shí)出現(xiàn)兩個(gè)相同頁(yè)碼時(shí)就會(huì)發(fā)生分叉。
    發(fā)表于 10-15 14:09 ?805次閱讀

    區(qū)塊高度與記賬本頁(yè)碼之間的關(guān)系分析

    區(qū)塊高度顧名思義就是區(qū)塊的高度,準(zhǔn)確地說(shuō)是連接在區(qū)塊鏈上的塊數(shù)。因此想要明白什么是區(qū)塊高度,我們得首先搞明白什么是區(qū)塊鏈。如果說(shuō)區(qū)塊鏈?zhǔn)?b class='flag-5'>記賬本的話,那么一個(gè)區(qū)塊就像是記賬本的每一頁(yè)一樣。
    發(fā)表于 10-16 10:20 ?973次閱讀

    python的html基本結(jié)構(gòu)及常見(jiàn)文本標(biāo)簽源代碼免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是python的html基本結(jié)構(gòu)及常見(jiàn)文本標(biāo)簽源代碼免費(fèi)下載。
    發(fā)表于 12-04 08:00 ?0次下載
    <b class='flag-5'>python</b>的html基本結(jié)構(gòu)及常見(jiàn)文本標(biāo)簽<b class='flag-5'>源代碼</b>免費(fèi)下載

    Python深度學(xué)習(xí)2018的源代碼合集免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是Python深度學(xué)習(xí)2018的源代碼合集免費(fèi)下載。
    發(fā)表于 01-16 10:25 ?70次下載

    python實(shí)現(xiàn)目標(biāo)檢測(cè)的源代碼免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是python實(shí)現(xiàn)目標(biāo)檢測(cè)的源代碼免費(fèi)下載
    發(fā)表于 04-09 08:00 ?6次下載
    <b class='flag-5'>python</b>實(shí)現(xiàn)目標(biāo)檢測(cè)的<b class='flag-5'>源代碼</b>免費(fèi)下載

    python文件讀取的源代碼免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是python文件讀取的源代碼免費(fèi)下載。
    發(fā)表于 08-07 17:14 ?21次下載
    <b class='flag-5'>python</b>文件讀取的<b class='flag-5'>源代碼</b>免費(fèi)下載

    使用Python按行讀文件的源代碼免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是使用Python按行讀文件的源代碼免費(fèi)下載。
    發(fā)表于 10-22 17:57 ?12次下載
    使用<b class='flag-5'>Python</b>按行讀文件的<b class='flag-5'>源代碼</b>免費(fèi)下載

    Python版警察抓小偷游戲源代碼

    Python版警察抓小偷游戲源代碼,有多個(gè)難度級(jí)別,直接運(yùn)行g(shù)ame.py,輸入難度級(jí)別(1-13)。不同的難度等級(jí)對(duì)應(yīng)不同的圖形。
    的頭像 發(fā)表于 02-24 09:56 ?3315次閱讀
    <b class='flag-5'>Python</b>版警察抓小偷游戲<b class='flag-5'>源代碼</b>

    Python版超市管理系統(tǒng)源代碼

    Python版超市管理系統(tǒng)源代碼,基于django+mysql安裝步驟
    的頭像 發(fā)表于 02-24 09:59 ?3750次閱讀
    <b class='flag-5'>Python</b>版超市管理系統(tǒng)<b class='flag-5'>源代碼</b>

    20個(gè)解決日常問(wèn)題的Python代碼片段!

    在本文中,將分享20 個(gè) Python 代碼片段,以幫助你應(yīng)對(duì)日常編程挑戰(zhàn)。你可能已經(jīng)知道其中一些片段,但有些其他片段對(duì)你來(lái)說(shuō)可能是新的。趕緊使用這些有用的 Python
    的頭像 發(fā)表于 03-13 09:40 ?1626次閱讀

    Python編程實(shí)戰(zhàn)(源代碼)

    [源代碼]Python編程實(shí)戰(zhàn) 妙趣橫生的項(xiàng)目之旅
    發(fā)表于 06-06 17:49 ?4次下載

    [源代碼]Python算法詳解

    [源代碼]Python算法詳解[源代碼]Python算法詳解
    發(fā)表于 06-06 17:50 ?8次下載
    方城县| 霞浦县| 湖南省| 泰和县| 甘孜县| 石景山区| 沙洋县| 宜兰市| 贵德县| 台南县| 习水县| 乌兰县| 威远县| 石首市| 寻甸| 鱼台县| 怀安县| 房产| 海宁市| 晋江市| 岱山县| 尼玛县| 尚志市| 弥渡县| 将乐县| 宜兴市| 合肥市| 赤城县| 宁南县| 台南市| 平山县| 新津县| 北海市| 济阳县| 嘉定区| 横峰县| 秦安县| 定结县| 那坡县| 沭阳县| 哈尔滨市|