Tkinter库的学习记录-7
17、文字区域Text
第5章中的Entry控件主要是处理单行=的文字输入,本章所要介绍的Text控件可以视为Entry的扩充,可以处理多行的输入,另外,也可以在文字中嵌入图像或是提供格式化功能。因此,实际上我们可以将此Text当作简单的文字处理软件,甚至也可以当作网页浏览器使用。
17-1 文字区域Text的基本概念
Text的构造方法如下。
Text(父对象, options, ...)参数一:同上
options参数:
(1) bg或background:背景色彩。
(2) borderwidth或bd:边界宽度,默认是2像素。
(3) cursor:当鼠标光标在文本框上方时的光标形状。
(4) exportselection:如果执行选择操作时,所选择的字符串会自动输出至剪切板,如果想要避免Rubio可以设置exportselection=0。
(5) fg或foreground:字形色彩。
(6) font:字形。
(7) height:高,单位是字符高,实际高度会视字符高度而定。
(8) highlightbackground:当文本框取得焦点时的背景颜色。
(9) highlightcolor:当文本框取得焦点时的颜色。
(10) highlightthickness:取得焦点时的厚度,默认值是1.
(11) insertbackground:插入光标的颜色,默认是黑色。
(12) insertborderwidth:围绕插入游标的3D厚度,默认是0.
(13) padx:Text左 / 右框与文字最左 / 最右的间距。
(14) pady:Text上 / 下框与文字最上 / 最下的间距。
(15) relief:默认是relief=FLAT,可由此控制文字外框。
(16) selectbackground:被选取字符串的背景色彩。
(17) selectborderwidth:选取字符串时的边界厚度,默认值是1.
(18) selectforeground:被选取字符串的前景色彩。
(19) state:输入状态,默认是NORMAL,表示可以输入,DISABLED则是无法编辑。
(20) tab:可设置按Tab键时,如何定位插入点。
(21) width:Text的度,单位是字符宽。
(22) wrap:可控制某行文字太长时的处理,默认时wrap=CHAR,当某行文字太长时,可从字符做断行;当wrap=WORD时,只能从字做断行。
(23) xscrollcommand:在x轴使用滚动条。
(24) yscrollcommand:在y轴使用滚动条。
下面程序实例ch17_1,建立一个高度是2,宽度是30的Text文字区域,然后输入文字,并观察执行结果。
from tkinter import * root = Tk() root.title("ch17_1") text = Text(root, height=2, width=30) text.pack() root.mainloop()执行结果 下面分别是没有输入,输入2行数据,输入4行数据的结果。
从上图可以发现,若是输入文字超过两行,将导致第一行数据被隐藏,若是输入更多行将造成更多文字被隐藏,虽然可以用移动光标的方式重新看到第一行文字,但是对于不了解程序结构的人而言,还是比较容易误会Text文字区域的内容。最后要注意的是,放大窗口并不会放大Text文字区域,参考下图。
当然,也可以重新设置Text()方法内的height和width参数,让Text文字区域可以容纳更多数据。不过至少在此读者应该可以体会如何使用Text控件建立输入多行文字的程序了。
17-2 插入文字insert()
insert()可以将字符串插入指定的索引位置,它的使用格式如下。
insert(index, string)若是参数index位置使用END或是INSERT,表示将字符串插入文件末端位置。
程序实例ch17_2:将字符串插入Text文字区域末端位置。
from tkinter import * root = Tk() root.title("ch17_2") text = Text(root, height=3, width=30) text.pack() text.insert(END, "Python王者归来\nJava王者归来\n") text.insert(END, "C++王者归来\n") root.mainloop()下面程序实例ch17_3:插入一个长为30的字符串,并观察执行结果。
from tkinter import * root = Tk() root.title("ch17_3") text = Text(root, height=3, width=30) text.pack() string = """dadsadasdasdasdasdasdasfadfaf, dfasdasdfasdfasdagfagdygetgsadrwtrwgasgasgF, FafgADTFGWETGGASGASGHAERGASGgqagasrgajsgasg, gsgsgsdgsdgdsgsfASDTFSAGAGASfafdfdfgadsdfad, fadsfafadfgregshdfujtukyuokgjhmghjkyumgjktt argeshrthfdthsdhsdghsdhsdhtsdthetsuqwuikmdf""" text.insert(END, string) root.mainloop()执行结果
还是只能看到部分字符串内容,为了改进此状况,可以使用将滚动条Scroll加入此Text控件,然后用滚动条方式查看内容,可参考17-3内容。
17-3 Text加上滚动条Scrollbar设计
在12-8节曾说明过滚动条Scrollbar的用法,同时也将Scrollbar与Listbox进行过结合,我们可以参考该节思想将Scroll应用于Text控件中。
下面程序实例h17_4:修改ch13_3,将原先只显示3行文字改成显示5行文字,另外主要是将Scrollbar应用于Text控件中,让整个Text文字区域增加y轴的滚动条。
监听字符串
self.emp_internation.trace_add('write', self.count_salary)
self.emp_internation为创建的字符串变量,ttk.String()
trace_add('write', 函数名),监听字符串变量写入之后需要干什么。
表头组件
创建表格组件
ttk.Treeview(columns=['', '', ''], show=")
参数
表头标识 columns, 参数后面可以接列表,列表中有几个元素,就增加几个表头
去除默认表头 show="headings"
ttk样式组件
一、基础使用示例
style = ttk.Style() # 查看ttk的组件样式 print(style.theme_names()) # ttk组件主题设置 style.theme_use('') # 设置默认标签样式 style.configure('TLabel', foreground='red', font=('宋体', 16)) # ttk Label组件参数绑定style='login-TLabel',就可以设置下面样式了 style.configure('login-TLabel', foreground='red', font=('宋体', 16)) # 默认按钮样式 style.configure('TButton', font=('宋体', 12)) # 默认单选框样式 style.configure('TRadiobutton', font=('宋体', 12)) # 默认表头标题 style.configure('Treeview.Heading', font=('宋体', 16)) # 默认表内容样式 style.configure('Treeview', font=('宋体', 14))ttk.Treeview表格组件
一、基础使用示例
先看一个完整的代码示例,可以直接复制运行:
import tkinter as tk from tkinter import ttk root = tk.Tk() root.title("简易表格示例") # 创建表格 table = ttk.Treeview(root) # 定义列(注意:第一列#0是隐藏的树形列,通常留空) table["columns"] = ("姓名", "年龄", "城市") # 设置列属性 table.column("#0", width=0, stretch=tk.NO) # 隐藏第一列 table.column("姓名", width=100, anchor=tk.W) # 列宽度和对齐方式 table.column("年龄", width=60, anchor=tk.CENTER) table.column("城市", width=120, anchor=tk.E) # 设置表头 table.heading("姓名", text="姓名") # 列标题 table.heading("年龄", text="年龄") table.heading("城市", text="城市") # 添加数据 table.insert("", "end", values=("张三", 25, "北京")) # 插入一行数据 table.insert("", "end", values=("李四", 30, "上海")) table.insert("", "end", values=("王五", 28, "广州")) # 显示表格 table.pack(pady=20) root.mainloop()二、核心参数详解
1. 列配置(column方法)
width:列宽度(单位:像素)
anchor:对齐方式(
tk.W左对齐,tk.CENTER居中,tk.E右对齐)minwidth:最小宽度(可拖动调整列宽时有效)
stretch:是否允许拉伸(
tk.YES/tk.NO)
table.column('姓名', anchor='center', width=90)2. 表头设置(heading方法)
text:显示的表头文字
command:点击表头时触发的回调函数(用于排序功能)
table.heading("年龄", text="年龄", command=lambda: sort_by_age())3. 插入数据(insert方法)
parent:父节点(通常用空字符串表示根节点)
index:插入位置("end"表示末尾),tk.END也可以,从最后一行开始追加
values:数据内容(元组形式,长度需与列数匹配)
iid:可选参数,为行指定唯一标识符
table.insert("", "end", iid="row1", values=("张三", 25, "北京"))4. 其他常用方法
删除行:
table.delete(iid)获取选中行:
table.selection()获取行数据:
table.item(iid, "values")修改数据:
table.item(iid, values=新数据)获取选中行的id:table.identify_row(event.y)
获取所有行的id:table.get_children()
查询id的下标:table.get_children().index(id)
三、样式美化
1. 修改字体颜色
style = ttk.Style() style.configure("Treeview", rowheight=25, # 行高 font=("微软雅黑", 11), foreground="#333", background="#fff") # 设置斑马线效果(隔行变色) style.map("Treeview", background=[("selected", "#0078D7"), ("!selected", "#f0f0f0")])2. 添加滚动条
# 纵向滚动条 y_scroll = ttk.Scrollbar(root, orient="vertical", command=table.yview) table.configure(yscrollcommand=y_scroll.set) y_scroll.pack(side=tk.RIGHT, fill=tk.Y) # 横向滚动条同理(orient="horizontal")四、常见问题
为什么表格不显示数据?
检查是否执行了
insert插入数据确认列名与
columns定义一致
如何实现点击排序?
需要自定义排序函数:def sort_by_col(col, reverse): data = [(table.set(child, col), child) for child in table.get_children("")] data.sort(reverse=reverse) for index, (val, child) in enumerate(data): table.move(child, "", index) table.heading(col, command=lambda: sort_by_col(col, not reverse))如何获取选中行数据?
selected = table.selection() if selected: print(table.item(selected[0], "values"))
五、完整功能示例(带编辑功能)
# 点击单元格编辑功能 def edit_cell(event): region = table.identify_region(event.x, event.y) if region == "cell": column = table.identify_column(event.x) iid = table.focus() current_value = table.item(iid, "values")[int(column[1])-1] # 创建编辑框 entry = tk.Entry(root) entry.place(x=event.x, y=event.y) entry.insert(0, current_value) def save_edit(): new_value = entry.get() values = list(table.item(iid, "values")) values[int(column[1])-1] = new_value table.item(iid, values=values) entry.destroy() entry.bind("<Return>", lambda e: save_edit()) table.bind("<Double-1>", edit_cell)滚动条ttk.Scrollbar
用于滚动一些组件的可见范围,根据方向可分为垂直滚动条和水平滚动条。组件常常被用于实现文本、画布和列表框的滚动。
在名为parent的顶级窗口或框架中创建一个新的滚动条组件:
# 创建滚动条 command=需要绑定的应用组件,yview scroll_bar = ttk.Scrollbar(main_window, command=table.yview) # 表格绑定滚动条 table.config(yscrollcommand=scroll_bar.set) # 滚动条布局 scroll_bar.place(x=1313, y=80, height=645)