鱼c笔记——Python 的 GUI 编程(四):Tkinter 组件 Entry

Entry 组件的基本用法

Entry 的 show, width 属性

Entry 的验证功能

Label 组件的 row, column 属性

Button 组件的 sticky 属性

 

Entry组件:输入框

输入框是和程序打交道的一个途径。比如说程序要求输入账号和密码,就需要提供两个输入框,接受密码的输入框还会用*星号将实际内容隐藏起来。

学了好几个 Tkinter 的组件,不难发现,很多方法和选项之间是通用的,意思是名字一样,内容也一样。比如说,在输入框中用代码增加和删除内容,就是使用 insert() 和 delete() 方法。

from tkinter import *
root = Tk()

e = Entry(root)
e.pack(padx=20, pady=20)
e.delete(0, END)  #将输入框里面的内容清空
e.insert(0, '默认文本在此!')

mainloop()

获取数据框里的内容,可以使用 Entry 组件里的 get 方法。也可以将 Tkinter 的变量,通常是字符串类型的变量挂钩到 textvariable 选项上,再通过变量的 get 方法获取也是可以的。

from tkinter import *
#tkinter提供了三种布局组件的方式,第一种是pack()
# 第二种是Grid()网格,第三种是prase()
root = Tk()
e1 = Entry(root,width =25)
e1.grid(row = 0,column = 1,padx = 10,pady = 5)
e2 = Entry(root,width =25)
e2.grid(row = 1,column = 1,padx = 10,pady = 5)

l1 = Label(root,text = '作品:')
l1.grid(row = 0,column = 0)
l2 = Label(root,text = '作者:')
l2.grid(row = 1,column = 0)

def getmessage():
    print( '作品:《%s》' % (e1.get()) )
    print( '作者:%s' % e2.get() )

b1 = Button(root,text = '获取信息',width = 10,command = getmessage)
b1.grid(row = 2,column = 0,padx = 10,pady = 5)


b1 = Button(root,text = '退出',width = 10,command = root.quit)
b1.grid(row = 2,column = 1,padx = 10,pady = 5)


mainloop()

实现密码框的用星号代替实际内容,可以通过 Entry 的 show 参数来实现:

l1 = Label(root,text = '账号:')
l1.grid(row = 0,column = 0)
l2 = Label(root,text = '密码:')
l2.grid(row = 1,column = 0)

v1 = StringVar()
v2 = StringVar()

e1 = Entry(root,width =25,textvariable = v1)
e1.grid(row = 0,column = 1,padx = 10,pady = 5)
e2 = Entry(root,width =25,textvariable = v2,show = '*')
e2.grid(row = 1,column = 1,padx = 10,pady = 5)

 

如果想要设计一个计算器,除了数字以外不允许其他字符出现,该怎么设计呢?

Entry 组件本身就自带了验证功能,就是可以验证输入框里面内容的合法性。实现该功能,就要设置选项 validate, validatecommand 和 invalidcommand


首先启用验证的” 开关” 是 validate 选项,该选项可以设置的值有:

focus
            当Entry组件获得或失去焦点的时候验证(当Entry组件获得或失去焦点的时候调用validate-command指定的验证函数)
        focusin
            当Entry组件获得焦点的时候验证
        focusout
            当Entry组件失去焦点的时候验证
        key
            当输入框被编辑的时候验证
        all
            当出现上面任何一种情况的时候验证
        none
            
            ①关闭验证功能

            ②默认设置该选项(即不用启用验证)

            ③注意:是字符串的'none',而非None
            
         

其次是为 validatecommand 选项指定一个验证函数,该函数只能返回 True 或 False 表示验证的结果,一般情况下验证函数只需要知道输入框的内容即可,可以通过 Entry 组件的 get() 方法获得该字符串。
 

from tkinter import *
master = Tk()

def test():
    if e1.get() == '我爱学习':
        print('继续努力!')
        return True
    else:
        print('你在说什么鬼话')
        e1.delete(0, END)
        return False

