Python中如何检测keybinds.json存在时跳过初始配置窗口?
解决CustomTkinter按键模拟程序的窗口分支逻辑问题
核心思路
通过检查keybinds.json文件是否存在来决定启动对应窗口:
- 文件存在:直接启动加载配置的主窗口
w,读取已有按键设置 - 文件不存在:启动初始设置窗口
app,生成默认配置文件
修改后的完整代码示例
import customtkinter as ctk import json import os # 定义按键配置文件路径 KEYBINDS_FILE = "keybinds.json" def load_keybinds(): """从JSON文件加载按键配置""" with open(KEYBINDS_FILE, "r", encoding="utf-8") as f: return json.load(f) def save_default_keybinds(): """生成默认按键配置并保存到JSON文件""" default_keybinds = { "jump": "Space", "attack": "LeftMouse", "dash": "LeftShift" # 可根据需求添加更多默认按键 } with open(KEYBINDS_FILE, "w", encoding="utf-8") as f: json.dump(default_keybinds, f, indent=4) def create_main_window(keybinds): """创建读取配置后的主窗口""" w = ctk.CTk() w.title("游戏按键模拟器") w.geometry("400x300") # 显示已加载的按键配置 ctk.CTkLabel(w, text="当前按键配置").pack(pady=10) for action, key in keybinds.items(): ctk.CTkLabel(w, text=f"{action}: {key}").pack(pady=5) # 模拟按键功能示例 def simulate_key(action): print(f"模拟按下: {keybinds[action]}") # 替换为实际按键模拟逻辑(如使用pyautogui库) ctk.CTkButton(w, text="模拟跳跃", command=lambda: simulate_key("jump")).pack(pady=5) ctk.CTkButton(w, text="模拟攻击", command=lambda: simulate_key("attack")).pack(pady=5) w.mainloop() def create_setup_window(): """创建初始设置窗口,让用户配置按键并保存""" app = ctk.CTk() app.title("按键配置设置") app.geometry("400x300") # 下拉框可选按键列表(可根据游戏需求扩展) key_options = ["Space", "LeftMouse", "RightMouse", "LeftShift", "W", "A", "S", "D"] # 存储用户选择的按键变量 user_keybinds = {} # 跳跃按键设置项 jump_frame = ctk.CTkFrame(app) jump_frame.pack(pady=5, fill="x", padx=20) ctk.CTkLabel(jump_frame, text="跳跃").pack(side="left", padx=10) jump_var = ctk.StringVar(value="Space") jump_dropdown = ctk.CTkComboBox(jump_frame, values=key_options, variable=jump_var) jump_dropdown.pack(side="right", padx=10) user_keybinds["jump"] = jump_var # 攻击按键设置项 attack_frame = ctk.CTkFrame(app) attack_frame.pack(pady=5, fill="x", padx=20) ctk.CTkLabel(attack_frame, text="攻击").pack(side="left", padx=10) attack_var = ctk.StringVar(value="LeftMouse") attack_dropdown = ctk.CTkComboBox(attack_frame, values=key_options, variable=attack_var) attack_dropdown.pack(side="right", padx=10) user_keybinds["attack"] = attack_var # 保存配置并切换到主窗口 def save_and_launch(): final_keybinds = {action: var.get() for action, var in user_keybinds.items()} with open(KEYBINDS_FILE, "w", encoding="utf-8") as f: json.dump(final_keybinds, f, indent=4) app.destroy() create_main_window(final_keybinds) ctk.CTkButton(app, text="保存配置并启动", command=save_and_launch).pack(pady=20) app.mainloop() # 程序入口:根据配置文件状态选择启动窗口 if __name__ == "__main__": if os.path.exists(KEYBINDS_FILE): # 配置文件存在,尝试加载并启动主窗口 try: keybinds = load_keybinds() create_main_window(keybinds) except json.JSONDecodeError: # 处理配置文件损坏的情况,重新进入设置流程 print("配置文件损坏,重新设置按键") create_setup_window() else: # 配置文件不存在,生成默认配置后启动设置窗口 save_default_keybinds() create_setup_window()
关键修改说明
- 文件存在性判断:用
os.path.exists(KEYBINDS_FILE)在程序启动时检查配置文件状态 - 分支执行逻辑:
- 文件存在:直接读取配置并启动主窗口,跳过初始设置流程
- 文件不存在:先生成默认配置文件,再启动设置窗口
- 异常防护:添加
JSONDecodeError捕获,避免配置文件损坏导致程序崩溃 - 代码解耦:将窗口创建、配置读写拆分为独立函数,便于后续功能扩展和维护
内容的提问来源于stack exchange,提问作者aksunix
相关产品推荐
相关产品推荐

