Button excecutes命令一次(Tkinter)

时间:2015-10-28 15:25:22

标签: python function button tkinter command

对于屏幕键盘,我需要26个按钮,这些按钮都将键盘中的一个字母添加到字符串中。我得到的第一个问题是按下按钮后字符串没有保存。例如,用户按下A' A' A'得到打印,应该存储。用户现在按下' B' B' B'得到印刷和' A'离开了。第二个问题是按钮仅在第一次执行该功能。到目前为止,我的代码如下:

window = Tk()
window.attributes('-fullscreen', True)
window.configure(background='yellow')
master = Frame(window)
master.pack()

e = Entry(master)
e.pack()
e.focus_set()

nieuw_station = ""

def printanswer():
  global nieuw_station
  nieuw_station = e.get()
  print(nieuw_station)
  gekozen_station(nieuw_station)


invoeren = Button(master, text="Invoeren", width=10, command=printanswer)
invoeren.pack()

def letter_toevoegen(nieuw_station, letter):
    nieuw_station += letter
    print(nieuw_station)
    return nieuw_station

a = Button(master, text="A", width=1, command=letter_toevoegen(nieuw_station, "a"))
a.pack()

b = Button(master, text="B", width=1, command=letter_toevoegen(nieuw_station, "b"))
b.pack()

window.mainloop()

预期输出为:用户按下A',' A'得到打印&存储。现在,用户按下' B' AB'得到打印&存储。最后,用户按下' C' ABC'现在得到打印&存储。每当用户按下“invoeren”时,按钮它将以新字符串作为参数发送到下一个函数(这实际上有效)。

1 个答案:

答案 0 :(得分:0)

你有一些问题。首先,command希望您传递函数,但是您传递了函数的返回值。一个解决方法是将其包装在lambda

a = Button(master, text="A", width=1, command=lambda: letter_toevoegen(nieuw_station, "a"))
a.pack()

其次,我不知道nieuw_station.close()nieuw_station.open()正在做什么 - 字符串没有这些方法。

第三,字符串是不可变的,因此当您在nieuw_station += letterletter_toevoegen时,该更改将不会在函数外部持续存在。

实际让它持久化的一种方法是使用global nieuw_station - 然后你可能无法将其传递给函数。

话虽如此,当您看到global语句时,10次中有9次,这是使用类的更好方法。在这里,我们可以创建一个添加按钮并跟踪状态的类。

class App(object):
    def __init__(self):
        self.nieuw_station = ''

    def add_buttons(self):
        a = Button(master, text="A", width=1, command=lambda: self.letter_toevoegen("a"))
        a.pack()
        # ...

    def letter_toevoegen(self, letter):
        time.sleep(2)
        self.nieuw_station += letter
        print(self.nieuw_station)
        return self.nieuw_station

当然,我们也在这里添加printanswer并添加"打印答案"使用该类的代码如下所示:

app = App()
app.add_buttons()
window.mainloop()

这里有许多变种,你会看到漂浮在周围。 (有些人喜欢App继承tkinter.Tk或其他tkinter小部件,其他人会将父小部件传递给类,以便它可以知道在哪里附加所有元素等等。)我尝试展示的是如何使用类作为数据的容器而不是全局命名空间。