v = StringVar()
e1 = Entry(master, textvariable=v, validate='focusout', validatecommand=test)  #当焦点移出的时候调用validatecommand设置的函数test
e2 = Entry(master)
e1.pack(padx=10, pady=10)
e2.pack(padx=10, pady=10)

mainloop()


invalidcommand 选项指定的函数只有在 validatecommand 的返回值为 False 的时候才会被调用。


下边的例子中,在第一个输入框输入不是 " 我爱学习 " 以外的字符串,并通过 Tab 键将焦点转移到第二个输入框,validatecommand 指定的验证函数被触发并返回 False,接着 invalidcommand 被触发:

其实 Tkinter 还有隐藏功能,不过需要冷却才能实现:

Tkinter 为验证函数提供一些额外的选项:

%d
            操作代码:0表示删除操作;1表示插入操作;2表示获得、失去焦点或textvariable变量的值被修改
        %i
            
            当用户尝试插入或删除操作的时候,该选项表示插入或删除的位置(索引号)

            如果是由于获得、失去焦点或textvariable变量的值被修改而调用验证函数,那么该值是-1
            
        %P
            
            当输入框的值允许被改变的时候,该值有效

            该值为输入框的最新文本内容
            
        %s
            该值为调用验证函数前输入框的文本内容
        %S
            
            当插入或删除操作触发验证功能的时候,该值有效

            该选项表示文本被插入和删除的内容
            
        %v
            该组件当前的validate选项的值
        %V
            
            调用验证函数的原因

            该值是'focusin'、'focusout'、'key'或'focused'(textvariable选项指定的变量值被修改)中的一个
            
        %W
            该组件的名字(在Tkinter内部会注册一个名字,显示的是注册的名字,类似于句柄)
        为了使用这些选项,我们可以这样写:validatecommand=(f, s1, s2, ...)---把它变成了一个元组


其中,f 就是我们 ‘冷却后’ 的验证函数名,s1, s2, s3 这些都是额外的选项,这些选项会作为参数依次传递给 f 函数。我们刚刚说了,使用额外功能前需要冷却,其实就是调用 register() 方法将验证函数包装起来:

from tkinter import *
master = Tk()

def test(content, reason, name):  #test不再是没有参数的方法了,参数是在validatecommand里出现的
    if content == '我爱学习':
        print('继续努力!')
        print(content, reason, name)
        return True
    else:
        print('你在说什么鬼话')
        print(content, reason, name)
        e1.delete(0, END)
        return False

v = StringVar()

testCMD = master.register(test)
e1 = Entry(master, textvariable=v, validate='focusout', \
           validatecommand=(testCMD, '%P', '%v', '%W'))
e2 = Entry(master)
e1.pack(padx=10, pady=10)
e2.pack(padx=10, pady=10)

mainloop()

下面是设计一个简单的加法计算器:

from tkinter import *
root = Tk()

frame = Frame(root)
frame.pack(padx = 10,pady = 10)
v1 = StringVar()
v2 = StringVar()
v3 = StringVar()

def test(content):
    print(content.isdigit())
    return content.isdigit()
testCMD = root.register(test)
e1 = Entry(frame,width = 10,textvariable = v1,validate = "key",\
           validatecommand = (testCMD,'%P') )
e1.grid(row = 0,column = 0)
e2 = Entry(frame,width = 10,textvariable = v2,validate = "key",\
           validatecommand = (testCMD,'%P') )
e2.grid(row = 0,column = 2)
e3 = Entry(frame,width = 10,textvariable = v3,state = 'readonly')
e3.grid(row = 0,column = 4)

Label(frame,text = '+').grid(row = 0,column = 1)
Label(frame,text = '=').grid(row = 0,column = 3)

def calc():
    res = int(v1.get())+int(v2.get())
    v3.set(str(res))
    
b1 = Button(frame ,text = '计算结果',command = calc)
b1.grid(row = 1,column = 2,pady = 5)

mainloop()

原文入口

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值