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

How to enter number in Entry using button in tkinter

我想通过 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: 'StringVar' object has no attribute 'insert'

要获得您正在寻找的行为,您需要做的是:

改变这个:

def handle_button(event):
    return var.insert(0,4)

为此:

def handle_button(event):
    var.set(4)

那是说您的代码有一些错误在这里没有用。

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

  2. 正在查看var_entry = tk.Entry(win,text='var',textvariable=var)text = 'var' 在这里 100% 没用。在输入字段中,参数 text 实际上是 textvariable 的缩写,所以这里发生的事情是将字符串 var 分配给文本变量,然后立即将文本变量重新分配给 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():我们可以删除这个函数并获取它的内容并将它移动到全局名称space。现在使用函数设置 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()

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

我试过这个,也有效。

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

""" 下面的代码限制 ttk.Entry 小部件接收类型 'str'。"""

import tkinter as tk
from tkinter import ttk


def is_type_int(*args):
  item = var.get()
  try:
    item_type = type(int(item))
    if item_type == type(int(1)):
      print(item)
      print(item_type)
  except:
    ent.delete(0, tk.END)


root = tk.Tk()
root.geometry("300x300")

var = tk.StringVar()

ent = ttk.Entry(root, textvariable=var)
ent.pack(pady=20)

var.trace("w", is_type_int)

root.mainloop()