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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 20:36:06