本文给出 Tkinter 组件使用的示例。
Update: 2022 / 11 / 2
大部分控件共享属性,如下表格:
| 属性 | 特例 | 含义 | 单位 | 常见值 |
|---|---|---|---|---|
background (bg) | 当控件显示时,给出的正常颜色 | color | gray25、#ff4400 | |
borderwidth (bd) | 设置一个非负值, 该值显示画控件外围 3D 边界的宽度; (特别的由 relief 选项决定这项决定)。控件内部的 3D 效果也可以使用该值 | pixel | 3 | |
cursor | 指定控件使用的鼠标光标,该值可以是 Tkinter 接受的任何格式 | cursor | gumby | |
font | Canva、Frame、Scrollbar、Toplevel | 指定控件内部文本的字体 | font | Helvetica、(Verdana, 8) |
foreground (fg) | Canvas、Frame、Scrollbar、Toplevel | 指定控件的前景色 | color | black、#ff2244 |
highlightbackground | Menu | 指出经过没有输入焦点的控件加亮区域颜色 | color | gray30 |
highlightcolor | Menu | 指出经过没有输入焦点的控件周围长方区域加亮颜色 | color | royalblue |
highlightthickness | Menu | 设置一个非负值,该值指出一个有输入焦点的控件周围加亮方形区域的宽度,该值可以是 Tk_GetCursor 接受的任何格式。如果为 0, 则不画加亮区域 | pixel | 2.1m |
relief | 指出控件3D效果.可选值为 RAISED, SUNKEN, FLAT, RIDGE, SOLID, GROOVE,该值指出控件内部相对于外部的外观样式,比如 RAISED 意味着控件内部相对于外部突出 | constant | RAISED、GROOVE | |
takefocus | 决定窗口在键盘遍历时是否接收焦点(比如 Tab, shift-Tab )。在设定焦点到一个窗口之前,遍历脚本检查 takefocus 选项的值, 值 0 意味着键盘遍历时完全跳过, 值 1 意味着只要有输入焦点 (它及所有父代都映射过) 就接收。空值由脚本自己决定是否接收, 当前的算法是如果窗口被禁止, 或者没有键盘捆绑或窗口不可见时, 跳过 | boolean | 1 YES | |
width | Menu | 指定一个整数, 设置控件宽度, 控件字体的平局字符数。如果值小于等于 0, 控件选择一个能够容纳目前字符的宽度 | integer | 32 |
activebackground | Button, Checkbutton, Menu, Menubutton, Radiobutton, Scale, Scrollbar | 指定画活动元素的背景颜色.元素(控件或控件的一部分)在鼠标放在其上并按动鼠标按钮引起某些行为的发生时,是活动的。如果严格的 Modf 一致性请求通过设置 tk_strictModf 变量完成,该选项将被忽略,正常背景色将被使用.对 Windows 和 Macintosh 系统,活动颜色将只有在鼠标按钮 1 被按过元素时使用 | color | red、#fa07a3 |
activeforeground | Button, Menu, Checkbutton, Menubutton, Radiobutton | 指定画活动元素时的前景颜色。参见上面关于活动元素的定义 | color | cadeblue |
anchor | Button, Checkbutton, Label, Message, Menubutton, Radiobutton | 指出控件信息(比如文本或者位图)如何在控件中显示.必须为下面值之一 N, NE, E, SE, S, SW, W, NW 或者 CENTER。比如 NW ( NorthWest ) 指显示信息时使左上角在控件的左上端 | constant | |
bitmap | Button, Checkbutton, Label, Menubutton, Radiobutton | 指定一个位图在控件中显示,以 Tkinter (Tk_GetBitmap) 接受的任何形式.位图显示的精确方式受其他选项如锚或对齐的影响.典型的,如果该选项被指定,它覆盖指定显示控件中文本的其他选; bitmap 选项可以重设为空串以使文本能够被显示在控件上.在同时支持位图和图像的控件中,图像通常覆盖位图 | bitmap | |
command | Button, Checkbutton, Radiobutton, Scale, Scrollbar | 指定一个与控件关联的命令.该命令通常在鼠标离开控件之时被调用,对于单选按钮和多选按钮,tkinter变量(通过变量选项设置)将在命令调用时更新 | command | function 类型 |
disabledforeground | Button, Checkbutton, Radiobutton, Menu, Menubutton | 指定绘画元素时的前景色.如果选项为空串(单色显示器通常这样设置),禁止的元素用通常的前景色画,但是采用点刻法填充模糊化 | color | gray50 |
height | Button, Canvas, Frame, Label, Listbox, Checkbutton, Radiobutton, Menubutton, Text, Toplevel | 指定窗口的高度, 采用字体选项中给定字体的字符高度为单位,至少为 1 | integer | 1 4 |
image | Button, Checkbutton, Label, Menubutton, Radiobutton | 指定所在控件中显示的图像,必须是用图像 create 方法产生的.如果图像选项设定,它覆盖已经设置的位图或文本显示; 更新恢复位图或文本的显示需要设置图像选项为空串 | image | |
justify | Button, Checkbutton, Entry, Label, Menubutton, Message, Radiobutton | 当控件中显示多行文本的时候,该选项设置不同行之间是如何排列的,其值为如下之一: LEFT, CENTER 或 RIGHT。LEFT 指每行向左对齐, CENTER 指每行居中对齐, RIGHT 指向右对齐 | constant | RIGHT |
padx | Button, Checkbutton, Label, Menubutton, Message, Radiobutton, Text | 指定一个非负值设置控件X方向需要的边距.该值为 Tkinter(Tk_GetPixels) 接受的格式.当计算需要多大的窗口时,控件会把此值加到正常大小之上(由控件中显示内容决定); 如果几何管理器能够满足此请求,控件将在左端或右端得到一个给定的多余空边. 大部分控件只用此项于文本, 如果它们显示位图或图像,通常忽略空边选项 | pixels | 2m 10 |
pady | Button, Checkbutton, Label, Menubutton, Message, Radiobutton, Text | 指定一个非负值设置控件 Y 方向需要的边距。该值为 Tkinter(Tk_GetPixels) 接受的格式。当计算需要多大的窗口时, 控件会把此值加到正常大小之上(由控件中显示内容决定); 如果几何管理器能够满足此请求, 控件将在上端或下端得到一个给定的多余空边。大部分控件只用此项于文本, 如果它们显示位图或图像, 通常忽略空边选项 | pixels | 12 3m |
selectbackground | Canvas, Listbox, Entry, Text | 指定显示选中项时的背景颜色 | color | blue |
selectborderwidth | Canvas, Entry, Listbox, Text | 指定一个非负值,给出选中项的三维边界宽度,值可以是任何 Tkinter(Tk_GetPixels) 接受的格式 | pixel | 3 |
selectforeground | Canvas, Entry, Listbox, Text | 指定显示选中项的前景颜色 | color | yellow |
state | Button, Checkbutton, Entry, Menubutton, Scale, Radiobutton, Text | 指定控件下列两三个状态之一 (典型是复选按钮) NORMAL 和 DISABLED 或NORMAL, ACTIVE 和 DISABLED。在 NORMAL 状态,控件有前景色和背景显示; 在 ACTIVE 状态, 控件按 activeforeground 和 activebackground 选项显示; 在 DISABLED 状态下, 控件不敏感, 缺省捆绑将拒绝激活控件, 并忽略鼠标行为, 此时,由 disabled foreground 和 background 选项决定如何显示 | constant | ACTIVE |
text | Button, Checkbutton, Label, Menubutton, Message, Radiobutton | 指定控件中显示的文本,文本显示格式由特定控件和其他诸如锚和对齐选项决定 | string | Display |
textvariable | Button, Checkbutton, Label, Menubutton, Message, Radiobutton | 指定一个变量名字.变量值被转变为字符串在控件上显示.如果变量值改变,控件将自动更新以反映新值,字符串显示格式由特定控件和其他诸如锚和对齐选项决定 | variable | widgetConstant |
underline | Button, Checkbutton, Label, Menubutton, Radiobutton | 指定控件中加入下划线字符的整数索引.此选项完成菜单按钮与菜单输入的键盘遍历缺省捆绑. 0 对应控件中显示的第一个字符, 1 对应第二个, 以此类推 | integer | 2 |
wraplength | Button, Checkbutton, Label, Menubutton, Radiobutton | 对于能够支持字符换行的控件,该选项指定行的最大字符数,超过最大字符数的行将转到下行显示,这样一行不会超过最大字符数.该值可以是窗口距离的任何标准格式.如果该值小于或等于 0, 不换行, 换行只有在文本中的换行符的地方才出现 | pixel | 41,65 |
xscrollcommand | Canvas, Entry, Listbox, Text | 指定一个用来与水平滚动框进行信息交流的命令前缀,当控件窗口视图改变(或者别的任何滚动条显示的改变,如控件的总尺寸改变等等),控件将通过把滚动命令和两个数连接起来产生一个命令.两个数分别为 0 到 1 之间的分数,代表文档中的一个位置, 0 表示文档的开头, 1.0 表示文档的结尾处, 0.333 表示整个文档的三分之一处, 如此等等。第一个分数代表窗口中第一个可见文档信息, 第二个分数代表紧跟上一个可见部分之后的信息。然后命令把它们传到 Tcl 解释器执行。典型的 xscrollcommand 选项由滚动条标识跟着 set 组成, 如 set.x.scrollbar, set 将引起滚动条在窗口中视图变化时被更新。如果此项没有指定,不执行命令 | function | |
yscrollcommand | Canvas, Entry, Listbox, Text | 指定一个用来与垂直滚动框进行信息交流的命令前缀, 当控件窗口视图改变(或者别的任何滚动条显示的改变,如控件的总尺寸改变等等), 控件将通过把滚动命令和两个数连接起来产生一个命令.两个数分别为 0 到 1 之间的分数, 代表文档中的一个位置, 0 表示文档的开头, 1.0 表示文档的结尾处, 0.333 表示整个文档的三分之一处, 如此等等。第一个分数代表窗口中第一个可见文档信息, 第二个分数代表紧跟上一个可见部分之后的信息。然后命令把它们传到 Tcl 解释器执行。典型的 yscrollcommand 选项由滚动条标识跟着 set 组成, 如set.y.scrollbar, set 将引起滚动条在窗口中视图变化时被更新。如果此项没有指定, 不执行命令 | function |
为了响应特定小控件的值的变化,Tkinter 提供了自己的变量类,它们可以用来跟踪这些小控件的值。
| 变量类型 | 含义 |
|---|---|
tk.Stringvar() | 字符串型 |
tk.BooleanVar() | 布尔型 |
tk.IntVar() | 整型 |
tk.DoubleVar() | 浮点型 |
将变量类与控件关联,如下所示:
tk.Entry(root, textvariable=tk.Stringvar())tk.Checkbutton(root, text="选我", variable=tk.BooleanVar())tk.Radiobutton(root, text="点我", variable=tk.IntVar()) tk.Scale(root, label="音量", variable=tk.DoubleVar())
变量类的操作,使用 set 和 get 方法。
Entry 输入框中设置文本来设定控件的关联值, 比如 tk.Stringvar().set("")tk.Stringvar().get() 来获取 Entry 输入框中用户输入的内容。def interface(self):""""界面编写位置"""label = Label(self.root, text='I like tkinter',fg="lightblue", bg="lightyellow")label.pack()
运行效果如下,

