如何在PyQt5中实现可持久化存储的界面可见按钮点击计数器
PyQt5 计数持久化实现方案
方案1:使用Qt自带QSettings(推荐,无需手动处理文件IO)
QSettings是Qt原生提供的配置持久化工具,跨平台自动处理配置文件存储路径,无需手动管理文件读写。
步骤1:导入依赖
在文件头部导入对应模块:
from PyQt5 import QtCore
步骤2:初始化时读取历史计数
修改setup_gui中计数器初始化逻辑,不要直接写死为0,从本地配置读取历史值:
def setup_gui(self): pg.setConfigOptions(antialias=True) self.setWindowTitle('Interface') self.setWindowIcon(QtGui.QIcon('web.png')) # 初始化配置对象,两个参数可自定义为你的组织名、应用名 self.settings = QtCore.QSettings("MyOrg", "ClickCounter") # 读取历史计数,不存在则默认返回0,指定类型为int self.yes_counter = self.settings.value("yes_count", 0, type=int) self.no_counter = self.settings.value("no_count", 0, type=int) self.plot_layout = QtWidgets.QVBoxLayout() self.btn_layout = QtWidgets.QVBoxLayout() self.main_layout = QtWidgets.QHBoxLayout() self.btn = QtWidgets.QPushButton("Yes") self.btn.setStyleSheet("background-color : red; color: white") self.btn.clicked.connect(self.yes) self.no_btn = QtWidgets.QPushButton("No") self.no_btn.setStyleSheet("background-color : green; color: white") self.no_btn.clicked.connect(self.no) # 计数标签初始化 self.yes_lbl = QtWidgets.QLabel() self.no_lbl = QtWidgets.QLabel() self.btn_layout.addWidget(self.yes_lbl) self.btn_layout.addWidget(self.no_lbl) # 初始显示计数 self.yes_lbl.setText(f"Yes Count:{self.yes_counter}") self.no_lbl.setText(f"No Count:{self.no_counter}") # 后续布局组装逻辑...
步骤3:修改点击事件,同步更新持久化存储和界面显示
注意你原代码中yes函数缩进错误,写在了setup_gui函数内部,需要调整为类的同级方法:
def yes(self): self.yes_counter += 1 # 写入配置完成持久化 self.settings.setValue("yes_count", self.yes_counter) # 刷新界面标签显示 self.yes_lbl.setText(f"Yes Count:{self.yes_counter}") print("Yes", self.yes_counter) def no(self): self.no_counter += 1 # 写入配置完成持久化 self.settings.setValue("no_count", self.no_counter) # 刷新界面标签显示 self.no_lbl.setText(f"No Count:{self.no_counter}") print("No", self.no_counter)
方案2:使用本地JSON文件存储
如果不想依赖Qt的API,也可以用普通json文件存储计数:
初始化读取代码
import json import os # 计数文件存储路径,可自定义 COUNT_FILE = "click_count.json" if os.path.exists(COUNT_FILE): with open(COUNT_FILE, "r", encoding="utf-8") as f: count_data = json.load(f) self.yes_counter = count_data.get("yes_count", 0) self.no_counter = count_data.get("no_count", 0) else: self.yes_counter = 0 self.no_counter = 0
点击事件中同步写入文件
每次计数更新后执行以下代码即可完成持久化:
with open(COUNT_FILE, "w", encoding="utf-8") as f: json.dump({"yes_count": self.yes_counter, "no_count": self.no_counter}, f)
内容的提问来源于stack exchange,提问作者ale_ish
相关产品推荐
相关产品推荐

