赞
踩
Entry
单行输入控件输入控件;用于显示简单的文本内容.可以用get
函数获取到文本框中输入的信息
Python Tkinter 文本框用来让用户输入一行文本字符串。
语法格式如下:
w = Entry( master, option, ...)
参数 | 描述 |
---|---|
bg | 输入框背景颜色 |
fg | 前景文字颜色。值为颜色或为颜色代码,如:‘red’,‘#ff0000’ |
bd | 边框的大小,默认为 2 个像素 |
cursor | 光标的形状设定,如arrow, circle, cross, plus 等 |
font | 文本字体 |
exportselection | 默认情况下,你如果在输入框中选中文本,默认会复制到粘贴板,如果要忽略这个功能刻工艺设置 exportselection=0。 |
highlightcolor | 文本框高亮边框颜色,当文本框获取焦点时显示 |
justify | 显示多行文本的时候,设置不同行之间的对齐方式,可选项包括LEFT, RIGHT, CENTER |
relief | 边框样式,设置控件3D效果,可选的有:FLAT、SUNKEN、RAISED、GROOVE、RIDGE。默认为 FLAT。 |
selectbackground | 选中文字的背景颜色 |
selectborderwidth | 选中文字的背景边框宽度 |
selectforeground | 选中文字的颜色 |
show | 指定文本框内容显示为字符,值随意,满足字符即可。如密码可以将值设为 show=“*” |
state | 默认为 state=NORMAL, 文框状态,分为只读和可写,值为:normal /disabled DISABLED只显示的内容可以选择与拷贝,不可修改。 |
textvariable | 文本框的值,是一个StringVar()对象。还可以有小数DoubleVar 、布尔BooleanVar 、数字IntVar 。关联的tkinter变量,一般是StringVar类型。如果该变量改变,则输入控件中的内容也会更新。 |
width | 文本框宽度 |
xscrollcommand / yscrollcommand | 设置水平、垂直方向滚动条,一般在用户输入的文本框内容宽度大于文本框显示的宽度时使用。将滚动条与输入控件关联起来,处理滚动条动作。滚动条只能是水平滚动条。 |
validate | 定义在什么条件下触发验证输入内容,做内容校验时用到: focus:获得或者失去输入焦点时候 focuin:仅在获得输入焦点的时候 focusout: 失去输入焦点的时候 key: 改变内容的时候 ALL:以上全部情况 该属性定义的是何时启动输入验证,而验证输入内容的回调函数由validatecommand或者invalidcommand定义 |
validatecommand / vcmd | 定义一个函数去验证与检查输入内容。如果输入的内容符合要求,该函数返回True,否则返回False。此属性在validate不空的时候有效。 |
takefocus | 定义是否可以使用Tab键移动输入焦点到输入控件。 |
下表为文本框组件常用的方法:
序号 | 方法 & 描述 |
---|---|
delete(first, last=None) | 删除文本框里直接位置值 例子:text.delete(10) 删除索引值为10的值;text.delete(10, 20) 删除索引值从10到20之前的值 text.delete(0, END) # 删除所有值` |
get() | 获取文件框的值 |
icursor(index) | 将光标移动到指定索引位置,只有当文框获取焦点后成立 |
index(index) | 返回指定的索引值 |
insert(index, s) | 向文本框中插入值,index:插入位置,s:插入值 |
select_adjust(index) | 选中指定索引和光标所在位置之前的值 |
select_clear() | 清空文本框 |
select_from(index) | 设置光标的位置,通过索引值 index 来设置 |
select_present() | 如果有选中,返回 true,否则返回 false。 |
select_range(start, end) | 选中指定索引位置的值,start(包含) 为开始位置,end(不包含) 为结束位置start必须比end小 |
select_to(index) | 选中指定索引与光标之间的值 |
xview(index) | 该方法在文本框链接到水平滚动条上很有用。 |
xview_scroll(number, what) | 用于水平滚动文本框。 what 参数可以是 UNITS, 按字符宽度滚动,或者可以是 PAGES, 按文本框组件块滚动。 number 参数,正数为由左到右滚动,负数为由右到左滚动。 |
实例中点击按钮会显示一个信息:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
from Tkinter import *
top = Tk()
L1 = Label(top, text="网站名")
L1.pack( side = LEFT)
E1 = Entry(top, bd =5)
E1.pack(side = RIGHT)
top.mainloop()
如何通过快捷键选择(聚焦)文本框?
答:bind_all 绑定快捷键,foucus 选择文本框。
例:
from tkinter import *
# Python 2.x 版本使用 Tkinter
# from Tkinter import *
root = Tk()
def eventhandler(event):
entry.focus()
entry=Entry(root,bd=4)
entry.bind_all('<Control-f>', eventhandler) # 绑定快捷键Ctrl-f
entry.pack()
root.mainloop()
设置快捷键的方法好找,设置选择的方法我在百度上找不到,就去外网查了一下找到了,写出来分享一下。
具体可以自己去外网搜:how to set focus in tkinter entr box
这个函数可以检测输入的字符串是否是整形数或者是浮点数。不过只能检测正数字,不能检测负数。我们还可以在修改完善一下,就是首先判断输入的第一个字符是不是“-”,如果是,就使用拷贝后面的字符来检测。只需在int_float 函数开始的地方增加检测输入的字符串是不是等于’-’即可:
if value=='-':
return True
还有一个问题就是不能清空输入框,必须保留至少一个数字。这是因为回调函数没有处理输入框种的内容为空的情况。如果删除了所有的字符,传入回调函数的值是’’,这种情况下判断函数返回的是False,因为不满足任何一个条件。所以需要增加处理输入框为空的情况:
if value=='':
return True
Tkinter 验证依赖于可用于任何输入小部件(例如 Entry 小部件)的三个选项:
vaidate是定义在何种条件下触发输入验证:
字符 | 含义 |
---|---|
focus | 获得或者失去输入焦点时候 |
focusin | 每当小部件获得焦点时进行验证 |
focusout | 每当小部件失去输入焦点的时候 |
key | 每当任何击键更改小部件的内容时进行验证 |
ALL | 在上述所有情况下验证聚焦、聚焦和关键 |
none | 关闭验证。 默认设置 |
validatecommand 是一个元组,包含:
要获取对 Tck/tk 函数的引用,请将可调用对象传递给 widget.register() 方法。 它返回一个可以与 validate 命令一起使用的字符串。
下表显示了可用于元组的替换代码:
参数 | 含义 |
---|---|
%d | 操作代码:0 表示尝试删除,1 表示尝试插入,或 -1 如果调用回调以聚焦、聚焦或更改“文本变量” |
%i | 当用户试图插入或删除文本时,此参数将是插入或删除开始的索引。 如果回调是由于聚焦、聚焦或更改“textvariable”,则参数将为“-1” |
%P | 当前输入框中的文本 |
%s | 更改前Entry中的文本 |
%S | 插入或者删除的字符 |
%v | 小部件的validate 选项的当前值 |
%V | 此回调的原因:如果textvariable 被更改,则为 'focusin' 、'focusout' 、'key' 或 'forced' 之一 |
%W | 小部件的名称 |
以下示例构造一个使用 self.validate() 方法和 %P 替换代码的 validatecommand:
vcmd = (self.register(self.validate), '%P')
- 1
与 validatecommand 一样,invalidcommand 也需要使用 widget.register() 方法和替换代码。
以下示例返回一个元组,您可以将其传递给 invalidcommand 选项:
ivcmd = (self.root.register(self.on_invalid),)
同时设定了validatecommand
和invalidatecommand
,首先执行的是validatecommand
。
True
,不会执行invalidatecommand
定义的回调函数。key
或者all
,不能同时使用validatecommand
和invalidatecommand
,否则会无法输入任何内容。invalidatecommand
是不能单独使用的。必须有validatecommand
,invalidatecommand
才会起作用。只有invalidatecommand
是不能完成输入验证的,因为根本不会给触发。
下面的例子是检查输入的都要是数字,否则不允许输入。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
def check_digit(content):
if content.isdigit() or content == "":# 判断是否十进制
return True
else:
return False
entry_validate=root.register(check_digit)
b1 = tk.Entry(root,width=20,validate='key',vcmd=(entry_validate,'%P'))
b1.pack()
root.mainloop()
上面的例子要求输入必须是整数,下面例子是一个要输入浮点数,替换掉isdigit()函数,用自定义的检查函数即可。
def int_float(value):
try:
x=int(value)
except ValueError:
try:
y = float(value)
except ValueError:
return False
else:
return True
else:
return True
下面将创建一个包含电子邮件输入的表单。 如果输入了无效的电子邮件地址,它将显示一条错误消息并将电子邮件输入的文本颜色更改为红色。 当焦点移出条目时,我们将触发验证事件。
# coding = utf-8
# File date: Hi_2022/9/28 16:53
# File_name: demo.py
import tkinter as tk
from tkinter import ttk
import re
class App(tk.Tk):
def __init__(self):
super().__init__()
self.title('Tkinter Validation Demo')
self.create_widgets()
def create_widgets(self):
self.columnconfigure(0, weight=1)
self.columnconfigure(1, weight=3)
self.columnconfigure(2, weight=1)
# label
ttk.Label(text='Email:').grid(row=0, column=0, padx=5, pady=5)
# email entry
vcmd = (self.register(self.validate), '%P')
ivcmd = (self.register(self.on_invalid),)
self.email_entry = ttk.Entry(self, width=50)
self.email_entry.config(validate='focusout', validatecommand=vcmd, invalidcommand=ivcmd)
self.email_entry.grid(row=0, column=1, columnspan=2, padx=5)
self.label_error = ttk.Label(self, foreground='red')
self.label_error.grid(row=1, column=1, sticky=tk.W, padx=5)
# button
self.send_button = ttk.Button(text='Send').grid(row=0, column=4, padx=5)
def show_message(self, error='', color='black'):
self.label_error['text'] = error
self.email_entry['foreground'] = color
def validate(self, value):
"""
Validat the email entry
:param value:
:return:
"""
pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
if re.fullmatch(pattern, value) is None:
return False
self.show_message()
return True
def on_invalid(self):
"""Show the error message if the data is not valid"""
self.show_message('Please enter a valid email', 'red')
if __name__ == '__main__':
app = App()
app.mainloop()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。