def interface(self):""""界面编写位置"""self.Button0 = tk.Button(self.root, text="运行", command=self.event)self.Button0.grid(row=0, column=0)self.Button1 = tk.Button(self.root, text="退出", command=self.root.destroy, bg="Gray") # bg=颜色self.Button1.grid(row=0, column=1, sticky="e", ipadx=10)def event(self):"""按钮事件"""print("运行成功")return '按钮事件结束啦!'
entry.get()get 方法获取文本框中的内容 1 。def interface(self):""""界面编写位置"""self.entry00 = tk.StringVar()self.entry00.set("默认信息")self.entry0 = tk.Entry(self.root, textvariable=self.entry00)self.entry0.grid(row=0, column=0)self.Button0 = tk.Button(self.root, text="运行", command=self.event)self.Button0.grid(row=1, column=0)def event(self):"""按钮事件,获取文本信息"""global entryentry = self.entry00.get()

对于输入框内容的获取、清除的实例,可参考此处 2。
参考这里 3
entry.insert(index, chars)GUI 程序时,常常需要在建立 Entry 的文本框内默认建立输入文字,在 Widget 控件中可以使用 insert(index, s) 方法插入字符串。s 是所插入的字符串,字符串会插在 index 位置 2:如果第1个参数是 0, 表示从最开始的位置插入;如果是 INSERT,表示从光标所在位置插入;如果是 END,表示在末尾插入。entry(root, textvariable=tk.StringVar(value=defaultvalue))tk.StringVar 变量,设置其 value 为一个 defaultvalue。在创建 Entry 控件时,使用 textvariable 参数指向默认值。delete(first, last=None)tkinter 模块的应用中可以使用 delete(first, last=None) 方法删除 Entry 内的从第 first 字符到 last-1 字符间的字符串,如果要删除整个字符串可以使用 delete(0, END)。如果删除倒数第一个,我们可以用 len() 方法判断长度,然后长度减一就行。
如果只有一个参数的话,那这个参数将是 first,如不是 last,len_entry - 1 相当于是从到底第一个开始删除,一直到末尾。
例子:单击删除按钮清空文本框内容 2。
Python 有一个非常好用的计算数学表达式的函数 eval。
该函数可以直接传回此数学表达式的计算结果,它的语法格式:
"""expression为字符串"""
result = eval(expression)
实例可参考这里 2。
Text.get(start, end)text.get(“0.0”, “end”),第1个参数 0.0 是指从第 0 行第 0 列开始读取( 1.3 表示从第 1 行第 3 列开始读取),第2个参数 End 表示最后一个字符 1’ 4’ 5。def interface(self):""""界面编写位置"""self.w1 = tk.Text(self.root, width=20, height=3)self.w1.grid(row=0, column=0)self.Button0 = tk.Button(self.root, text="获取", command=self.event)self.Button0.grid(row=1, column=0)def event(self):get = self.w1.get("0.0", "end")print(f'get: {get}.')
def interface(self):""""界面编写位置"""self.text = Text(self.root, width=40, height=10)self.text.grid(column=2, padx=30, pady=20, sticky=W + E + S + N)scr1 = Scrollbar(self.root, width=10)scr1.grid(row=0, column=3, padx=10, pady=20, sticky=N + S)self.text.config(yscrollcommand=scr1.set)scr1.config(command=self.text.yview)for i in range(1001, 1050):self.text.insert(END, str(i) + f' {datetime.datetime.now()}\n')self.entry = tk.Entry(self.root, width=40)self.entry.grid(row=5, column=2, padx=30)self.text.bind("", self.fill)# 绑定鼠标左键释放事件,抬起鼠标按键,立即输出鼠标选中的内容def fill(self, event):self.entry.delete(0, "end")try:self.entry.insert(INSERT, self.text.get(SEL_FIRST, SEL_LAST))except TclError:pass
运行效果如下所示:

