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

如何同时运行input()与buttons()?优先无需额外第三方库

重构代码实现控制台输入与GUI按钮并行选择

完整重构代码

import threading
import tkinter as tk

# 共享变量存储用户选择,0表示未选择
user_choice = 0
# 线程锁,确保对user_choice的操作线程安全
choice_lock = threading.Lock()

def on_button_click(n):
    global user_choice
    with choice_lock:
        user_choice = n
    # 关闭GUI窗口
    root.destroy()

def run_gui():
    global root
    root = tk.Tk()
    root.geometry('250x50')
    
    btn_attack1 = tk.Button(root, text='Attack', command=lambda: on_button_click(1), fg='red')
    btn_attack1.pack(side=tk.LEFT)
    
    btn_regen = tk.Button(root, text='Regen', command=lambda: on_button_click(2), fg='red')
    btn_regen.pack(side=tk.LEFT)
    
    btn_attack2 = tk.Button(root, text='Attack', command=lambda: on_button_click(3))
    btn_attack2.pack(side=tk.RIGHT)
    
    btn_shield = tk.Button(root, text='Shield', command=lambda: on_button_click(4), fg='blue')
    btn_shield.pack(side=tk.RIGHT)
    
    root.mainloop()

def run_input():
    global user_choice
    while True:
        try:
            choice = int(input('Choose 1/2/3/4: '))
            if 1 <= choice <=4:
                with choice_lock:
                    user_choice = choice
                # 关闭GUI窗口(如果还存在)
                if 'root' in globals() and root.winfo_exists():
                    root.destroy()
                break
            else:
                print("请输入1-4之间的数字")
        except ValueError:
            print("输入无效,请输入整数")

def main():
    # 启动GUI线程
    gui_thread = threading.Thread(target=run_gui)
    gui_thread.start()
    
    # 启动控制台输入线程
    input_thread = threading.Thread(target=run_input)
    input_thread.start()
    
    # 等待两个线程结束
    gui_thread.join()
    input_thread.join()
    
    # 输出最终选择
    with choice_lock:
        print(f"用户选择了:{user_choice}")

if __name__ == "__main__":
    main()

关键修改说明

  1. 线程分离执行逻辑:将GUI窗口和控制台输入分别放到独立线程,彻底解决串行阻塞问题,两者启动后同时等待用户操作。
  2. 线程安全的共享变量:用threading.Lock保护user_choice,避免多线程同时修改导致的数据异常。
  3. 双向同步结束机制:无论用户点击按钮还是输入合法数字,都会立即设置选择值并关闭GUI窗口,触发两个线程终止。
  4. 输入合法性校验:增加了非整数输入、超出范围输入的错误提示,提升交互体验。
  5. 清理冗余代码:移除了原代码中未使用的asyncio、multiprocessing导入,简化函数逻辑,避免重复创建窗口的问题。

原代码问题根源

原代码直接串行调用inputchoose()和buttons(),input()会阻塞主线程,导致GUI窗口必须等输入完成才会启动;同时反复调用buttons()会重复创建窗口,全局变量管理无线程安全保护,逻辑混乱。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 03:37:49