我想通过tkinter中的按钮添加数字(只有4个数字)。 我试过这段代码,但它没有用。我需要一些建议。
import tkinter as tk
win = tk.Tk()
var = tk.StringVar()
var_entry = tk.Entry(win,text='var',textvariable=var)
def handle_button(event):
return var.insert(0,4)
def window():
global win
var_entry.grid(row =1 ,column =2)
button1 = tk.Button(win,text = '1' ,textvariable = 1)
button1.bind("<Button-1>", handle_button)
button1.grid(row = 2 , column = 0)
# similarly I defined all the buttons.
windows()
win.mainloop()
它显示的错误是:
AttributeError:&#39; StringVar&#39;对象没有属性&#39;插入&#39;
答案 0 :(得分:1)
我尝试了这个,它也有效。
import tkinter as tk
win = tk.Tk()
var = tk.StringVar()
var_entry = tk.Entry(win,text='var',textvariable=var)
var_entry.grid()
def handle_button(event):
button_arg = event.widget['text']
var_entry.insert(0,'end')
button1 = tk.Button(win,text = '1')
button1.bind("<Button-1>", handle_button)
button1.grid()
# similarly I defined all the buttons.
windows()
win.mainloop()
答案 1 :(得分:0)
要获得您正在寻找的行为,您需要做的就是:
改变这个:
def handle_button(event):
return var.insert(0,4)
对此:
def handle_button(event):
var.set(4)
那说你的代码有些问题在这里没用。
关注return var.insert(0, 4)
。这个return
实际上没有在这里做任何有用的事情,因为它试图做的是返回调用var.insert(0, 4)
的结果并将其分配给所谓的函数。这有两个主要问题。 var.insert(0, 4)
不会返回一个有用的值来返回命令来帮助,第二个你不能将结果返回给它没有用的绑定。而是一起删除所有返回,只需编写用于更新StringVar的命令。在这种情况下var.set(4)
。
关注var_entry = tk.Entry(win,text='var',textvariable=var)
。这里text = 'var'
100%没用。在一个输入字段中,参数text
实际上是textvariable
的缩写,所以这里发生的是您将字符串var
分配给文本变量,然后立即将textvariable重新分配给StringVar ()。因此,让我们将该行重写为var_entry = tk.Entry(win, textvariable=var)
。
看着button1 = tk.Button(win,text = '1' ,textvariable = 1)
你在这里做的事情没什么可帮助的。 textvariable = 1
在这里没有任何意义。所以让我们删除它。将该行重写为button1 = tk.Button(win, text='1')
查看button1.bind("<Button-1>", handle_button)
对于按钮可以使用command
参数处理的内容来说是过分的。完全删除此行并重写button1
以包含该命令。像这样:button1 = tk.Button(win, text='1', command=handle_button)
查看def window():
我们可以删除此功能并获取其内容并将其移至全局名称空间。现在使用函数设置GUI没有任何好处,所以我们可以删除额外的步骤。
尽管如此,你应该有这样的东西:
import tkinter as tk
win = tk.Tk()
var = tk.StringVar()
var_entry = tk.Entry(win, textvariable=var)
var_entry.grid(row=1, column=2)
def handle_button():
var.set(4)
tk.Button(win, text='1', command=handle_button).grid(row=2, column=0)
win.mainloop()
我不确定你是否听说过lambda
,但是可以在这里使用它来减少我们的代码。 lambda
用于创建匿名函数,这意味着我们可以创建一个不需要我们按名称定义函数的行函数。
因此,如果我们删除def handle_button():
函数,然后我们将button1
命令更改为lambda,我们可以为自己保存2行代码,这些代码行并没有真正帮助我们或提高可读性。
新的最终代码应如下所示:
import tkinter as tk
win = tk.Tk()
var = tk.StringVar()
var_entry = tk.Entry(win, textvariable=var)
var_entry.grid(row=1, column=2)
tk.Button(win, text='1', command=lambda: var.set(4)).grid(row=2, column=0)
win.mainloop()
在进行所有这些更改时,我们将您的代码缩减一半以获得相同的结果,并且阅读起来更清晰。