Text.delete(start, end)def interface(self):""""界面编写位置"""self.w1 = tk.Text(self.root, width=20, height=3)self.w1.grid(row=0, column=0)self.w1.insert("insert", "默认信息")self.Button0 = tk.Button(self.root, text="清除", command=self.event)self.Button0.grid(row=1, column=0)def event(self):"""清空输入框"""self.w1.delete(0.0, "end")
参考这里 4
def interface(self):""""界面编写位置"""te1 = Text(self.root, width=30, height=20)te1.grid(columnspan=2)te1.insert(END, '准备\n\n')te1.insert(END, '开始\n\n')# 创建标签te1.tag_add('tag1', '1.5', '1.12')te1.tag_config('tag1', background='lightyellow', foreground='red', font='黑体 12')te1.tag_add('tag2', '3.3', '3.end')te1.tag_config('tag2', foreground='blue', font=('宋体', 10, 'underline'))te1.tag_config('tag3', foreground='red', underline=True) # 红字下划线te1.tag_config('tag4', foreground='blue', overstrike=True) # 蓝字删除线but1 = Button(self.root, text="插入内容1", command=lambda: te1.insert(END, '标签1\n', 'tag1'))but1.grid(row=1, column=0)but2 = Button(self.root, text="插入内容2", command=lambda: te1.insert(END, '标签2\n', 'tag2'))but2.grid(row=1, column=1)but3 = Button(self.root, text="插入内容3", command=lambda: te1.insert(END, '标签3\n', 'tag3'))but3.grid(row=1, column=2)but4 = Button(self.root, text="插入内容4", command=lambda: te1.insert(END, '标签4\n', 'tag4'))but4.grid(row=1, column=3)# 插入的文本用tag3和tag4混合设置,相同的设置,后面的设置覆盖以前的设置but5 = Button(self.root, text="混合1", command=lambda: te1.insert(END, '混合1\n', ('tag3','tag4')))but5.grid(row=2, column=0)but6 = Button(self.root, text="混合2", command=lambda: te1.insert(END, '混合2\n', ('tag4', 'tag3')))but6.grid(row=2, column=1)but7 = Button(self.root, text="混合3", command=lambda: te1.insert(END, '混合3\n', ('tag1', 'tag2')))but7.grid(row=2, column=2)but8 = Button(self.root, text="混合4", command=lambda: te1.insert(END, '混合4\n', ('tag2', 'tag1')))but8.grid(row=2, column=3)
运行效果如下:

