Как мне динамически изменить текст кнопки в tkinter? - PullRequest
3 голосов
/ 14 ноября 2011

У меня есть выпадающее меню и кнопка. Я пытаюсь изменить текст на кнопке в соответствии с выбором в раскрывающемся меню. Я использовал трассировку, но выдает ошибку:

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()

Есть идеи? Спасибо.

1 Ответ

1 голос
/ 14 ноября 2011

Измените определение вашей функции change_button_text, чтобы принимать параметры. Функции обратного вызова, вызываемые из функции trace, всегда получают три аргумента: имя переменной, индекс и режим. Ничто из этого не является действительно интересным, но ваша функция должна соответствовать этой сигнатуре для обратного вызова для работы.

Чтобы исправить это, измените функцию обратного вызова, чтобы она выглядела так:

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

Если вы предпочитаете это, вы также можете поместить lambda в вызов trace, чтобы сохранить определение функции чистым (в духе «зачем определять переменные там, если вы их не используете») ):

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

Ваш обратный вызов может остаться в этом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...