You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

关键修改说明

  1. 文件存在性判断:用os.path.exists(KEYBINDS_FILE)在程序启动时检查配置文件状态
  2. 分支执行逻辑:
    • 文件存在:直接读取配置并启动主窗口,跳过初始设置流程
    • 文件不存在:先生成默认配置文件,再启动设置窗口
  3. 异常防护:添加JSONDecodeError捕获,避免配置文件损坏导致程序崩溃
  4. 代码解耦:将窗口创建、配置读写拆分为独立函数,便于后续功能扩展和维护

内容的提问来源于stack exchange,提问作者aksunix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 11:31:02