【问题标题】:How do I change dynamically the text of a button in tkinter?如何在 tkinter 中动态更改按钮的文本?
【发布时间】:2011-11-14 12:29:14
【问题描述】:

我有一个下拉菜单和一个按钮。我正在尝试根据下拉菜单中的选择更改按钮上的文本。我使用了跟踪,但给了我这个错误:

TypeError: change_button_text() takes no arguments (3 given)

这是一个例子:

from Tkinter import*
import Tkinter as tk
import os


def change_button_text():
    buttontext.set(widget1.get())

app=Tk()
app.title("Example")
app.geometry('200x200+200+200')

widget1 = StringVar()
widget1.set('Numbers')
files =["one",'two','three']
widget1DropDown = OptionMenu(app, widget1, *files)
widget1DropDown.config(bg = 'white',foreground='black',font=("Times",16,"italic"))
widget1DropDown["menu"].config(bg = 'white',font=("Times",12,"italic"))
widget1DropDown.pack()
widget1.trace("w", change_button_text)


buttontext=StringVar()
buttontext.set('Zero')
button1=Button(app,textvariable=buttontext,font=("Times", 16),width=15,borderwidth=5)
button1.pack(side=LEFT, padx=5,pady=8)


app.mainloop()

有什么想法吗?谢谢。

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    更改change_button_text 的函数定义以接受参数。从trace 函数调用的回调函数将始终接收三个参数:变量名称、索引和模式。这些都不是真正有趣的,但是您的函数需要匹配此签名才能使回调起作用。

    要修复它,请将回调函数更改为如下所示:

    def change_button_text(name, index, mode):
        buttontext.set(widget1.get())
    

    如果您愿意,您也可以在 trace 调用中添加 lambda 以保持函数定义干净(类似于“如果不使用变量,为什么要在那里定义变量”) ):

    widget1.trace("w", lambda n, i, m: change_button_text())
    

    在这种情况下,您的回调可以保持原样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-29
      • 2017-01-30
      • 1970-01-01
      • 1970-01-01
      • 2021-03-20
      • 2021-04-19
      • 1970-01-01
      • 2016-01-01
      相关资源
      最近更新 更多