插入文本,用 tag3 和 tag4 混合设置,由于 tag_config(tag4,…) 是后于 tag3 设置的,后面如果跟前面有相同的设置,那后面的设置就会覆盖以前的设置,所以,混合1 和 混合2 的输出结果在字体颜色是采取 tag4 的设置,但下划线设置由于 tag4 没有相关的设置,所以还是采用 tag3 的红色下划线设置。
注意:标签设置的前先顺序是由 tag_config 来决定的,不是由 insert() 的第 3 个参数的先后顺序来决定。
def interface(self):""""界面编写位置"""self.te1 = Text(self.root, width=40, height=10)self.te1.insert(END, 'Life is short. \nDo whatever you would like to do。')self.te1.grid(row=2, column=1, padx=10)self.te1.tag_config(SEL, background='red', foreground='white', font='黑体 15')self.te2 = Text(self.root, width=40, height=2)self.te2.grid(row=4, column=1, padx=10)self.te1.bind("", self.getSELidx)def getSELidx(self, event):self.te2.delete(0.0, 'end')self.te2.insert(INSERT, self.te1.index(SEL_FIRST) + ' - ' + self.te1.index(SEL_LAST))
运行效果如下:

运行后,鼠标选中一段文本,会看到选中字体大小及颜色的效果,也同时输入系统内置的书签SEL_FIRST 和 SEL_LAST 的位置。
def interface(self):""""界面编写位置"""import webbrowserte1 = Text(self.root, width=35, height=3)te1.pack(fill=BOTH, expand=True)te1.insert(END, '一起围观 她的主页 吧。')te1.tag_add('wz', '1.5', '1.10') # ('tag1','x1','x2')te1.tag_config('wz', foreground='orange') # 鼠标选中标签位置字体背景颜色变蓝色te1.tag_bind("wz", "", lambda event: te1.config(cursor='hand2')) # 鼠标移入,鼠标样式变手式te1.tag_bind("wz", "", lambda event: te1.config(cursor='xterm')) # 鼠标离开,鼠标样式变 Ite1.tag_bind("wz", "", lambda event: webbrowser.open('https://blog.csdn.net/MissMango0820', new=1)) # 鼠标点击打开网址
运行效果如下:

