对于屏幕键盘,我需要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”时,按钮它将以新字符串作为参数发送到下一个函数(这实际上有效)。
答案 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 += letter
中letter_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小部件,其他人会将父小部件传递给类,以便它可以知道在哪里附加所有元素等等。)我尝试展示的是如何使用类作为数据的容器而不是全局命名空间。