前言
如果有些参数不理解,可以先看看第一篇 Tkinter 1. 基本介绍 (尽量先看这篇,以免下面很多参数看不懂。)
(不知道怎么在简书实现页内跳转目录,百度了半天也没有结果,知道的,可以在评论区写出来,我修改一下,内容太多,没有目录跳转,看着会很难受!谢谢!)
Button 按钮
def check(): if (var_p.get() == 1) & ( var_j.get() == 1) : tkinter.messagebox.showinfo(message='我喜欢python,也喜欢Java') elif (var_p.get() == 1) & (var_j.get() == 0) : tkinter.messagebox.showinfo(message='我只喜欢python') elif (var_p.get() == 0) & (var_j.get() == 1) : tkinter.messagebox.showinfo(message='我只喜欢Java') else: tkinter.messagebox.showinfo(message='我两个都不喜欢') btn1 = tk.Checkbutton(frm,text='Python',variable=var_p,onvalue=1,offvalue=0,command=check) btn2 = tk.Checkbutton(frm,text='Java',variable=var_j,onvalue=1,offvalue=0,command=check) btn1.grid(row=0,column=0) btn2.grid(row=0,column=1) root.mainloop()Radiobutton 单选按钮
tkinter.messagebox.showinfo(message='你是男的') else: tkinter.messagebox.showinfo(message="你是女的") rdo = tk.Radiobutton(frm,text='男',variable=var_r,value=1,command=radio) rdo2 = tk.Radiobutton(frm,text='女',variable=var_r,value=0,command=radio) rdo.grid(row=0,column=0) rdo2.grid(row=1,column=0) root.mainloop()Entry 输入框
import tkinter as tk
import tkinter.messagebox
class App(tk.Tk):
def __init__(self):
super().__init__()
self.geometry('600x400')
self.set_widget()
self.bind_event()
self.mainloop()
def set_widget(self):
self.frm = tk.Frame(self,pady=40)
self.frm.pack()
tk.Label(self.frm,text='账号').grid(row=0,column=0,pady=10,padx=10)
tk.Label(self.frm,text='密码').grid(row=1,column=0,pady=10)
self.name = tk.StringVar()
self.name.set('请输入邮箱或者手机号')
self.ety_name = tk.Entry(self.frm,
width=25,
textvariable=self.name,
font=("Microsoft Yahei",8,'italic'),
fg='gray')
self.ety_name.grid(row=0,column=1,columnspan=3)
self.ety_pwd = tk.Entry(self.frm,
show='*',
width=25,
font=("Microsoft Yahei",8))
self.ety_pwd.grid(row=1,column=1,columnspan=3)
self.btn_write = tk.Button(self.frm,text='写入',width=5,command=self.write)
self.btn_write.grid(row=2,column=3)
self.btn_clear = tk.Button(self.frm,text='删除',width=5,command=self.clear)
self.btn_clear.grid(row=2,column=1)
self.mystr = tk.StringVar()
self.ety_show = tk.Entry(self,textvariable=self.mystr,bg='red')
self.ety_show.pack()
def bind_event(self):
""" 绑定事件"""
self.ety_name.bind('<FocusIn>',self.clear_tip)
self.ety_name.bind('<FocusOut>',self.add_tip)
def clear_tip(self,event):
self.name.set('')
self.ety_name.config(font=("Microsoft Yahei",8),fg='black')
def add_tip(self,event):
if self.ety_name.get() == '' :
self.name.set('请输入邮箱或者手机号')
self.ety_name.config(font=("Microsoft Yahei",8,'italic'),fg='gray')
tkinter.messagebox.showerror(title='警告',message='账号不能为空!')
def write(self):
data = self.ety_name.get()
self.ety_show.delete(0,'end') # 先清空避免里面有数据
self.ety_show.insert('end',data)
def clear(self):
self.ety_show.delete(0,'end') # 从第一个字符删到最后一个字符
App()
Spinbox 限制范围的输入框
Spinbox 是用来选择一个数值范围内的数字的输入组件
tkinter.messagebox.showinfo(message=f'you select {data}')
sbox = tk.Spinbox(root,bg='red',from_=0,to=10,command=show,format='%.2f',justify='center')
sbox.pack()
root.mainloop()
Text 文本框
当有选中文本时,还可以使用以下这种索引:
Text对象的get()方法可以取得目前所选的文字,在使用Text文字区域时,如果有选取文字操作发生时,Text的对象会将所选文字的起始索引放在SEL_FIRST,结束索引放在SEL_LAST,将SEL_FIRST和
SEL_LAST当做get方法的参数,就可以获得目前所选的文字了
compare(index1, op, index2)
返回对比 index1 和 index2 指定的两个字符的结果,op—’<’, ‘<=’, ‘==’, ‘>=’, ‘>’ 或 ‘!=’
delete(index1, index2=None)
删除给定范围的文本或嵌入对象
dlineinfo(index)
返回给定索引指定的字符所在行的边界框,返回值是一个 5 元组:(x, y, width, height, offset),offset 表示从该行的顶端到基线的偏移
dump(index1, index2=None, command=None, **kw)
返回 index1 和 index2 之间的内容 返回的值是一个由 3 元组(关键词,值,索引)组成的列表,关键词参数的顺序为:all, image, mark, tag, text, window ,如果需要筛选个别关键词,可以用 dump(index1, index2, image=True, text=True) 这样的形式调用;如果指定了 command 函数,那么会为列表中的每一个三元组作为参数调用一次该函数(这种情况下,dump() 不返回值
edit_modified(arg=None)
查询和设置 modified 标志
edit_redo()
恢复”上一次的“撤销”操作
edit_reset()
清空存放操作记录的栈
edit_separator()
插入一个“分隔符”到存放操作记录的栈中,用于表示已经完成一次完整的操作
edit_undo()
撤销最近一次操作
get(index1, index2=None)
返回 index1 到 index2(不包含)之间的文本
index(index)
将 index 参数指定的位置以 “line.column” 的索引形式返回
insert(index, chars, *args)
在 index 参数指定的位置插入字符串,参数 tags 用于指定文本的样式
peer_create(self, newPathName, cnf={}, **kw)
用给定的newPathName创建一个同级的文本工具和任何可选的标准配置选项,默认统计文本工具和它的父级工具一样有着相同的起始线和终止线。但是这些可以被标准配置参数重写
peer_names()
返回这个工具的同级工具的列表,不包括这个工具本身
replace(index1, index2, chars, *args)
将 index1 到 index2 之间的内容替换为 chars 参数指定的字符串,如果需要为替换的内容添加 Tag,可以在 args 参数指定 Tag
search(pattern, index, stopindex=None,forwards=None, backwards=None, exact=None,regexp=None, nocase=None, count=None, elide=None)
太长写在下面
see(index)
滚动内容,确保 index 指定的位置可见
search
从 index 开始搜索 pattern,到 stopindex 结束(不指定表示搜索到末尾)
如果成功找到,以 “line.column” 返回第一个匹配的字符;否则返回空字符串
forwards 参数设置为 True 表示向前(->)搜索
backwards 参数设置为 True 表示向后(<-)搜索
exact 参数设置为 True 表示搜索与 pattern 完全匹配的结果
regexp 参数设置为 True,则 pattern 被解释为 Tcl 格式的正则表达式
nocase 参数设置为 True 是忽略大小写,默认是区分大小写的搜索
count 参数指定为一个 IntVar 的 Tkinter 变量,用于存放当找到匹配的字符个数(如果匹配结果中没有嵌入的 image 或 window 对象的话,一般该值等于 pattern 的字符个数)
1. Tags可以设置的属性
background color——背景色
bgstipple bitmap——背景位图
borderwidth pixels——边框宽度
elide boolean——指定是否应该删除数据。已删除的数据(字符、图像、嵌入的窗口等)不显示并且在屏幕上不占用空间,但进一步的行为与普通数据一样
fgstipple bitmap——前景位图
font fontName——字体
foreground color——前景色
justify justify——对齐方式 left, right, or center.
lmargin1 pixels——第一行左边边距
lmargin2 pixels——当一行内容过多而换行,换行的那些行的左边边距
lmargincolor color
offset pixels——指定文本基线应垂直偏移整行基线的量
overstrike boolean——删除线
overstrikefg color——删除线颜色
relief relief
rmargin pixels——右边距
rmargincolor color——右边距颜色
selectbackground color
selectforeground color
spacing1 pixels
spacing2 pixels
spacing3 pixels
tabs tabList
tabstyle style
underline boolean——是否设置下划线
underlinefg color——指定显示下划线时使用的颜色
wrap mode —— none, char, or word
2. Tags方面的函数
tag_add(tagName, index1, index2...)
为 index1 到 index2 之间的内容添加一个 Tag(tagName 参数指定)
如果 index2 参数忽略,则单独为 index1 指定的内容添加 Tag
tag_bind(tagName, sequence, func, add=None)
给tag绑定事件(sequence)
如 Enter, Leave, ButtonPress, Motion, and KeyPress 等事件
import tkinter as tk
import tkinter.messagebox
root = tk.Tk()
root.geometry('600x400')
tx = tk.Text(root)
tx.pack()
tx.tag_config('tg1',background='red',foreground='white',underline=True)
tx.insert('end','xxxxxxxxxx','tg1')
def show(event):
tkinter.messagebox.showinfo(message='hello')
tx.tag_bind('tg1','<Enter>',show)
root.mainloop()
tag_unbind(tagName, sequence, funcid=None)
tag_cget(tagName, option)
返回 tagName 指定的 option 选项的值
tag_config( tagName, cnf=None, **kw)
配置一些属性:背景颜色,前景色,字体等等,可设置的属性在上面有提到
和tag_configure 一样
tag_delete(tagNames)
删除tags
tag_lower(tagName, belowThis=None)
降低 Tag 的优先级
如果 belowThis 参数不为空,则表示 tagName 需要比 belowThis 指定的 Tag 优先级更低
tag_raise(tagName, aboveThis=None)
提升Tag的优先级
如果 aboveThis 参数不为空,则表示 tagName 需要比 aboveThis 指定的 Tag 优先级更高
tag_names(index=None)
返回所有标签名称的列表
tag_nextrange(tagName, index1, index2=None)
在 index1 到 index2 的范围内第一个 tagName 的位置
如果没有则返回空字符串
tag_prevrange(tagName, index1, index2=None)
ag_nextrange() 的反向查找,也就是查找范围是 index2 到 index1
tag_ranges(tagName)
返回所有 tagName 指定的文本,并将它们的范围以列表的形式返回
tag_remove(tagName, index1, index2=None)
删除 index1 到 index2 之间所有的 tagName
如果忽略 index2 参数,那么只删除 index1 指定的那个字符的 tagName
Text控件中插入其他组件
window_cget(index, option)
返回 index 参数指定的嵌入 window 对象的 option 选项的值
如果给定的位置没有嵌入 window 对象,则抛出 TclError 异常
window_config(index, cnf=None, **kw)
修改 index 参数指定的嵌入 window 对象的一个或多个 option 选项的值
如果给定的位置没有嵌入 window 对象,则抛出 TclError 异常
window_create(index, cnf={}, **kw)
align ——对齐方式: TOP、CENTER、BOTTOM 或 BASELINE
create——指定一个回调函数用于创建嵌入的 window 组件,该函数没有参数,并且必须创建 Text 的子组件并返回。
stretch——该选项控制当行的高度大于嵌入组件的高度时,嵌入组件是否延伸。默认值是 False,表示组件保持原形;设置为 True 表示将该组件垂直部分延伸至行的高度
window ——插入的控件
import tkinter as tk
root = tk.Tk()
root.geometry('600x400')
tx = tk.Text(root)
tx.pack()
btn = tk.Button(tx,text='Click')
tx.window_create('end',window=btn)
root.mainloop()
window_names()
返回 Text 组件中嵌入的所有 window 对象的名字
Text控件中插入图片
image_cget(index, option)
返回 index 参数指定的嵌入 image 对象的 option 选项的值
如果给定的位置没有嵌入 image 对象,则抛出 TclError 异常
image_configure(index, cnf=None, **kw)
修改 index 参数指定的嵌入 image 对象的一个或多个 option 选项的值
如果给定的位置没有嵌入 image 对象,则抛出 TclError 异常
image_create( index, cnf={}, **kw)
align——设定此图像的垂直对齐,可以是 TOP、CENTER、BOTTOM 或 BASELINE
image—— image 对象必须是 Tkinter 的 PhotoImage 或 BitmapImage 实例
name——你可以为该图像实例命名
image_names()
返回 Text 组件中嵌入的所有 image 对象的名字
Mark文本标记
Mark(标记)通常被用来当作书签,它可以帮助用户快速找到内容的指定位置,并且跟随相应的字符一起移动。
Mark 有两种类型的标记,分别是“INSERT”和“CURRENT”,其含义如下:
INSERT:指定当前插入光标的位置,Tkinter 会在该位置绘制一个闪烁的光标;
CURRENT:用于指定当前光标所处坐标最邻近的位置。
Mark相关的函数
mark_gravity(markName, direction=None)
设置 Mark 的移动方向,默认是 "right",也可以设置为 "left" ,表示即如果在 Mark 处插入文本的话,Mark 的标记移动方向,也就是文本的插入方向。
mark_names()
返回 Text 组件中所有 Marks 的名字
mark_next(index)
返回在 index 指定的位置后边的一个 Mark 的名字
mark_previous(index)
返回在 index 指定的位置前边的一个 Mark 的名字
mark_set(markName, index)
移动 Mark 到 index 参数指定的位置,如果 markName 参数指定的 Mark 不存在,则创建一个新的 Mark
mark_unset(*markNames)
删除指定的 Mark
import tkinter as tk
import tkinter.messagebox
tk.Label(self.frm,text='标记名称').grid(row=0,column=0)
tk.Label(self.frm,text='插入内容').grid(row=1,column=0)
self.ety_mark = tk.Entry(self.frm)
self.ety = tk.Entry(self.frm)
self.ety_mark.grid(row=0,column=1,columnspan=2)
self.ety.grid(row=1,column=1,columnspan=2)
self.btn_add = tk.Button(self.frm,text='添加标记',command=self.add_mark)
self.btn_delete = tk.Button(self.frm,text='删除标记',command=self.delete_mark)
self.btn_add.grid(row=2,column=1)
self.btn_delete.grid(row=2,column=2)
self.btn_show = tk.Button(self.frm,text='显示标记',command=self.show_mark)
self.btn_write = tk.Button(self.frm,text='插入内容',command=self.write)
self.btn_show.grid(row=3,column=1)
self.btn_write.grid(row=3,column=2)
def add_mark(self):
"""添加标记"""
mark = self.ety_mark.get()
if mark == '':
tkinter.messagebox.showerror(message='请输入标记的名称')
return
else:
self.text.mark_set(mark,'insert')
def delete_mark(self):
"""删除标记"""
mark = self.ety_mark.get()
if mark == '':
tkinter.messagebox.showerror(message='请输入标记的名称')
return
else:
self.text.mark_unset(mark)
def show_mark(self):
"""显示标记"""
mark = self.ety_mark.get()
if mark == '':
tkinter.messagebox.showerror(message='请输入标记的名称')
return
else:
self.text.see(mark)
except tk.TclError:
tkinter.messagebox.showerror(message=f'{mark}该标记不存在')
def write(self):
"""往标记的位置写入内容"""
mark = self.ety_mark.get()
contents = self.ety.get()
if (mark != '') & (contents != ''):
self.text.insert(mark,contents)
else:
tkinter.messagebox.showerror(message='标记名称和插入内容不能有空白!')
App()
Label 标签
ui_dir = os.path.dirname(os.path.realpath(sys.argv[0]))
ico_path = os.path.join(ui_dir,'ico/logox16.ico')
root = tk.Tk()
root.geometry('600x300+100+100')
root.configure(bg='#1BA135')
lab = tk.Label(text='账号',
relief='sunken',
width=10,
bg='#14B5F1',
fg='#FA536C',
bitmap=ico_path).grid(row=0,column=0)
lab2 = tk.Label(text='密码',
relief='sunken',
width=10,
bg='#14B5F1',
fg='#FA536C').grid(row=1,column=0)
root.title('test app') # 设置窗口的标题
root.mainloop()
bbox(index)
返回给定索引号对应的选项的边框,返回值是一个以像素为单位的 4 元祖表示边框:(xoffset, yoffset, width, height), xoffset 和 yoffset 表示距离左上角的偏移位置
curselection()
返回一个元组,包含被选中的选项序号(从 0 开始)
delete(first, last=None)
删除参数 first 到 last 范围内(包含 first 和 last)的所有选项
get(first, last=None)
返回一个元组,包含参数 first 到 last 范围内(包含 first 和 last)的所有选项的文本
index(index)
返回与 index 参数相应选项的序号
itemcget(index, option)
获得 index 参数指定的项目对应的选项(由 option 参数指定)
itemconfig(index, **options)
设置 index 参数指定的项目对应的选项(由可变参数 **option 指定)
nearest(y)
返回与给定参数 y 在垂直坐标上最接近的项目的序号
selection_set(first, last=None)
设置参数 first 到 last 范围内(包含 first 和 last)选项为选中状态,使selection_includes(序号) 可以判断选项是否被选中。
size()
返回 Listbox 组件中选项的数量
xview(*args)
该方法用于在水平方向上滚动 Listbox 组件的内容,一般通过绑定 Scollbar 组件的 command 选项来实现。 如果第一个参数是 "moveto",则第二个参数表示滚动到指定的位置:0.0 表示最左端,1.0 表示最右端;如果第一个参数是 "scroll",则第二个参数表示滚动的数量,第三个参数表示滚动的单位(可以是 "units" 或 "pages"),例如:xview("scroll", 2, "pages")表示向右滚动二行。
yview(*args)
该方法用于在垂直方向上滚动 Listbox 组件的内容,一般通过绑定 Scollbar 组件的 command 选项来实现
import tkinter as tk
import tkinter.messagebox
class App(tk.Tk):
def __init__(self):
super().__init__()
self.geometry('600x400')
self.set_widget()
self.mainloop()
def set_widget(self):
self.frm = tk.Frame(self)
self.frm.pack()
tk.Label(self.frm,text='Item').grid(row=0,column=0)
tk.Label(self.frm,text='Like').grid(row=0,column=1)
self.items = tk.StringVar()
self.items.set(['Python','Java','C++'])
self.likes = tk.StringVar()
self.listbox_items = tk.Listbox(self.frm,listvariable=self.items)
self.listbox_items.grid(row=1,column=0)
self.listbox_items.selection_set(0) # 设置默认选中选项,index从0开始
self.listbox_likes = tk.Listbox(self.frm,listvariable=self.likes)
self.listbox_likes.grid(row=1,column=1)
self.btn_add = tk.Button(self.frm,text='Add',width=10,command=self.add_itme)
self.btn_add.grid(row=2,column=0)
self.btn_delete = tk.Button(self.frm,text='Delete',width=10,command=self.delete_itme)
self.btn_delete.grid(row=2,column=1)
def add_itme(self):
item = self.listbox_items.get(self.listbox_items.curselection())
num = self.listbox_likes.size()
if num > 0 :
likes = self.listbox_likes.get(0,num-1)
if item not in likes:
self.listbox_likes.insert('end',item)
else:
tkinter.messagebox.showerror(message=f'{item}已经存在了。')
else:
self.listbox_likes.insert('end',item)
except tk.TclError:
tkinter.messagebox.showerror(message='无效选择,必须选中item列表框的项目才能新增')
def delete_itme(self):
delete_item = self.listbox_likes.curselection()
if not delete_item :
tkinter.messagebox.showerror(message='没有选择要删除的项目,只能删除like列表框中的项目')
else:
self.listbox_likes.delete(delete_item)
App()
ttk_combobox 下拉列表
data = cbx.get()
tkinter.messagebox.showinfo(message=data)
btn = tk.Button(root,text='show',command=show)
btn.pack()
root.mainloop()
Frame 框架
root.geometry('600x400')
pw1 = tk.PanedWindow(root,orient='horizontal',sashwidth=5,sashrelief='sunken')
pw1.pack(fill='both',expand=True)
frm_L = tk.Frame(pw1)
pw1.add(frm_L,padx=10,pady=10,width=150)
pw2 = tk.PanedWindow(pw1,orient='vertical',sashwidth=5,sashrelief='sunken')
pw1.add(pw2)
frm_R_T = tk.Frame(pw2)
pw2.add(frm_R_T,height=100,padx=10,pady=10)
frm_R_B = tk.Frame(pw2)
pw2.add(frm_R_B,padx=10,pady=10)
btn1 = tk.Button(frm_L,text='Left')
btn1.pack()
btn2 = tk.Button(frm_R_T,text='Right-Top')
btn2.pack()
btn3 = tk.Button(frm_R_B,text='Right-bottom')
btn3.pack()
root.mainloop()
ttk_separator 分割线
nt.add(tab1,text='Python',sticky='w',padding=30)
nt.add(tab2,text='Java')
nt.add(tab3,text='C++')
root.mainloop()
Scale滑块
value
进度条的当前值。在 determinate 模式下代表已完成的工作量。在 indeterminate 模式下,解释为 maximum 的模;也就是说,当本值增至 maximum 时,进度条完成了一个“周期”。
phase
只读属性。只要值大于 0 且在 determinate 模式下小于最大值,控件就会定期增大该属性值。当前主题可利用本属性提供额外的动画效果。
添加分割线 menu.add_separator()
添加复选菜单 menu.add_checkbutton()
添加单选菜单 menu.add_radiobutton()
import tkinter as tk
import tkinter.messagebox
# 1. 普通菜单的设置
# 2. 二级菜单的设置
# 3. 给菜单命令添加快捷键注释,以及添加快捷键
# 4. 添加鼠标右击弹出菜单。
def show():
tkinter.messagebox.showinfo(message='you click!')
def __show(event):
# 和上面的函数功能相同,只是因为bind的时候会传入一个参数event,所以要有一个接收的参数。
show()
root = tk.Tk()
root.geometry('600x400')
## 添加菜单的流程
# 1. 新建一个菜单
# 2. 往菜单里添加命令
# 3. 往菜单栏里添加新建的菜单
menubar = tk.Menu(root)
file_menu = tk.Menu(menubar,tearoff=0)
file_menu.add_command(label='open',command=show,accelerator='Ctrl+o') # 这边的快捷键设置,只是添加一个文字而已,没有快捷键的作用。
file_menu.add_command(label='create',command=show,accelerator='Ctrl+t')
file_menu.add_separator()
var_p = tk.IntVar()
var_j = tk.IntVar()
var_r = tk.IntVar()
def check():
if (var_p.get() == 1) & ( var_j.get() == 1) :
tkinter.messagebox.showinfo(message='我喜欢python,也喜欢Java')
elif (var_p.get() == 1) & (var_j.get() == 0) :
tkinter.messagebox.showinfo(message='我只喜欢python')
elif (var_p.get() == 0) & (var_j.get() == 1) :
tkinter.messagebox.showinfo(message='我只喜欢Java')
else:
tkinter.messagebox.showinfo(message='我两个都不喜欢')
def radio():
if var_r.get() == 1:
tkinter.messagebox.showinfo(message='你是男的')
else:
tkinter.messagebox.showinfo(message="你是女的")
############ checkbutton是可以多选
file_menu.add_checkbutton(label='python',variable=var_p,onvalue=1,offvalue=0,command=check)
file_menu.add_checkbutton(label='java',variable=var_j,onvalue=1,offvalue=0,command=check)
file_menu.add_separator()
############ radiobutton是只能单选
file_menu.add_radiobutton(label='男',variable=var_r,value=1,command=radio)
file_menu.add_radiobutton(label='女',variable=var_r,value=0,command=radio)
menubar.add_cascade(label='File',menu=file_menu)
# 子菜单
sub_menu = tk.Menu(file_menu,tearoff=0)
sub_menu.add_command(label='From csv',command=show)
sub_menu.add_command(label='From PDF',command=show)
sub_menu.add_command(label='From Excel',command=show)
file_menu.add_cascade(label='Import data From',menu=sub_menu)
root.config(menu=menubar)
######## 添加快捷键
root.bind_all("<Control-o>",__show)
root.bind_all("<Control-t>",__show)
######## 鼠标右击弹出菜单
def pop_up_menu(event):
# 在鼠标点击的地方弹出菜单
pop_menu.post(event.x_root,event.y_root)
pop_menu = tk.Menu(root,tearoff=0)
pop_menu.add_command(label='eidt',command=show)
pop_menu.add_command(label='save',command=show)
root.bind("<Button-3>",pop_up_menu)
########
root.mainloop()
OptionMenu
def show():
tkinter.messagebox.showinfo(message=f'i like {mystr.get()}')
btn = tk.Button(root,text='show',command=show)
btn.pack()
root.mainloop()
ttk_sizegrip 窗口大小拖动块
控件允许用户通过按下并拖动控制柄来调整内部顶层窗口的大小。就是一个用来调整窗口大小的控件。
import tkinter as tk
import tkinter.ttk as tk2
root = tk.Tk()
root.geometry('600x400')
tk2.Sizegrip(root).place(x=560,y=360)
root.mainloop()
anchor:指定此列中的文本应如何相对于单元格对齐 n, e, s, w center 等
minwidth:列的最小宽度(以像素为单位)
stretch:指定调整小部件大小时是否应调整列的宽度。True or False
width:列的宽度(以像素为单位)
delete(*items)
删除指定的项目
exists(item)
判断项目时存在
focus(item=None)
当有填入参数item,则聚焦于该item,如果没有,会聚焦于最近的,或者没有
heading(column, option=None, **kw)
查询或修改指定列的标题选项
Option
text:列的名称
image:图标
anchor:标题的对齐方式,n e s w center 等
command:添加函数
insert(parent, index, iid=None, **kw)
创建新项并返回新创建项的项标识符
item(item, option=None, **kw)
查询或修改指定项的选项
move(item, parent, index)
将项目移动到父子列表中的位置索引
next(item)
下一个项目
prev(item)
上一个项目
selection()
Returns a tuple of selected items
selection_set(*items)
items becomes the new selection 点中项目
selection_add(*items)
Add items to the selection
selection_remove(*items)
Remove items from the selection
xview(args) 和 yview(args)
用于设置拖动条的
复制以下代码运行测试时,需要自己填一份Excel表格数据,记得修改路径,数据类似下面这样的
tv = tk2.Treeview(frm,columns=titles,show='headings',padding=10)
for col in titles:
tv.heading(column=col,text=col)
tv.column(col,anchor='center') # 这是列里面数据的对其方式
tv.pack()
def get_data():
for i in range(len(df)):
tv.insert(parent='',index='end',values=list(df.iloc[i]))
tv.selection_set(tv.get_children()[0])
def clear():
""" 删除所有项目"""
items = tv.get_children()
for item in items:
tv.delete(item)
def delete():
""" 删除所选项目 """
ss = tv.selection() # 获取选择的项目,返回的是item对象
if ss :
for s in ss:
tv.delete(s)
else:
tkinter.messagebox.showerror(message='没有选中要删除的行')
def t_up():
""" 向上移动 """
items = tv.get_children()
select = tv.selection() # 获取当前选中的
if select:
if select[0] != items[0]:
prev = tv.prev(select[0]) # 当前选中的上一个
tv.selection_set(prev) # 点中项目
else:
tkinter.messagebox.showerror(message='这是第一个不能再往上了!')
else:
tkinter.messagebox.showerror(message='没有选中任何一行,不能移动')
def t_down():
""" 向下移动 """
items = tv.get_children()
num = len(items)
select = tv.selection() # 获取当前选中的
if select:
if select[0] != items[num-1]:
prev = tv.next(select) # 当前选中的上一个
tv.selection_set(prev) # 点中项目
else:
tkinter.messagebox.showerror(message='这是最后一个不能再往下拉!')
else:
tkinter.messagebox.showerror(message='没有选中任何一行,不能移动')
btn = tk.Button(frm,text='GetData',command=get_data)
btn.pack()
btn_d = tk.Button(frm,text='DeleteSelect',command=delete)
btn_d.pack()
btn_c = tk.Button(frm,text='ClearAll',command=clear)
btn_c.pack()
btn_up = tk.Button(frm,text='Up',command=t_up)
btn_up.pack()
btn_down = tk.Button(frm,text='Down',command=t_down)
btn_down.pack()
root.mainloop()
Canvas 画布
activedash 当画布对象状态为 "active" 的时候,绘制虚线
activefill 当画布对象状态为 "active" 的时候,填充颜色
activestipple 当画布对象状态为 "active" 的时候,指定填充的位图
activewidth 当画布对象状态为 "active" 的时候,指定边框的宽度
disableddash 当画布对象状态为 "disabled" 的时候,绘制虚线
disabledfill 当画布对象状态为 "disabled" 的时候,填充颜色
disabledstipple 当画布对象状态为 "disabled" 的时候,指定填充的位图
disabledwidth 当画布对象状态为 "disabled" 的时候,指定边框的宽度
arrow
"first" 表示添加箭头到线段开始的位置
"last" 表示添加箭头到线段结束的位置
"both" 表示两端均添加箭头
arrowshape 用一个三元组来指定箭头的形状,默认值是 (8, 10, 3),元组中的数值分别代表箭头中三条边的长度
capstyle 线条的样式
"butt"(线段的两段平切于起点和终点)
"projecting"(线段的两段在起点和终点的位置将 width 选项设置的长度分别延长一半)
"round"(线段的两段在起点和终点的位置将 width设置的长度分别延长一半,并以圆角进行绘制)
dash 绘制虚线,该选项值是一个整数元组,元组中的元素分别代表短线的长度和间隔,比如 (3, 5) 代表 3 个像素的短线和 5 个像素的间隔
dashoffset 指定虚线开始的偏移位置,比如 dash=(5, 1, 2, 1),dashoffset=3,则从 2 开始画虚线
fill 指定填充的颜色,空字符串表示透明
joinstyle 指定当绘制两个相邻线段之间时接口的样式,默认为 "round"
"round"(以连接点为圆心,1/2 width 选项设置的长度为半径来绘制圆角)
"bevel"(在连接点处将两线段的夹角做平切操作)
"miter"(沿着两线段的夹角延伸至一个点)
offset 指定当点画模式时填充位图的偏移
smooth 默认值为 False,若设置为 True,表示将以曲线的样式代替所绘线段
splinesteps 当绘制曲线的时,该选项指定由多少条折线来构成曲线,默认值是 12,这里需要注意,只有当 smooth 选项为 True 时该选项才会生效。
state 指定该画布对象的状态,默认值为 "normal",参数值有 "normal","disabled"(不可用)和 "hidden"(隐藏)三种状态。
stipple 指定一个位图进行填充,默认值为空字符串,表示实心
tags 为创建的画布对象添加标签
width 指定边框的宽度
圆形或椭圆形 create_oval(x0, y0, x1, y1, options)
至少三个点的多边形 create_polygon(x0, y0, x1, y1, ... , xn, yn, options)
矩形 create_rectangle(x0, y0, x1, y1, options)
弧形 create_arc(coord, start, extent, fill)
文本 create_text(x0, y0, text, options)
图片 create_image(x, y, image)
位图 create_bitmap(x, y, bitmap)
有gray12、gray25、gray50、gray75、hourglass、error、questhead、info、warning 或 question可选。
对于扇形、矩形、三角形、圆形等,这些封闭式图形可设置的参数