current(newindex)def interface(self):""""界面编写位置"""cb = tk.ttk.Combobox(master=self.root,height=10,width=20,state='normal',cursor='arrow',font=('', 15),value=('python', 'java', 'C', 'C++'))cb.current(3)cb.pack(padx=5, pady=10)

combobox.get()def interface(self):""""界面编写位置"""self.cb = tk.ttk.Combobox(master=self.root,height=10,width=20,state='normal',cursor='arrow',font=('', 15),value=('python', 'java', 'C', 'C++'))self.cb.current(3)self.cb.pack(padx=5, pady=10)self.varLabel = tk.StringVar()label = tk.Label(self.root, textvariable=self.varLabel, width=20, height=1, bg='lightblue', fg='red')label.pack()button = tk.Button(self.root, text='print', command=self.show)button.pack()def show(self):self.varLabel.set(self.cb.get())

combobox.set(‘’) def interface(self):""""界面编写位置"""self.cb = tk.ttk.Combobox(master=self.root,height=10,width=20,state='normal',cursor='arrow',font=('', 15),value=('python', 'java', 'C', 'C++'))self.cb.current(3)self.cb.pack(padx=5, pady=10)self.varLabel = tk.StringVar()label = tk.Label(self.root, textvariable=self.varLabel, width=20, height=1, bg='lightblue', fg='red')label.pack()button = tk.Button(self.root, text='print', command=self.show)button.pack()buttonclear = tk.Button(self.root, text='clear', command=self.clear)buttonclear.pack()def show(self):self.varLabel.set(self.cb.get())def clear(self):self.cb.set('')


