Python3.7.2 Tkinter Entry框限定输入数字的操作
本文介绍在Python3.7.2中使用Tkinter库的Entry组件限制仅能输入数字的方法。通过结合StringVar、validate、validatecommand及isdigit函数,实现输入内容的实时校验与拦截,并演示如何注册回调函数以处理非法输入,同时附带界面背景处理的注意事项。
网络上搜索相关方案时,发现许多方法对于初学者而言并不适用,因此这里分享一种较为简便的替代思路。
from tkinter import *
from tkinter import messagebox
root=Tk()
def com():
try:
float(e1.get())#获取e1的值,转为浮点数,如果不能转捕获异常
l1.config(text=e1.get())
except:
messagebox.showwarning('警告','请输入数字')
e1=Entry(root)
e1.pack()
Button(root,text='获取',command=com).pack()
l1=Label(root,text='只能数字')
l1.pack()
mainloop()
补充说明:如何在Python Entry文本框中实现仅允许输入数字或对数字显示进行限定。
首先展示相关代码,以体现对读者急切需求的尊重。若急需使用,可直接参考代码部分;若对原理有疑问,可继续阅读后续解析。笔者同样处于学习阶段,内容基于个人理解编写,如有补充或修正建议,欢迎联系交流,同时也请读者保持批判性思维,勿完全盲从。
import tkinter#界面绘制前初始化TK()
from tkinter import *
from PIL import Image,ImageTk
from tkinter import messagebox
#打开指定的图片文件,缩放至指定尺寸
def get_image(filename,width,height):
im = Image.open(filename).resize((width,height))
return ImageTk.PhotoImage(im)
win = tkinter.Tk() #初始化TK() 创建主窗口
#设置标题
win.title("至多和")
#设置界面在中间启动
def center_window(w,h):
#获取屏幕高和宽
ws = win.winfo_screenwidth()
hs = win.winfo_screenheight()
#计算x,y位置
x = (ws/2) - (w/2)
y = (hs/2) - (h/2)
win.geometry("%dx%d+%d+%d" %(w,h,x,y)) #设置位置和大小
center_window(300,200) #设置界面大小
win.resizable(False,False) #固定其窗口的大小 也可以允许更改大小,改为TRUE 就可以
#创建画布,设置要显示的图片,把画布添加至应用程序窗口
canvas_win = tkinter.Canvas(win,width=300,height=200)
im_win = get_image('小猫启动界面.jpg',300,200)#设置图片的大小
canvas_win.create_image(150,100,image=im_win)
canvas_win.pack()
#设置图标
win.iconbitmap(".\\bitbug_favicon.ico")
#设置文本只能输入数字
def test(content):
# 如果不加上==""的话,就会发现删不完。总会剩下一个数字 isdigit函数:isdigit函数方法检测字符串是否只由数字组成。
if content.isdigit() or content == "":
return True
else:
return False
def number():
int
##显示文本框作为输入框,以及标签作为信息
lable1 = Label(win,text="账号:",)
lable1.place(x=60,y=30)
v = StringVar() #跟踪变量的值的变化,以保证值的变更随时可以显示在界面上
test_cmd = win.register(test) # 需要将函数包装一下,必要的
textEntry1 = Entry(win,bd=0,font=("华文彩云",12),relief=RIDGE,bg="lightcyan",
textvariable = v, #文本框的值,是一个StringVar()对象 ,这样与StringVar 就能更新
validate = "key", # 发生任何变动的时候,就会调用validatecommand 这个调动受后面‘Key'影响,类似键盘监听 如果换成“'focusout'"就是光标
validatecommand = (test_cmd, '%P') # %P代表输入框的实时内容 # %P表示 当输入框的值允许改变,该值有效。该值为当前文本框内容 # %v(小写大写不一样的),当前validate的值 # %W表示该组件的名字
)
textEntry1.place(x=100,y=30,width=130,height=25)
lable2 = Label(win,text="密码:")
lable2.place(x=60,y=60)
textEntry2 = Entry(win,bd=0,font=("华文彩云"),relief=RIDGE,bg="lightcyan")
textEntry2.place(x=100,y=60,width=130)
win.mainloop()
上述代码运行后的界面效果如下:

当在账号文本框中输入数字时,内容会受到限制;密码框暂未做相同处理,计划将其设置为显示为“*”的形式。以下展示两个文本框在输入数字时的不同表现:

接下来介绍几个关键函数:
1、StringVar()函数:
该函数用于跟踪变量值的变化,确保界面能实时显示更新后的值。经查阅,该函数位于Tk模块中,其他模块暂未涉及。为了实现文本框内容的实时刷新,必须使用此函数。
2、textvariable:
此参数出现在Entry组件的括号内,需与StringVar配合使用,以实现内容的动态更新。
3、validate和validatecommand:
这两个参数通常配合使用,难以单独发挥作用。validate起到驱动作用,而validatecommand则是被驱动后执行的命令,即validate负责调用validatecommand。
validate参数的取值有多种,此处列举两种:一是Key,对应代码中的key,用于监听键盘输入;二是focusout,用于监听光标焦点变化。只要发生相关动作,就会触发validatecommand函数。该函数接收两个变量:一个是调用的目标函数,另一个是:
%P表示当输入框的值允许改变时,该值有效,其内容为当前文本框的内容。
%v(注意大小写敏感)表示当前validate的值。
%W表示该组件的名称。
4、isdigit函数:
isdigit方法用于检测字符串是否仅由数字组成。
5、win.register(test):
关于该函数的解释存在多种说法:
第一种解释涉及Python抽象类中的register机制,用于注册虚拟子类。
第二种解释来自编译器优化层面,指出register修饰符暗示编译程序应频繁使用该变量,若条件允许,应将其保存在CPU寄存器中以加快存储速度,从而减少内存寻址访问,提高效率。
在本例中,我们使用该函数主要是为了包装回调函数,使其能够被正确调用,并用于注册程序退出时的回调逻辑,以便在回调中执行资源清理等操作。
附注:
在Tkinter中,框架背景无法直接透明化。例如,若希望Text或Label背景透明以提升界面美观度,尝试修改背景色等方法均无效。唯一可行的方案是较为繁琐的:使用PS处理图片,生成透明背景图,然后将其设置为标签或文本框的背景。
以上为个人经验总结,希望能提供参考。也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













