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

如何让tkinter的多个Button调用同一函数并传入不同参数

问题根因

你代码里的核心问题出在按钮command参数的绑定逻辑上:
当你写command=choose("r")时,Python会在界面初始化阶段直接执行choose("r")函数,并将函数的返回值(你的choose没有写return,默认返回None)绑定给点击事件。所以程序运行时函数会先自动跑一次,后续点击按钮没有任何反应。

解决方法

有两种常用的方案实现按钮点击时才传参调用函数:

方案1:使用lambda匿名函数包装(最常用)

把按钮的command参数改为匿名函数,点击按钮时才会触发内部的choose调用:

Button(root, text="Rock", command=lambda: choose("r")).pack()
Button(root, text="Paper", command=lambda: choose("p")).pack()
Button(root, text="Scissors", command=lambda: choose("s")).pack()

方案2:使用functools.partial绑定参数

如果需要批量生成按钮,用partial写法更简洁:
先导入模块:

from functools import partial

再修改按钮定义:

Button(root, text="Rock", command=partial(choose, "r")).pack()
Button(root, text="Paper", command=partial(choose, "p")).pack()
Button(root, text="Scissors", command=partial(choose, "s")).pack()

其他代码问题修正

  • random.randrange(1,3)是左闭右开区间,只能生成1、2两个值,你逻辑里判断了Computer等于3的情况永远不会触发,需要改为random.randrange(1,4)才能生成1、2、3三个值
  • 你代码里直接写的loose、win是未定义的标识符,需要替换为你实际的输赢逻辑(比如弹窗提示、打印结果等)
  • Python命名规范里变量名建议小写开头,Computer可以改为computer更符合惯例

完整修正参考代码

import random
from tkinter import Tk, Button, messagebox as msg

root = Tk()
root.title("石头剪刀布")

def choose(what):
    computer = random.randrange(1,4)
    # 数字转对应选项简化判断逻辑
    opt_map = {1:"r", 2:"p", 3:"s"}
    com_choose = opt_map[computer]
    # 输赢规则字典,避免多层if嵌套
    win_rule = {"r":"s", "p":"r", "s":"p"}
    if what == com_choose:
        msg.showinfo("结果", "平局!")
    elif win_rule[what] == com_choose:
        msg.showinfo("结果", "你赢了!")
    else:
        msg.showinfo("结果", "你输了!")


Button(root, text="Rock", command=lambda: choose("r")).pack(padx=20, pady=5)
Button(root, text="Paper", command=lambda: choose("p")).pack(padx=20, pady=5)
Button(root, text="Scissors", command=lambda: choose("s")).pack(padx=20, pady=5)

root.mainloop()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 00:18:03