首页 > Python基础教程 > Tkinter
阅读:7,116
Python Tkinter Entry和Text控件用法(包含两者区别)
Entry 和 Text 组件都是可接收用户输入的输入框组件,区别是 Entry 是单行输入框组件,Text 是多行输入框组件,而且 Text 可以为不同的部分添加不同的格式,甚至响应事件。
不管是 Entry 还是 Text 组件,程序都提供了 get() 方法来获取文本框中的内容;但如果程序要改变文本框中的内容,则需要调用二者的 insert() 方法来实现。
如果要删除 Entry 或 Text 组件中的部分内容,则可通过
关于 Entry 和 Text 支持的索引需要说明一下,由于 Entry 是单行文本框组件,因此它的索引很简单,比如要指定第 4 个字符到第 8 个字符,索引指定为 (3,8) 即可。但 Text 是多行文本框组件,因此它的索引需要同时指定行号和列号,比如 1.0 代表第 1 行、第 1 列(行号从 1 开始, 列号从 0 开始),如果要指定第 2 行第 3 个字符到第 3 行第 7个字符,索引应指定为 (2.2,3.6)。
此外,正如从前面程序所看到的,Entry 支持双向绑定,程序可以将 Entry 与变量绑定在一起,这样程序就可以通过该变量来改变、获取 Entry 组件中的内容。
下面程序示范了 Entry 和 Text 组件的用法:
同时,程序第 45、47 行代码调用了 Entry 和 Text 组件的 get() 方法来获取其中的文本内容。运行上面程序,尝试向 Entry、Text 中插入一些内容,然后单击界面上的“获取 Text”按钮,则可以看到如图 1 所示的界面。
图 1 获取文本框中的内容
Text 实际上是一个功能强大的“富文本”编辑组件,这意味着使用 Text 不仅可以插入文本内容,也可以插入图片,可通过 image_create(self, index, cnf={}, **kw) 方法来插入。
Text 也可以设置被插入文本内容的格式,此时就需要为
此外,当 Text 内容较多时就需要对该组件使用滚动条,以便该 Text 能实现被动显示。为了让滚动条控制 Text 组件内容的滚动,实际上就是将它们进行双向关联。这里需要两步操作:
如下程序示范了使用 Text 来实现一个图文并茂的界面:
接下来程序使用 title tag 插入了一个标题内容,因此该标题内容的格式将受到 title tag 的控制;然后程序使用循环插入了三条受 detail tag 控制的描述信息,每次在插入描述信息之前都先插入一张图片。
不仅如此,上面程序在循环内创建了 tag,并调用 Text 组件的 tag_bind() 方法为 tag 绑定事件处理方法。与前面的描述信息不同的是,此处程序需要让每个链接打开不同的页面,因此程序为每条链接内容分别创建了不同的 tag,从而实现为每个链接打开对应的页面。
运行上面程序,将看到如图 2 所示的图文并茂的界面:
图 2 使用 Text 实现图文并茂的界面
不管是 Entry 还是 Text 组件,程序都提供了 get() 方法来获取文本框中的内容;但如果程序要改变文本框中的内容,则需要调用二者的 insert() 方法来实现。
如果要删除 Entry 或 Text 组件中的部分内容,则可通过
delete(self,first,last=None)
方法实现,该方法指定删除从 first 到 last 之间的内容。关于 Entry 和 Text 支持的索引需要说明一下,由于 Entry 是单行文本框组件,因此它的索引很简单,比如要指定第 4 个字符到第 8 个字符,索引指定为 (3,8) 即可。但 Text 是多行文本框组件,因此它的索引需要同时指定行号和列号,比如 1.0 代表第 1 行、第 1 列(行号从 1 开始, 列号从 0 开始),如果要指定第 2 行第 3 个字符到第 3 行第 7个字符,索引应指定为 (2.2,3.6)。
此外,正如从前面程序所看到的,Entry 支持双向绑定,程序可以将 Entry 与变量绑定在一起,这样程序就可以通过该变量来改变、获取 Entry 组件中的内容。
下面程序示范了 Entry 和 Text 组件的用法:
from tkinter import * # 导入ttk from tkinter import ttk from tkinter import messagebox class App: def __init__(self, master): self.master = master self.initWidgets() def initWidgets(self): # 创建Entry组件 self.entry = ttk.Entry(self.master, width=44, font=('StSong', 14), foreground='green') self.entry.pack(fill=BOTH, expand=YES) # 创建Entry组件 self.text = Text(self.master, width=44, height=4, font=('StSong', 14), foreground='gray') self.text.pack(fill=BOTH, expand=YES) # 创建Frame作为容器 f = Frame(self.master) f.pack() # 创建五个按钮,将其放入Frame中 ttk.Button(f, text='开始插入', command=self.insert_start).pack(side=LEFT) ttk.Button(f, text='编辑处插入', command=self.insert_edit).pack(side=LEFT) ttk.Button(f, text='结尾插入', command=self.insert_end).pack(side=LEFT) ttk.Button(f, text='获取Entry', command=self.get_entry).pack(side=LEFT) ttk.Button(f, text='获取Text', command=self.get_text).pack(side=LEFT) def insert_start(self): # 在Entry和Text开始处插入内容 self.entry.insert(0, 'Kotlin') self.text.insert(1.0, 'Kotlin') def insert_edit(self): # 在Entry和Text的编辑处插入内容 self.entry.insert(INSERT, 'Python') self.text.insert(INSERT, 'Python') def insert_end(self): # 在Entry和Text的结尾处插入内容 self.entry.insert(END, 'Swift') self.text.insert(END, 'Swift') def get_entry(self): messagebox.showinfo(title='输入内容', message=self.entry.get()) def get_text(self): messagebox.showinfo(title='输入内容', message=self.text.get(1.0, END)) root = Tk() root.title("Entry测试") App(root) root.mainloop()上面程序开始创建了一个 Entry 组件和一个 Text 组件,程序中第 34、35 行代码用于在 Entry 和 Text 组件的开始部分插入指定文本内容,如果要在 Entry、Text 的指定位置插入文本内容,通过 insert() 方法的第一个参数指定位置即可。如果要在编辑处插入内容,则将第一个参数设为 INSERT 常量(值为 'insert'); 如果要在结尾处插入内容,则将第一个参数设为 END 常量(值为 'end')。
同时,程序第 45、47 行代码调用了 Entry 和 Text 组件的 get() 方法来获取其中的文本内容。运行上面程序,尝试向 Entry、Text 中插入一些内容,然后单击界面上的“获取 Text”按钮,则可以看到如图 1 所示的界面。
图 1 获取文本框中的内容
Text 实际上是一个功能强大的“富文本”编辑组件,这意味着使用 Text 不仅可以插入文本内容,也可以插入图片,可通过 image_create(self, index, cnf={}, **kw) 方法来插入。
Text 也可以设置被插入文本内容的格式,此时就需要为
insert(self, index, chars, *args)
方法的最后一个参数传入多个 tag 进行控制,这样就可以使用 Text 组件实现图文并茂的效果。此外,当 Text 内容较多时就需要对该组件使用滚动条,以便该 Text 能实现被动显示。为了让滚动条控制 Text 组件内容的滚动,实际上就是将它们进行双向关联。这里需要两步操作:
- 将 Scrollbar 的 command 设为目标组件的 xview 或 yview,其中 xview 用于水平滚动条控制目标组件水平滚动;yview 用于垂直读动条控制目标组件垂直滚动。
- 将目标组件的 xscrollcommand 或 yscrollcommand 属性设为 Scrollbar 的 set 方法。
如下程序示范了使用 Text 来实现一个图文并茂的界面:
from tkinter import * # 导入ttk from tkinter import ttk class App: def __init__(self, master): self.master = master self.initWidgets() def initWidgets(self): # 创建第一个Text组件 text1 = Text(self.master, height=27, width=32) # 创建图片 book = PhotoImage(file='serial.png') text1.bm = book text1.insert(END,'\n') # 在结尾处插入图片 text1.image_create(END, image=book) text1.pack(side=LEFT, fill=BOTH, expand=YES) # 创建第二个Text组件 text2 = Text(self.master, height=33, width=50) text2.pack(side=LEFT, fill=BOTH, expand=YES) self.text = text2 # 创建Scrollbar组件,设置该组件与text2的纵向滚动关联 scroll = Scrollbar(self.master, command=text2.yview) scroll.pack(side=RIGHT, fill=Y) # 设置text2的纵向滚动影响scroll滚动条 text2.configure(yscrollcommand=scroll.set) # 配置名为title的样式 text2.tag_configure('title', font=('楷体', 20, 'bold'), foreground='red', justify=CENTER, spacing3=20) text2.tag_configure('detail', foreground='darkgray', font=('微软雅黑', 11, 'bold'), spacing2=10, # 设置行间距 spacing3=15) # 设置段间距 text2.insert(END,'\n') # 插入文本内容,设置使用title样式 text2.insert(END,'C语言中文网\n', 'title') # 创建图片 star = PhotoImage(file='serial.png') text2.bm = star details = ('C语言中文网成立于 2012 年初,目前已经运营了将近 5 年,' +\ '我们致力于分享精品教程,帮助对编程感兴趣的读者。\n' , '我们一直都在坚持的是:认认真真、一丝不苟、以工匠的精神来打磨每一套教程,让读者感受到作者的用心,以及默默投入的时间,由衷地心动和点赞。\n', '这样的教程是一件作品,而不是呆板的文字!\n') # 采用循环插入多条介绍信息 for de in details: text2.image_create(END, image=star) text2.insert(END, de, 'detail') url =['http://vip.biancheng.net/','http://c.biancheng.net/'] name =['VIP会员', 'C语言中文网'] m=0 for each in name: # 为每个链接创建单独的配置 text2.tag_configure(m, foreground='blue', underline=True, font=('微软雅黑', 13, 'bold')) text2.tag_bind(m, '<Enter>', self.show_arrow_cursor) text2.tag_bind(m, '<Leave>', self.show_common_cursor) # 使用handlerAdaptor包装,将当前链接参数传入事件处理函数 text2.tag_bind(m, '<Button-1>', self.handlerAdaptor(self.click, x = url[m])) text2.insert(END, each + '\n', m) m += 1 def show_arrow_cursor(self, event): # 光标移上去时变成箭头 self.text.config(cursor='arrow') def show_common_cursor(self, event): # 光标移出去时恢复原样 self.text.config(cursor='xterm') def click(self, event, x): import webbrowser # 使用默认浏览器打开链接 webbrowser.open(x) def handlerAdaptor(self, fun,**kwds): return lambda event, fun=fun, kwds=kwds: fun(event,**kwds) root = Tk() root.title("Text测试") App(root) root.mainloop()上面程序中使用 Text 的 tag_configure(也写作 tag_config)方法创建了 title 和 detail 两个 tag,每个 tag 可用于控制一段文本的格式、事件等。
接下来程序使用 title tag 插入了一个标题内容,因此该标题内容的格式将受到 title tag 的控制;然后程序使用循环插入了三条受 detail tag 控制的描述信息,每次在插入描述信息之前都先插入一张图片。
不仅如此,上面程序在循环内创建了 tag,并调用 Text 组件的 tag_bind() 方法为 tag 绑定事件处理方法。与前面的描述信息不同的是,此处程序需要让每个链接打开不同的页面,因此程序为每条链接内容分别创建了不同的 tag,从而实现为每个链接打开对应的页面。
运行上面程序,将看到如图 2 所示的图文并茂的界面:
图 2 使用 Text 实现图文并茂的界面
所有教程
- socket
- Python基础教程
- C#教程
- MySQL函数
- MySQL
- C语言入门
- C语言专题
- C语言编译器
- C语言编程实例
- GCC编译器
- 数据结构
- C语言项目案例
- C++教程
- OpenCV
- Qt教程
- Unity 3D教程
- UE4
- STL
- Redis
- Android教程
- JavaScript
- PHP
- Mybatis
- Spring Cloud
- Maven
- vi命令
- Spring Boot
- Spring MVC
- Hibernate
- Linux
- Linux命令
- Shell脚本
- Java教程
- 设计模式
- Spring
- Servlet
- Struts2
- Java Swing
- JSP教程
- CSS教程
- TensorFlow
- 区块链
- Go语言教程
- Docker
- 编程笔记
- 资源下载
- 关于我们
- 汇编语言
- 大数据
- 云计算
- VIP视频