如何使用 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)
那是说您的代码有一些错误在这里没有用。
正在查看return var.insert(0, 4)
。这个 return
实际上在这里没有做任何有用的事情,因为它试图做的是 return 调用 var.insert(0, 4)
并将其分配给调用该函数的结果。 2个主要问题。 var.insert(0, 4)
不会 return 对 return 命令有帮助的有用值,第二,你不能 return 绑定它没有用的结果。而是将 return 一起删除,只编写用于更新 StringVar 的命令。在这种情况下 var.set(4)
.
正在查看var_entry = tk.Entry(win,text='var',textvariable=var)
。 text = 'var'
在这里 100% 没用。在输入字段中,参数 text
实际上是 textvariable
的缩写,所以这里发生的事情是将字符串 var
分配给文本变量,然后立即将文本变量重新分配给 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():
我们可以删除这个函数并获取它的内容并将它移动到全局名称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()
我想通过 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)
那是说您的代码有一些错误在这里没有用。
正在查看
return var.insert(0, 4)
。这个return
实际上在这里没有做任何有用的事情,因为它试图做的是 return 调用var.insert(0, 4)
并将其分配给调用该函数的结果。 2个主要问题。var.insert(0, 4)
不会 return 对 return 命令有帮助的有用值,第二,你不能 return 绑定它没有用的结果。而是将 return 一起删除,只编写用于更新 StringVar 的命令。在这种情况下var.set(4)
.正在查看
var_entry = tk.Entry(win,text='var',textvariable=var)
。text = 'var'
在这里 100% 没用。在输入字段中,参数text
实际上是textvariable
的缩写,所以这里发生的事情是将字符串var
分配给文本变量,然后立即将文本变量重新分配给 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():
我们可以删除这个函数并获取它的内容并将它移动到全局名称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()