Python如何将用户输入绑定到脚本函数变量并对接数据库
实现方案
核心思路
不需要为每个按钮单独定义函数,也不需要让函数名和按钮文本匹配,将发送逻辑封装为接收联系人、消息内容参数的通用函数即可。存储优先使用轻量JSON文件,无需复杂数据库即可完成持久化,学习成本更低。
具体实现步骤
1. 定义配置存储结构
每个自定义按钮仅需存储3个核心字段:
- 按钮显示名称
- 消息接收人
- 待发送的消息内容
程序启动时读取JSON文件的配置,动态生成按钮,新增按钮时直接写入JSON文件即可。
2. 修改后的完整可运行代码
import PySimpleGUI as sg import sys import subprocess import json from playsound import playsound # 配置文件存储路径 CONFIG_PATH = "custom_buttons.json" # --- 通用发送逻辑,所有按钮复用这一个函数 --- def send_message(people, msg): repeat = 1 applescript = ( """ set people to "{1}" tell application "Messages" repeat with myBuddy in buddies if name of myBuddy is in people then send "{2}" to myBuddy end if end repeat end tell """.format(repeat, people, msg) ) args = [ item for x in [("-e", l.strip()) for l in applescript.split("\n") if l.strip() != ""] for item in x ] proc = subprocess.Popen(["osascript"] + args, stdout=subprocess.PIPE) proc.stdout.read().strip() # --- 读取本地存储的按钮配置 --- def load_config(): try: with open(CONFIG_PATH, "r", encoding="utf-8") as f: return json.load(f) except FileNotFoundError: # 首次运行没有配置文件,返回默认配置 return [{"btn_name": "ON CALL", "people": "FrstNm LstNm", "msg": "On a Call"}] # --- 保存按钮配置到本地 --- def save_config(config): with open(CONFIG_PATH, "w", encoding="utf-8") as f: json.dump(config, f, ensure_ascii=False, indent=2) # --- 弹出新增按钮的输入窗口 --- def show_add_btn_window(): add_layout = [ [sg.Text("按钮名称:"), sg.Input(key="-BTN_NAME-")], [sg.Text("接收联系人:"), sg.Input(key="-PEOPLE-")], [sg.Text("发送消息内容:"), sg.Input(key="-MSG-")], [sg.Button("确认添加"), sg.Button("取消")] ] window = sg.Window("新增自定义按钮", add_layout, modal=True) event, values = window.read() window.close() if event == "确认添加": # 简单校验输入不为空 if all([values["-BTN_NAME-"].strip(), values["-PEOPLE-"].strip(), values["-MSG-"].strip()]): return { "btn_name": values["-BTN_NAME-"].strip(), "people": values["-PEOPLE-"].strip(), "msg": values["-MSG-"].strip() } return None # --- 生成主界面布局 --- def build_main_layout(config): # 动态生成按钮行 btn_rows = [[sg.Button(item["btn_name"]) for item in config]] # 底部加新增按钮和退出按钮 btn_rows.append([sg.Button("+ 新增自定义按钮"), sg.Button("退出")]) return btn_rows def main(): sg.SetOptions(font='Any') sg.theme('LightBlue') # 加载配置生成界面 config = load_config() layout = build_main_layout(config) window = sg.Window('Text', layout, auto_size_buttons=False, alpha_channel=0.85, keep_on_top=True) # 把配置转成按钮名到参数的映射,方便事件触发时快速查找 btn_config_map = {item["btn_name"]: item for item in config} while True: event, values = window.Read() if event in (sg.WIN_CLOSED, "退出"): break # 触发新增按钮逻辑 if event == "+ 新增自定义按钮": new_btn = show_add_btn_window() if new_btn: config.append(new_btn) save_config(config) # 刷新主界面 window.close() main() return # 触发发送消息逻辑,所有自定义按钮都走这个分支 if event in btn_config_map: # 你原来的sound()函数自行补全逻辑即可 # playsound("xxx.mp3") send_message(btn_config_map[event]["people"], btn_config_map[event]["msg"]) window.close() sys.exit() if __name__ == "__main__": main()
相关技巧
- 所有可配置的变量都不要硬编码在函数里,通过参数传递实现逻辑复用
- 轻量持久化场景优先用JSON,比关系型数据库上手快,CRUD操作直接对应Python字典和列表操作,无需学习SQL语法
- PySimpleGUI的按钮事件默认返回按钮文本,直接用事件值匹配配置即可,不需要额外做事件绑定
- 后续如果需要扩展更多配置项(比如定时发送、重复次数),直接在字典里加字段即可,不需要修改核心逻辑
内容的提问来源于stack exchange,提问作者punkroast
相关产品推荐
相关产品推荐

