如何使用tkinter中的按钮在Entry中输入数字

时间:2018-05-25 16:29:33

标签: python python-3.x tkinter tkinter-entry

我想通过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;

2 个答案:

答案 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)

那说你的代码有些问题在这里没用。

  1. 关注return var.insert(0, 4)。这个return实际上没有在这里做任何有用的事情,因为它试图做的是返回调用var.insert(0, 4)的结果并将其分配给所谓的函数。这有两个主要问题。 var.insert(0, 4)不会返回一个有用的值来返回命令来帮助,第二个你不能将结果返回给它没有用的绑定。而是一起删除所有返回,只需编写用于更新StringVar的命令。在这种情况下var.set(4)

  2. 关注var_entry = tk.Entry(win,text='var',textvariable=var)。这里text = 'var' 100%没用。在一个输入字段中,参数text实际上是textvariable的缩写,所以这里发生的是您将字符串var分配给文本变量,然后立即将textvariable重新分配给StringVar ()。因此,让我们将该行重写为var_entry = tk.Entry(win, textvariable=var)

  3. 看着button1 = tk.Button(win,text = '1' ,textvariable = 1)你在这里做的事情没什么可帮助的。 textvariable = 1在这里没有任何意义。所以让我们删除它。将该行重写为button1 = tk.Button(win, text='1')

  4. 查看button1.bind("<Button-1>", handle_button)对于按钮可以使用command参数处理的内容来说是过分的。完全删除此行并重写button1以包含该命令。像这样:button1 = tk.Button(win, text='1', command=handle_button)

  5. 查看def window():我们可以删除此功能并获取其内容并将其移至全局名称空间。现在使用函数设置GUI没有任何好处,所以我们可以删除额外的步骤。

  6. 尽管如此,你应该有这样的东西:

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

    在进行所有这些更改时,我们将您的代码缩减一半以获得相同的结果,并且阅读起来更清晰。