当 Combobox 中的选项有变动时,会产生虚拟事件 <,可以使用 combobox.bind('< 将此事件绑定处理方法 event 7。
widget.bind(event, handler, add=None) 8tkinter 提供了一种强大的机制使你处理 event。对于每个控件,你可以把 python 函数绑定到 event 上。
如果 event 符合 widget 的 event 描述,给定的 handler 会被调用。
所以你在 bind 中定义的 handler 函数被作为 event 对象调用。这个对象包括这个 widge 从哪种 event 生成,event 的种类及更多。
关于这个对象你当然不用做任何事,但是你的函数必须以下面的形式出现 9’ 10:
def save(self, event):
def interface(self):""""界面编写位置"""self.cb = tk.ttk.Combobox(master=self.root,height=10,width=20,state='normal',cursor='arrow',font=('', 15),value=('akp','C','C++','Java','Python','Perl','PHP','ASP','JS','HTML','Ruby','Machine Learning'),postcommand=self.print)self.cb.current(3)self.cb.pack(padx=5, pady=10)self.cb.bind('<>', self.show)self.varLabel = tk.StringVar()label = tk.Label(self.root, textvariable=self.varLabel, width=20, height=1, bg='lightblue', fg='red')label.pack()def print(self):self.varLabel.set(self.cb.get())def show(self, event):self.varLabel.set(str(self.cb.current()) + self.cb.get())



参考这里 8’ 11
handlerdef interface(self):""""界面编写位置"""self.t = tk.StringVar()self.values = ('akp','C','C++','Java','Python','Perl','PHP','ASP','JS','HTML','Ruby','Machine Learning')self.cb = tk.ttk.Combobox(master=self.root,height=10,width=20,state='readonly',cursor='arrow',font=('', 15),textvariable=self.t,values=self.values,)self.cb.current(3)self.cb.pack(padx=5, pady=10)self.cb.bind('<>', self.print)self.cb.bind('<>', self.show, add='+')self.varLabel = tk.StringVar()label = tk.Label(self.root, textvariable=self.varLabel, width=20, height=1, bg='lightblue', fg='red')label.pack()self.varLabeladd = tk.StringVar()labeladd = tk.Label(self.root, textvariable=self.varLabeladd, width=20, height=1, bg='lightgreen', fg='blue')labeladd.pack()def show(self, event):self.varLabel.set(self.cb.get())def print(self, event):self.varLabeladd.set(self.cb.get())

handlerdef interface(self):""""界面编写位置"""self.values = ['mustang', 'focus', 'tesla']self.cb = tk.ttk.Combobox(master=self.root,height=10,width=20,state='normal',cursor='plus',font=('', 15),values=self.values)self.cb.pack(padx=5, pady=10)self.cb.bind('<>', self.handler)self.label = tk.Label(self.root, width=20, height=1, bg='lightblue', fg='red')self.label.pack()def handler(self, event):current = self.cb.current()value = self.values[current]func_map = {"mustang": self.method_mustang,"focus": self.method_focus,"tesla": self.method_tesla}func = func_map.get(value)# type, func()# type, def method_mustang(self):self.label.configure(text="mustang selected")def method_focus(self):self.label.configure(text="focus selected")def method_tesla(self):self.label.configure(text="tesla selected")

需要在 postcommand 属性下定义下拉列表弹出前的回调函数,用于动态改变下拉列表内容 12。
可能也可以利用 bind 事件来改变下拉列表内容 13。
combobox 的 state设置为 readonly 时,点击 combobox 输入框处会自动弹出下拉列表。
但设置为 readonly 时,combobox 无法输入,所以可以绑定鼠标左键单击事件,左键单击恢复 combobox 的 state 属性为 normal ,这样有可以恢复输入了。
匹配触发动作可以根据自己的需求改,比如按方向键下或鼠标左键双击,触发匹配动作 14。
def interface(self):""""界面编写位置"""self.t = tk.StringVar()self.values = ('akp','C','C++','Java','Python','Perl','PHP','ASP','JS','HTML','Ruby','Machine Learning')self.cb = tk.ttk.Combobox(master=self.root,height=10,width=20,state='normal',cursor='arrow',font=('', 15),textvariable=self.t,values=self.values,postcommand=self.auto_match)self.cb.current(3)self.cb.pack(padx=5, pady=10)self.cb.bind('<>', self.show)self.varLabel = tk.StringVar()label = tk.Label(self.root, textvariable=self.varLabel, width=20, height=1, bg='lightblue', fg='red')label.pack()def show(self, event):self.varLabel.set(self.cb.get())def auto_match(self):self.cb['values'] = [i for i in self.values if self.cb.get() in i]



参考这里 15’ 16
def interface(self):""""界面编写位置"""self.t = tk.StringVar()self.category = {'home': ['utilities', 'rent', 'cable'],'car': ['gas', 'oil', 'repairs'],'rv': ['parks', 'maintenance', 'payment']}self.cb1 = tk.ttk.Combobox(master=self.root,height=10,width=18,state='readonly',cursor='arrow',font=('', 15),textvariable=self.t,values=list(self.category.keys()))self.cb1.current(1)self.cb1.pack(padx=5, pady=10)self.cb1.bind('<>', self.update)self.cb2 = tk.ttk.Combobox(master=self.root,height=10,width=20,state='readonly')self.cb2.pack(padx=5, pady=10)def update(self, event):self.cb2['values'] = self.category[self.cb1.get()]


variable.get()get 方法获取复选框的状态。def interface(self):""""界面编写位置"""self.varChkBtn = tk.IntVar()self.chkbtn = tk.Checkbutton(self.root, text="点我啊", variable=self.varChkBtn, command=self.show).pack()self.varLabel = tk.StringVar()label = tk.Label(self.root, textvariable=self.varLabel, width=20, height=1, bg='lightblue', fg='red')label.pack()def show(self):self.varLabel.set(str(self.varChkBtn.get()))



def interface(self):""""界面编写位置"""self.Label0 = tk.Label(self.root, text="文本显示")self.Label0.grid(row=0, column=0)self.Entry0 = tk.Entry(self.root)self.Entry0.grid(row=1, column=0)self.w1 = tk.Text(self.root, width=20, height=2)self.w1.grid(row=2, column=0)self.Button0 = tk.Button(self.root, text="确定", command=self.event)self.Button0.grid(row=3, column=0)def event(self):'''按钮事件,清除Label、Entry、Text组件'''a = [self.Label0, self.Entry0, self.w1]for i in a:i.grid_forget()



def interface(self):""""界面编写位置"""self.v1 = tk.IntVar()self.Checkbutton01 = tk.Checkbutton(self.root, text="复选框", command=self.Check_box, variable=self.v1)self.Checkbutton01.grid(row=0, column=0)self.w1 = tk.Text(self.root, width=20, height=2)self.w1.grid(row=1, column=0)self.Button0 = tk.Button(self.root, text="清除", command=self.event)self.Button0.grid(row=2, column=0)def event(self):'''按钮事件,清除复选框勾选状态'''self.Checkbutton01.deselect()def Check_box(self):'''复选框事件'''if self.v1.get() == 1:self.w1.insert(1.0, "勾选" + '\n')else:self.w1.insert(1.0, "未勾选" + '\n')



def interface(self):""""界面编写位置"""self.w1 = tk.Text(self.root, width=20, height=2)self.w1.grid(row=0, column=0)self.Button0 = tk.Button(self.root, text="确定", command=self.event)self.Button0.grid(row=1, column=0)def event(self):'''按钮事件,获取文本框内容'''a = self.w1.get('0.0', 'end')print(a)

对于如何制作1个 Tkinter 输入框并关闭它,可参考此处 [^Tkinter输入框内容获取及关闭]。
def interface(self):""""界面编写位置"""self.value = tk.StringVar()self.value.set('2') # 默认值values = ['1', '2', '3', '4']self.combobox = ttk.Combobox(master=self.root, # 父容器height=10, # 高度,下拉显示的条目数量width=20, # 宽度state='', # 设置状态 normal(可选可输入)、readonly(只可选)、 disabled(禁止输入选择)cursor='arrow', # 鼠标移动时样式 arrow, circle, cross, plus...font=('', 15), # 字体textvariable=self.value, # 通过StringVar设置可改变的值values=values, # 设置下拉框的选项)self.combobox.bind("<>", self.pick) # 绑定事件,下拉列表框被选中时,绑定pick()函数self.combobox.grid(padx=20)def pick(self, *args): # 处理事件,*args表示可变参数print('选中的数据:{} \n value的值:{}'.format(self.combobox.get(), self.value.get()))

对于下拉框绑定事件的实例,可参考此处 [^下拉选择框内容获取及关闭]’ [^下拉选择框内容获取]’ [^下拉选择框内容获取1]。
对于多级下拉框绑定事件的实例(比如说下订单时选定特定省份后选择相应的城市),可参考此处 [^多级下拉选择框1]。
参考这里 17
from tkinter import *
root = Tk()cv = Canvas(root, bg='white')
# 创建一个Canvas对象,设置其背景色为白色;rt1 = cv.create_rectangle(100, 100, 50, 50,tags=('r1', 'r2', 'r3'),outline='blue',width=5)cv.create_rectangle(100, 100, 50, 50,tags=('r1', 'r2', 'r3'),outline='red',width=5)
# 创建两个同样的rectangle,比较移动前后的不同cv.move(rt1, 30, -20)
# move可以指定x, y在相对偏移量,可以为负值,移动rt1cv.pack()root.mainloop()

import tkinter as tk
from tkinter import Canvas
import timeroot = tk.Tk()
width, height = 300, 200
root.geometry(f'{width}x{height}+500+300')
canvas = Canvas(root, width=width,height=height)
canvas.pack()rt = canvas.create_rectangle(50, 50, 20, 20,tags=('r1', 'r2', 'r3'))for x in range(0, 100):canvas.move(rt, 5, 0)root.update()time.sleep(0.05)root.mainloop()
使用以下2种方法来删除 item。
canvas.delete(id)canvas.delete(tag)import tkinter as tk
from tkinter import Canvas
import timeroot = tk.Tk()
width, height = 300, 200
root.geometry(f'{width}x{height}+500+300')
canvas = Canvas(root, width=width,height=height, bg='white')
canvas.pack()# 创建两个rectangle
rt1 = canvas.create_rectangle(100, 100, 50, 50,tags=('r1', 'r2', 'r3'),outline='grey',width=5)
r2 = canvas.create_rectangle(110, 110, 50, 50,tags=('s1', 's2', 's3'),outline='orange',width=5)canvas.delete(rt1)
# 使用id删除rt1canvas.delete('s1')
# 使用tag删除r2root.mainloop()



import tkinter as tk
from tkinter import Canvas
import timeroot = tk.Tk()
width, height = 300, 200
root.geometry(f'{width}x{height}+500+300')
canvas = Canvas(root, width=width,height=height, bg='white')
canvas.pack()rt1 = canvas.create_rectangle(50, 50, 20, 20,tags=('r1', 'r2', 'r3'),outline='green',width=5)canvas.scale(rt1, 0, 0, 1, 2)
# 将y坐标放大为原来的2位,x坐标值不变root.mainloop()


import tkinter as tk
from tkinter import Canvas
import timeroot = tk.Tk()
width, height = 300, 200
root.geometry(f'{width}x{height}+500+300')
canvas = Canvas(root, width=width,height=height, bg='white')
canvas.pack()rt1 = canvas.create_rectangle(10, 10, 110, 110,tags=('r1', 'r2', 'r3'),outline='purple',width=5)def printRect(event):print('rectangle')canvas.tag_bind('r1', '', printRect)
# 绑定item与事件, 只有点击到矩形的边框时才会触发事件。root.mainloop()

import tkinter as tk
from tkinter import Canvas
import timeroot = tk.Tk()
width, height = 300, 200
root.geometry(f'{width}x{height}+500+300')
canvas = Canvas(root, width=width,height=height, bg='white')
canvas.pack()rt1 = canvas.create_rectangle(10, 10, 110, 110,tags=('r1', 'r2', 'r3'),outline='purple',width=5)def printRect(event):print('rectangle')def printLine(event):print('line')canvas.tag_bind(tagOrId='r1', sequence='', func=printRect)
# 绑定item与左键事件
canvas.tag_bind(tagOrId='r1', sequence='', func=printLine)
# 绑定item与右键事件
#
# 只有点击到矩形的边框时才会触发事件,不使用add参数,默认就是向这个item添加一个处理函数,它不会替换原来的事件函数root.mainloop()

import tkinter as tk
from tkinter import Canvas, PIESLICE, CHORD, ARCroot = tk.Tk()
width, height = 300, 200
root.geometry(f'{width}x{height}+500+300')
canvas = Canvas(root, width=width,height=height, bg='white')
canvas.pack()canvas.create_arc((10, 10, 110, 110), )
# 使用默认参数创建一个ARC,结果为90度的扇形d = {1: PIESLICE, 2: CHORD, 3: ARC}
for i in d:canvas.create_arc((10, 10 + 60 * i, 110, 110 + 60 * i), style=d[i])print(i, d[i])root.mainloop()

import tkinter as tk
from tkinter import Canvas, PIESLICE, CHORD, ARCroot = tk.Tk()
width, height = 300, 200
root.geometry(f'{width}x{height}+500+300')
canvas = Canvas(root, width=width,height=height, bg='white')
canvas.pack()canvas.create_arc((10, 10, 110, 110), )
# 使用默认参数创建一个ARC,结果为90度的扇形d = {1: PIESLICE, 2: CHORD, 3: ARC}
for i in d:canvas.create_arc((10, 10 + 60 * i, 110, 110 + 60 * i),style=d[i],
# 指定样式start=30,
# 指定起始角度extent=30)
# 指定角度偏移量print(i, d[i])root.mainloop()

%todo:
Tkinter 学习笔记:如何用get()方法获取 Text() 和 Entry()文本框的内容 ↩︎ ↩︎
Python之tkinter 文本框Entry的基本应用 ↩︎ ↩︎ ↩︎ ↩︎
给Entry控件设置默认值 ↩︎
强大的tkinter的多行文本框组件Text ↩︎ ↩︎
python:TKinter获取Text文本框的输入内容(python图形化界面) ↩︎
python - 如何清除 ttk.Combobox 的文本字段部分? - Cache One ↩︎
Python之tkinter 组合框 Combobox ↩︎
Tkinter Event Binding ↩︎ ↩︎
tkinter TypeError: function takes 1 positional argument but 2 were given() ↩︎
Use one function for the “ComboboxSelected”, to read multiple combobox ↩︎
How to make a combobox that binds different methods in python ↩︎
Python GUI开发之Tkinter基础篇14:Combobox组件 ↩︎
How to make a ttk.Combobox callback ↩︎
Combobox实现自动匹配输入 ↩︎
How do you populate a Combobox based on the selection of another Combobox? ↩︎
利用python ttk combobox控件制作省、市二级联动菜单 ↩︎
Tkinter教程之Canvas(2)篇 ↩︎