当前位置:   article > 正文

13-Tkinter 组件-Entry单行输入控件_tkinter entrybox

tkinter entrybox

Entry单行输入控件

输入控件;用于显示简单的文本内容.可以用get函数获取到文本框中输入的信息

Python Tkinter 文本框用来让用户输入一行文本字符串。

  • 如果需要输入多行文本,可以使用 Text 组件。
  • 如果需要显示一行或多行文本且不允许用户修改,你可以使用 Label 组件。

语法

语法格式如下:

w = Entry( master, option, ...)
  • 1
  • master: 按钮的父容器。
  • options: 可选项,即该按钮的可设置的属性。这些选项可以用键 = 值的形式设置,并以逗号分隔。
参数描述
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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

如何通过快捷键选择(聚焦)文本框?

答: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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

设置快捷键的方法好找,设置选择的方法我在百度上找不到,就去外网查了一下找到了,写出来分享一下。

具体可以自己去外网搜:how to set focus in tkinter entr box

这个函数可以检测输入的字符串是否是整形数或者是浮点数。不过只能检测正数字,不能检测负数。我们还可以在修改完善一下,就是首先判断输入的第一个字符是不是“-”,如果是,就使用拷贝后面的字符来检测。只需在int_float 函数开始的地方增加检测输入的字符串是不是等于’-’即可:

    if value=='-':
        return True
  • 1
  • 2

还有一个问题就是不能清空输入框,必须保留至少一个数字。这是因为回调函数没有处理输入框种的内容为空的情况。如果删除了所有的字符,传入回调函数的值是’’,这种情况下判断函数返回的是False,因为不满足任何一个条件。所以需要增加处理输入框为空的情况:

if value=='':
        return True
  • 1
  • 2

输入框内容校验

Tkinter 验证依赖于可用于任何输入小部件(例如 Entry 小部件)的三个选项:

  • validate:指定哪种类型的事件将触发验证。
  • validatecommand:检查数据是否有效
  • invalidcommand:当数据无效时执行。 换句话说,如果 validate 命令返回 False,它将执行。
validate命令

vaidate是定义在何种条件下触发输入验证:

字符含义
focus获得或者失去输入焦点时候
focusin每当小部件获得焦点时进行验证
focusout每当小部件失去输入焦点的时候
key每当任何击键更改小部件的内容时进行验证
ALL在上述所有情况下验证聚焦、聚焦和关键
none关闭验证。 默认设置
validatecommand
  • validatecommand 是一个元组,包含:

    • 对 Tcl/tk 函数的引用。
    • 零个或多个替换代码指定触发要传递给函数的事件的信息。

    要获取对 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
invalidcommand

与 validatecommand 一样,invalidcommand 也需要使用 widget.register() 方法和替换代码。

以下示例返回一个元组,您可以将其传递给 invalidcommand 选项:

ivcmd = (self.root.register(self.on_invalid),)
  • 1
使用介绍
  • 同时设定了validatecommandinvalidatecommand,首先执行的是validatecommand

    • 返回值是True,不会执行invalidatecommand定义的回调函数。
    • 返回值是False,会调用invalidatecommand定义的回调函数。
    • 需要注意的是,如果验证触发条件是key或者all,不能同时使用validatecommandinvalidatecommand,否则会无法输入任何内容。
  • invalidatecommand是不能单独使用的。必须有validatecommandinvalidatecommand才会起作用。只有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()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

上面的例子要求输入必须是整数,下面例子是一个要输入浮点数,替换掉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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

下面将创建一个包含电子邮件输入的表单。 如果输入了无效的电子邮件地址,它将显示一条错误消息并将电子邮件输入的文本颜色更改为红色。 当焦点移出条目时,我们将触发验证事件。

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/447260
推荐阅读
相关标签
  

闽ICP备14008679号