Python Tkinter学习笔记

时间:2019-12-05
本文章向大家介绍Python Tkinter学习笔记,主要包括Python Tkinter学习笔记使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

介绍

入门实例

显示一个窗口,窗口里面有一个标签,显示文字

import tkinter as tk
# 一个顶层窗口的实例(Top Level),也称为根窗口
app = tk.Tk()
# 设置窗口的标题
app.title("Hello World")
# 创建一个标签,指定父级,以及文字
theLabel = tk.Label(app, text="这是一个标签")
# 放置组件并自动调整组件自身的尺寸和位置
theLabel.pack()
# 窗口的主事件循环
app.mainloop()

点击按钮触发事件

import tkinter as tk

class APP:
    def __init__(self, master):
        frame = tk.Frame(master)
        frame.pack(side=tk.LEFT, padx=10, pady=10)

        self.hi_there = tk.Button(
                                frame,
                                text="打招呼",
                                bg="black",
                                fg="white",
                                command=self.say_hi)
        self.hi_there.pack()
    
    def say_hi(self):
        print("我被点啦")

root = tk.Tk()
app = APP(root)
root.mainloop()

常用组件

Label 标签

功能

Label(标签)组件用于在屏幕上显示文本或图像。Label 组件仅能显示单一字体的文本,但文本可以跨越多行。另外,还可以为其中的个别字符加上下划线(例如用于表示键盘快捷键)。

Label 组件用于显示文本和图像,并且使用双缓冲,这样你就可以随时更新内容,没有恼人的闪烁。
如果希望显示的数据用户可以进行操作,使用 Canvas 组件或许更为合适。

用法

使用 Label 组件,你可以指定想要显示的内容(可以是文本、位图或者图片):

from tkinter import *

master = Tk()

w = Label(master, text="Hello FishC!")
w.pack()

mainloop()

如果你没有指定 Label 的大小,那么 Label 的尺寸是正好可以容纳其内容而已

当然你可以通过 height 和 width 选项来明确设置 Label 的大小:如果你显示的是文本,那么这两个选项是以文本单元为单位定义 Label 的大小;如果你显示的是位图或者图像,那么它们以像素为单位(或者其他屏幕单元)定义 Label 大小。

你可以通过 foreground(或 fg)和 background(或 bg)选项来设置 Label 的前景色和背景色。你也可以选择 Label 中的文本用哪种字体来显示。指定颜色和字体时需谨慎,除非你有一个很好的理由,否则建议使用默认值(主要是考虑到不同平台的兼容性)。

w = Label(master, text="我爱编程", font="华康少女字体, 16", fg="green")

注:你还可以使用 #RRGGBB 的格式指定具体的颜色值,例如 "#%02x%02x%02x" % (123, 188, 233)

Label 可以显示多行文本,你可以直接使用换行符或使用 wraplength 选项来实现。当文本换行的时候,你可以使用 anchor 和 justify 选项来使得文本如你所希望的显示出来:

longtext = """
Label 可以显示多行文本,你可以直接使用换行符
或使用 wraplength 选项来实现。当文本换行的时
候,你可以使用 anchor 和 justify 选项来使得
文本如你所希望的显示出来。
"""
w = Label(master, text=longtext, anchor=W, justify=LEFT)
w.pack()

Label 可以显示 Tkinter 变量的内容。言下之意就是当变量的内容发生改变时,Label 中显示的内容也会自动更新:

v = StringVar()
w = Label(master, textvariable=v).pack()
v.set("~新的文本~")

你可以使用 Label 显示 PhotoImage 和 BitmapImage 对象。当你这么做的时候,请务必保留一份图片对象的引用,以防止被 Python 的垃圾回收机制回收。你可以使用一个全局变量,或一个实例的属性,或者再简单点,在实例上添加一个属性即可:

photo = PhotoImage(file="xxx.gif")
w = Label(master, image=photo)
w.pack()

参数说明

Label(master=None, options)(class)
master -- 父组件
options -- 组件选项,下方表格详细列举了各个选项的具体含义和用法:

选项 含义
activebackground 1. 设置当 Label 处于活动状态(通过 state 选项设置状态)的背景色
2. 默认值由系统指定
activeforeground 1. 设置当 Label 处于活动状态(通过 state 选项设置状态)的前景色
2. 默认值由系统指定
anchor 1. 控制文本(或图像)在 Label 中显示的位置
2. N, NE, E, SE, S, SW, W, NW, 或 CENTER 来定位(EWSN 代表东西南北,上北下南左西右东)
3. 默认值是 CENTER
background 1. 设置背景颜色
2. 默认值由系统指定
bg 跟 background 一样
bitmap 1. 指定显示到 Label 上的位图
2. 如果指定了 image 选项,则该选项被忽略
borderwidth 1. 指定 Label 的边框宽度
2. 默认值由系统指定,通常是 1 或 2 像素
bd 跟 borderwidth 一样
compound 1. 控制 Label 中文本和图像的混合模式
2. 默认情况下,如果有指定位图或图片,则不显示文本
3. 如果该选项设置为 CENTER,文本显示在图像上(文本重叠图像)
4. 如果该选项设置为 BOTTOM,LEFT,RIGHT 或 TOP,那么图像显示在文本的旁边(如 BOTTOM,则图像在文本的下方)
5. 默认值是 NONE
cursor 1. 指定当鼠标在 Label 上飘过的时候的鼠标样式
2. 默认值由系统指定
disabledforeground 1. 指定当 Label 不可用的时候前景色的颜色
2. 默认值由系统指定
font 1. 指定 Label 中文本的字体
2. 一个 Label 只能设置一种字体
3. 默认值由系统指定
foreground 1. 设置 Label 的文本和位图的颜色
2. 默认值由系统指定
fg 跟 foreground 一样
height 1. 设置 Label 的高度
2. 如果 Label 显示的是文本,那么单位是文本单元
3. 如果 Label 显示的是图像,那么单位是像素(或屏幕单元)
4. 如果设置为 0 或者干脆不设置,那么会自动根据 Label 的内容计算出高度
highlightbackground 1. 指定当 Label 没有获得焦点的时候高亮边框的颜色
2. 默认值由系统指定,通常是标准背景颜色
highlightcolor 1. 指定当 Label 获得焦点的时候高亮边框的颜色
2. 默认值由系统指定
highlightthickness 1. 指定高亮边框的宽度
2. 默认值是 0(不带高亮边框)
image 1. 指定 Label 显示的图片
2. 该值应该是 PhotoImage,BitmapImage,或者能兼容的对象
3. 该选项优先于 text 和 bitmap 选项
justify 1. 定义如何对齐多行文本
2. 使用 LEFT,RIGHT 或 CENTER
3. 注意,文本的位置取决于 anchor 选项
4. 默认值是 CENTER
padx 1. 指定 Label 水平方向上的额外间距(内容和边框间)
2. 单位是像素
pady 1. 指定 Label 垂直方向上的额外间距(内容和边框间)
2. 单位是像素
relief 1. 指定边框样式
2. 默认值是 FLAT
3. 另外你还可以设置 SUNKEN,RAISED,GROOVE 或 RIDGE
state 1. 指定 Label 的状态
2. 这个标签控制 Label 如何显示
3. 默认值是 NORMAL
4. 另外你还可以设置 ACTIVE 或 DISABLED
takefocus 1. 如果是 True,该 Label 接受输入焦点
2. 默认值是 False
text 1. 指定 Label 显示的文本
2. 文本可以包含换行符
3. 如果设置了 bitmap 或 image 选项,该选项则被忽略
textvariable 1. Label 显示 Tkinter 变量(通常是一个 StringVar 变量)的内容
2. 如果变量被修改,Label 的文本会自动更新
underline 1. 跟 text 选项一起使用,用于指定哪一个字符画下划线(例如用于表示键盘快捷键)  
2. 默认值是 -1
3. 例如设置为 1,则说明在 Button 的第 2 个字符处画下划线
width 1. 设置 Label 的宽度
2. 如果 Label 显示的是文本,那么单位是文本单元
3. 如果 Label 显示的是图像,那么单位是像素(或屏幕单元)
4. 如果设置为 0 或者干脆不设置,那么会自动根据 Label 的内容计算出宽度
wraplength 1. 决定 Label 的文本应该被分成多少行
2. 该选项指定每行的长度,单位是屏幕单元
3. 默认值是 0





Button 按钮

功能

Button(按钮)组件用于实现各种各样的按钮。Button 组件可以包含文本或图像,你可以将一个 Python 的函数或方法与之相关联,当按钮被按下时,对应的函数或方法将被自动执行。

Button 组件仅能显示单一字体的文本,但文本可以跨越多行。另外,还可以为其中的个别字符加上下划线(例如用于表示键盘快捷键)。默认情况下,tab 按键被用于在按钮间切换。

简而言之,Button 组件是用于让用户说:“干!”,通过按钮上的文字或图标让用户清楚按下去是干什么用的。Button 组件常常被用于工具栏、应用程序窗口、和表示接受或拒绝的对话框。

Checkbutton 和 Radiobutton 组件更适合做数据输入按钮使用。

用法

普通的按钮是非常简单易用的。你所需要做的就是指定 Button 的内容(文本、位图或者图片),并且关联当按钮被按下时应该调用的函数或方法:

from tkinter import *

master = Tk()

def callback():
    print("我被调用了!")

b = Button(master, text="干", command=callback)
b.pack()

mainloop()

如果一个按钮没有相关联的函数或方法,那么它就形同虚设。你可能在开发程序的过程中会使用到这样的按钮,在这种情况下,更好的方法是禁用这些按钮,从而避免导致你的测试用户产生疑惑。

b = Button(master, text="Help", state=DISABLED)

如果你没有指定 Label 的大小,那么 Label 的尺寸是正好可以容纳其内容而已。你可以使用 padx 和 pady 选项在 Button 的内容和边框间添加额外的间距。

当然你可以通过 height 和 width 选项来明确设置 Button 的大小:如果你显示的是文本,那么这两个选项是以文本单元为单位定义 Button 的大小;如果你显示的是位图或者图像,那么它们以像素为单位(或者其他屏幕单元)定义 Button 大小。

对于内容为文本的 Button 组件,你可以使用像素为单位指定 Buttton 的尺寸,不过这需要一些技巧。这里提供一个方法给大家参考(还有其它方法实现):

f = Frame(master, height=64, width=64)
f.pack_propagate(0)
f.pack()

b = Button(f, text="确定", command=callback)
b.pack(fill=BOTH, expand=1)

Button 可以显示多行文本,你可以直接使用换行符或使用 wraplength 选项来实现。当文本换行的时候,你可以使用 anchor 和 justify 以及 padx 选项来使得文本如你所希望的显示出来:

b = Button(master, text=longtext, anchor=W, justify=LEFT, padx=2)

为了使一个普通的按钮保持被“按下”的状态,例如你希望通过某种方式实现一个工具箱(像 Photoshop 左侧的工具栏按钮,按下的时候他保持凹下去,说明你正在使用此工具),你可以简单的将 relief 选项的默认值 RAISED 改为 SUNKEN:

b.config(relief=SUNKEN)

你或许也希望修改背景色。不过更好的方法是使用 Checkbutton 或 Radiobutton 组件,并把它们的 indicatoron 选项设置为 False:

b = Checkbutton(master, image=bold, variable=var, indicatoron=0)

在早期版本的 Tkinter 中,image 选项会覆盖 text 选项。也就是说如果你同时指定了两个选项,那么只有 image 选项会被显示。但在新的 Tkinter 中,你可以使用 compound 选项设置二者的混合模式。例如下边就是通过设置 compound=CENTER 使得文字位于图片的上方(重叠显示):

b = Button(master, text="点我", image=photo, compound=CENTER)

通过 LEFT,RIGHT,TOP 和 BOTTOM 则可以设置文字在图像的旁边显示:

b = Button(master, text="点它 -> ", image=photo, compound=RIGHT)

参数说明

Button(master=None, options)(class)
master -- 父组件
options -- 组件选项,下方表格详细列举了各个选项的具体含义和用法:

















































































































































选项

含义
activebackground 1. 设置当 Button 处于活动状态(通过 state 选项设置状态)的背景色

2. 默认值由系统指定
activeforeground 1. 设置当 Button 处于活动状态(通过 state 选项设置状态)的前景色

2. 默认值由系统指定
anchor 1. 控制文本(或图像)在 Button 中显示的位置

2. N, NE, E, SE, S, SW, W, NW, 或 CENTER 来定位(EWSN代表东西南北,上北下南左西右东)

3. 默认值是 CENTER
background 1. 设置背景颜色

2. 默认值由系统指定
bg 跟 background 一样
bitmap 1. 指定显示到 Button 上的位图

2. 如果指定了 image 选项,则该选项被忽略
borderwidth 1. 指定 Button 的边框宽度

2. 默认值由系统指定,通常是 1 或 2 像素
bd 跟 borderwidth 一样
compound 1. 控制 Button 中文本和图像的混合模式

2. 默认情况下,如果有指定位图或图片,则不显示文本

3. 如果该选项设置为 CENTER,文本显示在图像上(文本重叠图像)

4. 如果该选项设置为 BOTTOM,LEFT,RIGHT 或 TOP,那么图像显示在文本的旁边(如 BOTTOM,则图像在文本的下方)

5. 默认值是 NONE
cursor 1. 指定当鼠标在 Button 上飘过的时候的鼠标样式

2. 默认值由系统指定
default 1. 如果设置该选项(NORMAL),该按钮会被绘制成默认按钮

2. Tkinter 会根据平台的具体指标来绘制(通常就是绘制一个额外的边框)

2. 默认值是 DISABLE
disabledforeground 1. 指定当 Button 不可用的时候前景色的颜色

2. 默认值由系统指定
font 1. 指定 Button 中文本的字体

2. 一个 Button 只能设置一种字体

3. 默认值由系统指定
foreground 1. 设置 Button 的文本和位图的颜色

2. 默认值由系统指定
fg 跟 foreground 一样
height 1. 设置 Button 的高度

2. 如果 Button 显示的是文本,那么单位是文本单元

3. 如果 Button 显示的是图像,那么单位是像素(或屏幕单元)

4. 如果设置为 0 或者干脆不设置,那么会自动根据 Button 的内容计算出高度
highlightbackground 1. 指定当 Button 没有获得焦点的时候高亮边框的颜色

2. 默认值由系统指定
highlightcolor 1. 指定当 Button 获得焦点的时候高亮边框的颜色

2. 默认值由系统指定
highlightthickness 1. 指定高亮边框的宽度

2. 默认值是 0(不带高亮边框)
image 1. 指定 Button 显示的图片

2. 该值应该是 PhotoImage,BitmapImage,或者能兼容的对象

3. 该选项优先于 text 和 bitmap 选项
justify 1. 定义如何对齐多行文本

2. 使用 LEFT,RIGHT 或 CENTER

3. 注意,文本的位置取决于 anchor 选项

4. 默认值是 CENTER
overrelief 1. 定义当鼠标飘过时 Button 的样式

2. 如果不设置,那么总是使用 relief 选项指定的样式


padx 指定 Button 水平方向上的额外间距(内容和边框间)


pady 指定 Button 垂直方向上的额外间距(内容和边框间)


relief 1. 指定边框样式

2. 通常当按钮被按下时是 SUNKEN,其他时候是 RAISED

3. 另外你还可以设置 GROOVE、RIDGE 或 FLAT

4. 默认值是 RAISED
repeatdelay 见下方 repeatinterval 选项的描述
repeatinterval 1. 通常当用户鼠标按下按钮并释放的时候系统认为是一次点击动作。如果你希望当用户持续按下按钮的时候(没有松开),根据一定的间隔多次触发按钮,那么你可以设置这个选项。

2. 当用户持续按下按钮的时候,经过 repeatdelay 时间后,每 repeatinterval 间隔就触发一次按钮事件。

3. 例如设置 repeatdelay=1000,repeatinterval=300,则当用户持续按下按钮,在 1 秒的延迟后开始每 300
毫秒触发一次按钮事件,直到用户释放鼠标。
state 1. 指定 Button 的状态

2. 默认值是 NORMAL

3. 另外你还可以设置 ACTIVE 或 DISABLED
takefocus 1. 指定使用 Tab 键可以将焦点移到该 Button 组件上(这样按下空格键也相当于触发按钮事件)

2. 默认是开启的,可以将该选项设置为 False 避免焦点在此 Button 上


text 1. 指定 Button 显示的文本

2. 文本可以包含换行符

3. 如果设置了 bitmap 或 image 选项,该选项则被忽略
textvariable 1. Button 显示 Tkinter 变量(通常是一个 StringVar 变量)的内容

2. 如果变量被修改,Button 的文本会自动更新
underline 1. 跟 text 选项一起使用,用于指定哪一个字符画下划线(例如用于表示键盘快捷键)
 

2. 默认值是 -1

3. 例如设置为 1,则说明在 Button 的第 2 个字符处画下划线
width 1. 设置 Button 的宽度

2. 如果 Button 显示的是文本,那么单位是文本单元

3. 如果 Button 显示的是图像,那么单位是像素(或屏幕单元)

4. 如果设置为 0 或者干脆不设置,那么会自动根据 Button 的内容计算出宽度
wraplength 1. 决定 Button 的文本应该被分成多少行

2. 该选项指定每行的长度,单位是屏幕单元

3. 默认值是 0







方法






flash()
 



-- 刷新 Button 组件,该方法将重绘 Button 组件若干次(在 ACTIVE 和 NORMAL 状态间切换)。




invoke()
 



-- 调用 Button 中 command 选项指定的函数或方法,并返回函数的返回值。


-- 如果 Button 的状态是 DISABLED(不可用)或没有指定 command 选项,则该方法无效。


Checkbutton 多选按钮

功能

Checkbutton(多选按钮)组件用于实现确定是否选择的按钮。Checkbutton 组件可以包含文本或图像,你可以将一个 Python 的函数或方法与之相关联,当按钮被按下时,对应的函数或方法将被自动执行。

Checkbutton 组件仅能显示单一字体的文本,但文本可以跨越多行。另外,还可以为其中的个别字符加上下划线(例如用于表示键盘快捷键)。默认情况下,tab 按键被用于在按钮间切换。

Checkbutton 组件被用于作为二选一的按钮(通常为选择“开”或“关”的状态),当你希望表达“多选多”选项的时候,可以将一系列 Checkbutton 组合起来使用。

但是处理“多选一”的问题,还是交给 Radiobutton 或 Listbox 组件来实现吧。

用法

类似的可以参考 Button 组件的用法

使用 Checkbutton,你必须创建一个 Tkinter 变量用于存放按钮的状态:

from Tkinter import *

master = Tk()

var = IntVar()

c = Checkbutton(master, text="我是帅锅", variable=var)
c.pack()

mainloop()

默认情况下,variable 选项设置为 1 表示选中状态,反之设置为 0。你可以使用 onvalue 和 offvalue 选项修改它们的值,例如下边代码,只要 var 被设置为“T”即选中状态,设置为“F”则相反:

var = StringVar()
var.set("T")
c = Checkbutton(master, text="你有女朋友吗?", variable=var, onvalue="T", offvalue="F")

如果你需要同时跟踪 variable 选项以及 Checkbutton 组件对象,你不妨可以试试将两者结合起来(下边在 CheckButton 组件对象中新建一个 var 变量,存放 variable 的值 v):

v = IntVar()
c = Checkbutton(master, text="加特技", variable=v)
c.var = v

如果你的 Tkinter 代码是放在类中的(在实际编程中你就应该这么干),那么将 variable 选项的值作为属性存储可能是更好的选择:

def __init__(self, master):
    self.var = IntVar()
    c = Checkbutton(master, text="DUANG~", variable=self.var, command=self.cb)
    c.pack()

def cb(self, event):
    print "variable is", self.var.get()

参数说明

Checkbutton(master=None, options)(class)
master -- 父组件
options -- 组件选项,下方表格详细列举了各个选项的具体含义和用法:





























































































































































选项

含义
activebackground 1. 设置当 Checkbutton 处于活动状态(通过 state 选项设置状态)的背景色

2. 默认值由系统指定
activeforeground 1. 设置当 Checkbutton 处于活动状态(通过 state 选项设置状态)的前景色

2. 默认值由系统指定
anchor 1. 控制文本(或图像)在 Checkbutton 中显示的位置

2. N, NE, E, SE, S, SW, W, NW, 或 CENTER 来定位(EWSN代表东西南北,上北下南左西右东)

3. 默认值是 CENTER
background 1. 设置背景颜色

2. 默认值由系统指定
bg 跟 background 一样
bitmap 1. 指定显示到 Checkbutton 上的位图

2. 如果指定了 image 选项,则该选项被忽略
borderwidth 1. 指定 Checkbutton 的边框宽度

2. 默认值由系统指定,通常是 1 或 2 像素
bd 跟 borderwidth 一样
command 1. 指定于该按钮相关联的函数或方法

2. 当按钮被按下时由 Tkinter 自动调用对应的函数或方法

3. 如果不设置此选项,那么该按钮被按下后啥事儿也不会发生
compound 1. 控制 Checkbutton 中文本和图像的混合模式

2. 默认情况下,如果有指定位图或图片,则不显示文本

3. 如果该选项设置为 CENTER,文本显示在图像上(文本重叠图像)

4. 如果该选项设置为 BOTTOM,LEFT,RIGHT 或 TOP,那么图像显示在文本的旁边(如 BOTTOM,则图像在文本的下方)

5. 默认值是 NONE
cursor 1. 指定当鼠标在 Checkbutton 上飘过的时候的鼠标样式

2. 默认值由系统指定
disabledforeground 1. 指定当 Checkbutton 不可用的时候前景色的颜色

2. 默认值由系统指定
font 1. 指定 Checkbutton 中文本的字体

2. 一个 Checkbutton 只能设置一种字体

3. 默认值由系统指定
foreground 1. 设置 Checkbutton 的文本和位图的颜色

2. 默认值由系统指定
fg 跟 foreground 一样
height 1. 设置 Checkbutton 的高度

2. 如果 Checkbutton 显示的是文本,那么单位是文本单元

3. 如果 Checkbutton 显示的是图像,那么单位是像素(或屏幕单元)

4. 如果设置为 0 或者干脆不设置,那么会自动根据 Checkbutton 的内容计算出高度
highlightbackground 1. 指定当 Checkbutton 没有获得焦点的时候高亮边框的颜色

2. 默认值由系统指定,通常是标准背景颜色
highlightcolor 1. 指定当 Checkbutton 获得焦点的时候高亮边框的颜色

2. 默认值由系统指定
highlightthickness 1. 指定高亮边框的宽度

2. 默认值是 1
image 1. 指定 Checkbutton 显示的图片

2. 该值应该是 PhotoImage,BitmapImage,或者能兼容的对象

3. 该选项优先于 text 和 bitmap 选项
indicatoron 1. 指定前边作为选择的小方块是否绘制

2. 默认是绘制的

3. 该选项会影响到按钮的样式,如果设置为 False,则点击后该按钮变成 SUNKEN(凹陷),再次点击变为 RAISED(凸起)
justify 1. 定义如何对齐多行文本

2. 使用 LEFT,RIGHT 或 CENTER

3. 注意,文本的位置取决于 anchor 选项

4. 默认值是 CENTER
offvalue 1. 默认情况下,variable 选项设置为 1 表示选中状态,反之设置为 0

2. 设置 offvalue 的值可以自定义未选中状态的值(详见上方用法举例)
onvalue 1. 默认情况下,variable 选项设置为 1 表示选中状态,反之设置为 0

2. 设置 onvalue 的值可以自定义选中状态的值(详见上方用法举例)
padx 1. 指定 Checkbutton 水平方向上的额外间距(内容和边框间)

2. 默认值是 1
pady 1. 指定 Checkbutton 垂直方向上的额外间距(内容和边框间)

2. 默认值是 1
relief 1. 指定边框样式

2. 该值通常是 FLAT,除非你设置 indicatoron 选项为 False

3. 如果 indicatoron 为 False,你还可以设置 SUNKEN,RAISED,GROOVE 或 RIDGE
selectcolor 1. 选择框的颜色(就是打勾勾的那个正方形小框框)

2. 默认值由系统指定
selectimage 1. 设置当 Checkbutton 为选中状态的时候显示的图片

2. 如果没有指定 image 选项,该选项被忽略
state 1. 指定 Checkbutton 的状态

2. 默认值是 NORMAL

3. 另外你还可以设置 ACTIVE 或 DISABLED
takefocus 1. 如果是 True,该组件接受输入焦点(用户可以通过 tab 键将焦点转移上来)

2. 默认值是 False
text 1. 指定 Checkbutton 显示的文本

2. 文本可以包含换行符

3. 如果设置了 bitmap 或 image 选项,该选项则被忽略
textvariable 1. Checkbutton 显示 Tkinter 变量(通常是一个 StringVar 变量)的内容

2. 如果变量被修改,Checkbutton 的文本会自动更新
underline 1. 跟 text 选项一起使用,用于指定哪一个字符画下划线(例如用于表示键盘快捷键)
 

2. 默认值是 -1

3. 例如设置为 1,则说明在 Checkbutton 的第 2 个字符处画下划线
variable 1. 将 Checkbutton 跟一个 Tkinter 变量关联

2. 当按钮按下时,该变量在 onvalue 和 offvalue 之间切换

3. 这个切换的过程是完全自动的
width 1. 设置 Checkbutton 的宽度

2. 如果 Checkbutton 显示的是文本,那么单位是文本单元

3. 如果 Checkbutton 显示的是图像,那么单位是像素(或屏幕单元)

4. 如果设置为 0 或者干脆不设置,那么会自动根据 Checkbutton 的内容计算出宽度
wraplength 1. 决定 Checkbutton 的文本应该被分成多少行

2. 该选项指定每行的长度,单位是屏幕单元

3. 默认值是 0







方法






deselect()


-- 取消 Checkbutton 组件的选中状态,也就是设置 variable 为 offvalue。




flash()


-- 刷新 Checkbutton 组件,该方法将重绘 Checkbutton 组件若干次(在 ACTIVE 和 NORMAL 状态间切换)。




invoke()


-- 调用 Checkbutton 中 command 选项指定的函数或方法,并返回函数的返回值。


-- 如果 Checkbutton 的状态是 DISABLED(不可用)或没有指定 command 选项,则该方法无效。




select()


-- 将 Checkbutton 组件设置为选中状态,也就是设置 variable 为 onvalue。




toggle()


-- 切换 Checkbutton 组件的状态(选中 -> 未选中 / 未选中 -> 选中)。


Radiobutton 单选按钮

功能

Radiobutton(单选按钮)组件用于实现多选一的问题。Radiobutton 组件可以包含文本或图像,每一个按钮都可以与一个 Python 的函数或方法与之相关联,当按钮被按下时,对应的函数或方法将被自动执行。

Radiobutton 组件仅能显示单一字体的文本,但文本可以跨越多行。另外,还可以为其中的个别字符加上下划线(例如用于表示键盘快捷键)。默认情况下,tab 按键被用于在按钮间切换。

每一组 Radiobutton 组件应该只与一个变量相关联,然后每一个按钮表示该变量的单一值。

Radiobutton 组件是用于实现多选一的问题,它几乎总是成组地被使用,其中所有成员共用相同的变量。

用法

Radiobutton 组件跟 Checkbutton 组件非常相似,为了实现其“单选”行为,确保一组中的所有按钮的 variable 选项都使用同一个变量,并使用 value 选项来指定每个按钮代表什么值:

from tkinter import *

master = Tk()

v = IntVar()
v.set(2)

Radiobutton(master, text="One", variable=v, value=1).pack(anchor=W)
Radiobutton(master, text="Two", variable=v, value=2).pack(anchor=W)
Radiobutton(master, text="Three", variable=v, value=3).pack(anchor=W)

mainloop()

如果按钮(选项)比较多,小甲鱼强烈建议您使用以下方式来初始化 Radiobutton 组件:

from tkinter import *

master = Tk()

GIRLS = [
    ("西施", 1),
    ("王昭君", 2),
    ("貂蝉", 3),
    ("杨玉环", 4)]

v = IntVar()

for girl, num in GIRLS:
    b = Radiobutton(master, text=girl, variable=v, value=num)
    b.pack(anchor=W)

mainloop()

上图是一个普通的单选按钮样式,如果将它的 indicatoron 选项设置为 False,Radiobutton 的样式就会变成普通按钮的样式了:

b = Radiobutton(master, text=girl, variable=v, value=num, indicatoron=False)
b.pack(fill=X)

参数说明

Radiobutton(master=None, options)(class)
master -- 父组件
options -- 组件选项,下方表格详细列举了各个选项的具体含义和用法:

























































































































































选项

含义
activebackground 1. 设置当 Radiobutton 处于活动状态(通过 state 选项设置状态)的背景色

2. 默认值由系统指定
activeforeground 1. 设置当 Radiobutton 处于活动状态(通过 state 选项设置状态)的前景色

2. 默认值由系统指定
anchor 1. 控制文本(或图像)在 Radiobutton 中显示的位置

2. N, NE, E, SE, S, SW, W, NW, 或 CENTER 来定位(EWSN代表东西南北,上北下南左西右东)

3. 默认值是 CENTER
background 1. 设置背景颜色

2. 默认值由系统指定
bg 跟 background 一样
bitmap 1. 指定显示到 Radiobutton 上的位图

2. 如果指定了 image 选项,则该选项被忽略
borderwidth 1. 指定 Radiobutton 的边框宽度

2. 默认值由系统指定,通常是 1 或 2 像素
bd 跟 borderwidth 一样
command 1. 指定于该按钮相关联的函数或方法

2. 当按钮被按下时由 Tkinter 自动调用对应的函数或方法

3. 如果不设置此选项,那么该按钮被按下后啥事儿也不会发生
compound 1. 控制 Radiobutton 中文本和图像的混合模式

2. 默认情况下,如果有指定位图或图片,则不显示文本

3. 如果该选项设置为 CENTER,文本显示在图像上(文本重叠图像)

4. 如果该选项设置为 BOTTOM,LEFT,RIGHT 或 TOP,那么图像显示在文本的旁边(如 BOTTOM,则图像在文本的下方)

5. 默认值是 NONE
cursor 1. 指定当鼠标在 Radiobutton 上飘过的时候的鼠标样式

2. 默认值由系统指定
disabledforeground 1. 指定当 Radiobutton 不可用的时候前景色的颜色

2. 默认值由系统指定
font 1. 指定 Radiobutton 中文本的字体

2. 一个 Radiobutton 只能设置一种字体

3. 默认值由系统指定
foreground 1. 设置 Radiobutton 的文本和位图的颜色

2. 默认值由系统指定
fg 跟 foreground 一样
height 1. 设置 Radiobutton 的高度

2. 如果 Radiobutton 显示的是文本,那么单位是文本单元

3. 如果 Radiobutton 显示的是图像,那么单位是像素(或屏幕单元)

4. 如果设置为 0 或者干脆不设置,那么会自动根据 Radiobutton 的内容计算出高度
highlightbackground 1. 指定当 Radiobutton 没有获得焦点的时候高亮边框的颜色

2. 默认值由系统指定,通常是标准背景颜色
highlightcolor 1. 指定当 Radiobutton 获得焦点的时候高亮边框的颜色

2. 默认值由系统指定
highlightthickness 1. 指定高亮边框的宽度

2. 默认值由系统指定,通常是 1 或 2 像素
image 1. 指定 Radiobutton 显示的图片

2. 该值应该是 PhotoImage,BitmapImage,或者能兼容的对象

3. 该选项优先于 text 和 bitmap 选项
indicatoron 1. 指定前边作为选择的小圆圈是否绘制

2. 默认是绘制的

3. 该选项会影响到按钮的样式,如果设置为 False,则点击后该按钮变成 SUNKEN(凹陷),再次点击变为 RAISED(凸起)
justify 1. 定义如何对齐多行文本

2. 使用 LEFT,RIGHT 或 CENTER

3. 注意,文本的位置取决于 anchor 选项

4. 默认值是 CENTER
padx 1. 指定 Radiobutton 水平方向上的额外间距(内容和边框间)

2. 默认值是 1
pady 1. 指定 Radiobutton 垂直方向上的额外间距(内容和边框间)

2. 默认值是 1
relief 1. 指定边框样式

2. 可以设置 SUNKEN,RAISED,GROOVE,RIDGE 或 FLAT

3. 如果 indicatoron 选项设置为 True,则默认值是 FLAT,否则为 RAISED
selectcolor 1. 选择框的颜色

2. 默认值由系统指定
selectimage 1. 设置当 Radiobutton 为选中状态的时候显示的图片

2. 如果没有指定 image 选项,该选项被忽略
state 1. 指定 Radiobutton 的状态

2. 默认值是 NORMAL

3. 另外你还可以设置 ACTIVE 或 DISABLED
takefocus 1. 如果是 True,该组件接受输入焦点(用户可以通过 tab 键将焦点转移上来)

2. 默认值是 False
text 1. 指定 Radiobutton 显示的文本

2. 文本可以包含换行符

3. 如果设置了 bitmap 或 image 选项,该选项则被忽略
textvariable 1. Radiobutton 显示 Tkinter 变量(通常是一个 StringVar 变量)的内容

2. 如果变量被修改,Radiobutton 的文本会自动更新
underline 1. 跟 text 选项一起使用,用于指定哪一个字符画下划线(例如用于表示键盘快捷键)
 

2. 默认值是 -1

3. 例如设置为 1,则说明在 Radiobutton 的第 2 个字符处画下划线
value 1. 标志该单选按钮的值

2. 在同一组中的所有按钮应该拥有各不相同的值

3. 通过将该值与 variable 选项的值对比,即可判断用户选中了哪个按钮
variable 1. 与 Radiobutton 组件关联的变量

2. 同一组中的所有按钮的 variable 选项应该都指向同一个变量

3. 通过将该变量与 value 选项的值对比,即可判断用户选中了哪个按钮
width 1. 设置 Radiobutton 的宽度

2. 如果 Radiobutton 显示的是文本,那么单位是文本单元

3. 如果 Radiobutton 显示的是图像,那么单位是像素(或屏幕单元)

4. 如果设置为 0 或者干脆不设置,那么会自动根据 Radiobutton 的内容计算出宽度
wraplength 1. 决定 Radiobutton 的文本应该被分成多少行

2. 该选项指定每行的长度,单位是屏幕单元

3. 默认值是 0







方法






deselect()


-- 取消该按钮的选中状态。




flash()


-- 刷新 Radiobutton 组件,该方法将重绘 Radiobutton 组件若干次(在 ACTIVE 和 NORMAL 状态间切换)。


-- 该方法在调试的时候很有用,也可以使用此方法提醒用户激活了该按钮。




invoke()


-- 调用 Radiobutton 中 command 选项指定的函数或方法,并返回函数的返回值。


-- 如果 Radiobutton 的状态是 DISABLED(不可用)或没有指定 command 选项,则该方法无效。




select()


-- 将 Radiobutton 组件设置为选中状态。




Listbox 列表框

功能

Listbox(列表框)组件用于显示一个选择列表。Listbox 只能包含文本项目,并且所有的项目都需要使用相同的字体和颜色。根据组件的配置,用户可以从列表中选择一个或多个选项。

Listbox 组件通常被用于显示一组文本选项,Listbox 组件跟 Checkbutton 和 Radiobutton 组件类似,不过 Listbox 是以列表的形式来提供选项的(后两个是通过按钮的形式)。

用法

当你创建一个 Listbox 组件的时候,它是空的,所以第一件要做的事就是添加一行或多行文本进去。我们使用 insert() 方法添加文本,该方法有两个参数:第一个参数是插入的索引号,第二个参数是插入的字符串。索引号通常是项目的序号(0 是列表中第一项的序号)。

不过你也可以使用一些特殊的索引号:比如 ACTIVE 表示选中的项目(如果 Listbox 允许多选,那么它表示最后一个被选中的项目);又如 END 表示 Listbox 的最后一行,所以当要插入一个项目到列表时可以使用 END:

from tkinter import *

master = Tk()

# 创建一个空列表
theLB = Listbox(master)
theLB.pack()

# 往列表里添加数据
for item in ["鸡蛋", "鸭蛋", "鹅蛋", "李狗蛋"]:
    theLB.insert(END, item)

mainloop()

使用 delete() 方法删除列表中的项目,最常用的操作是删除列表中的所有项目(更新列表时你需要做的事儿):

listbox.delete(0, END)
listbox.insert(END, newitem)

当然你也可以删除指定的项目,下边例子使用一个独立按钮来删除 ACTIVE 状态的项目:

theButton = Button(master, text="删除", command=lambda x=theLB: x.delete(ACTIVE))
theButton.pack()

Listbox 组件根据 selectmode 选项提供了四种不同的选择模式:SINGLE(单选)、BROWSE(也是单选,但拖动鼠标或通过方向键可以直接改变选项)、MULTIPLE(多选)和 EXTENDED(也是多选,但需要同时按住 Shift 键或 Ctrl 键或拖拽鼠标实现)。默认是 BROWSE。

参数说明

Listbox(master=None, options)(class)
master -- 父组件
options -- 组件选项,下方表格详细列举了各个选项的具体含义和用法:









































































































选项

含义
background 1. 设置背景颜色

2. 默认值由系统指定
bg 跟 background 一样
borderwidth 1. 指定 Listbox 的边框宽度

2. 默认值由系统指定,通常是 2 像素
bd 跟 borderwidth 一样
cursor 1. 指定当鼠标在 Listbox 上飘过的时候的鼠标样式

2. 默认值由系统指定
exportselection 1. 指定选中的项目文本是否可以被复制到剪贴板

2. 默认值是 True

3. 可以修改为 False 表示不允许复制项目文本
font 1. 指定 Listbox 中文本的字体

2. 默认值由系统指定
foreground 1. 设置 Listbox 的文本颜色

2. 默认值由系统指定
fg 跟 foreground 一样
height 1. 设置 Listbox 显示的行数(不是像素)

2. 默认值是 10
highlightbackground 1. 指定当 Listbox 没有获得焦点的时候高亮边框的颜色

2. 默认值由系统指定,通常是标准背景颜色
highlightcolor 1. 指定当 Listbox 获得焦点的时候高亮边框的颜色

2. 默认值由系统指定
highlightthickness 1. 指定高亮边框的宽度

2. 默认值是 1
listvariable 1. 指向一个 StringVar 类型的变量,该变量存放 Listbox 中所有的项目

2. 在 StringVar 类型的变量中,用空格分隔每个项目,例如 var.set("鸡蛋 鸭蛋 鹅蛋 李狗蛋")
relief 1. 指定边框样式

2. 默认值是 SUNKEN


selectbackground 1. 指定当某个项目被选中的时候背景颜色

2. 默认值由系统指定
selectborderwidth 1. 指定当某个项目被选中的时候边框的宽度

2. 默认是由 selectbackground 指定的颜色填充,没有边框

3. 如果设置了此选项,Listbox 的每一项会相应变大,被选中项为 RAISED 样式
selectforeground 1. 指定当某个项目被选中的时候文本颜色

2. 默认值由系统指定
selectmode 1. 决定选择的模式

2. 四种不同的选择模式:SINGLE(单选)、BROWSE(也是单选,但拖动鼠标或通过方向键可以直接改变选项)、MULTIPLE(多选)和
EXTENDED(也是多选,但需要同时按住 Shift 键或 Ctrl 键或拖拽鼠标实现)

3. 默认是 BROWSE
setgrid 1. 指定一个布尔类型的值,决定是否启用网格控制

2. 默认值是 False
takefocus 1. 指定该组件是否接受输入焦点(用户可以通过 tab 键将焦点转移上来)

2. 默认值是 True
width 1. 设置 Listbox 的宽度(单位是文本单元)

2. 文本单元是英文字母的平均宽度(所以如果该选项设置为 2,那么是无法容纳"ww"这两个宽度大于平均宽度的字母的)

3. 默认值是 20
xscrollcommand 1. 为 Listbox 组件添加一条水平滚动条

2. 将此选项与 Scrollbar 组件相关联即可
yscrollcommand 1. 为 Listbox 组件添加一条垂直滚动条

2. 将此选项与 Scrollbar 组件相关联即可







方法






activate(index)


-- 将给定索引号对应的选项激活(在其文本下方画一条下划线)




bbox(index)


-- 返回给定索引号对应的选项的边框


-- 返回值是一个以像素为单位的 4 元祖表示边框:(xoffset, yoffset, width, height)


-- xoffset 和 yoffset 表示距离左上角的偏移位置


-- 返回的 width 是文本的实际宽度(像素为单位)


-- 如果指向的选项是不可见的,那么返回值是 None




curselection()


-- 返回一个元组,包含被选中的选项的序号(从 0 开始)


-- 如果没有选中任何选项,返回一个空元组




delete(first, last=None)


-- 删除参数 first 到 last 范围内(包含 first 和 last)的所有选项


-- 如果忽略 last 参数,表示删除 first 参数指定的选项




get(first, last=None)


-- 返回一个元组,包含参数 first 到 last 范围内(包含 first 和 last)的所有选项的文本


-- 如果忽略 last 参数,表示返回 first 参数指定的选项的文本




index(index)


-- 返回与 index 参数相应的选项的序号(例如 lb.index(END))




insert(index, *elements)


-- 添加一个或多个项目到 Listbox 中


-- 使用 lb.insert(END) 添加新选项到末尾




itemcget(index, option)


-- 获得 index 参数指定的项目对应的选项(由 option 参数指定)




itemconfig(index, options)


-- 设置 index 参数指定的项目对应的选项(由可变参数
option 指定)




nearest(y)


-- 返回与给定参数 y 在垂直坐标上最接近的项目的序号




scan_dragto(x, y)


-- 见下方 scan_mark(x, y)




scan_mark(x, y)


-- 使用这种方式来实现 Listbox 内容的滚动


-- 需要将鼠标按钮事件及当前鼠标位置绑定到 scan_mark(x, y) 方法,然后再将 <motion> 事件及当前鼠标位置绑定到 scan_dragto(x,

y) 方法,就可以实现 Listbox 在当前位置和 sacn_mack(x, y) 指定的位置 (x, y) 之间滚动




see(index)


-- 调整列表框的位置,使得 index 参数指定的选项是可见的




select_anchor(index)


-- 与 selection_anchor(index) 相同,见下方解释




select_clear(first, last=None)


-- 与 selection_clear(first, last=None) 相同,见下方解释




select_includes(index)


-- 与 selection_includes(index) 相同,见下方解释




select_set(first, last=None)


-- 与 selection_set(first, last=None) 相同,见下方解释




selection_anchor(index)


-- 在 index 参数的位置下一个锚点,此后你就可以通过特殊索引 ANCHOR 访问




selection_clear(first, last=None)


-- 取消参数 first 到 last 范围内(包含 first 和 last)选项的选中状态


-- 如果忽略 last 参数,则只取消 first 参数指定选项的选中状态




selection_includes(index)


-- 返回 index 参数指定的选项的选中状态


-- 返回 1 表示选中,返回 0 表示未选中




selection_set(first, last=None)


-- 设置参数 first 到 last 范围内(包含 first 和 last)选项为选中状态


-- 如果忽略 last 参数,则只设置 first 参数指定选项为选中状态




size()


-- 返回 Listbox 组件中选项的数量




xview(args)


-- 该方法用于在水平方向上滚动 Listbox 组件的内容,一般通过绑定 Scollbar 组件的 command 选项来实现(具体操作参考:Scrollbar)


-- 如果第一个参数是 MOVETO,则第二个参数表示滚动到指定的位置:0.0 表示最左端,1.0 表示最右端


-- 如果第一个参数是 SCROLL,则第二个参数表示滚动的数量,第三个参数表示滚动的单位(可以是 UNITS 或 PAGES),例如:xview(SCROLL,
3, UNITS) 表示向右滚动三行





xview_moveto(fraction)


-- 跟 xview(MOVETO, fraction) 一样




xview_scroll(number, what)


-- 跟 xview(SCROLL, number, what) 一样




yview(
args)


-- 该方法用于在垂直方向上滚动 Listbox 组件的内容,一般通过绑定 Scollbar 组件的 command 选项来实现(具体操作参考:Scrollbar)


-- 如果第一个参数是 MOVETO,则第二个参数表示滚动到指定的位置:0.0 表示最顶端,1.0 表示最底端


-- 如果第一个参数是 SCROLL,则第二个参数表示滚动的数量,第三个参数表示滚动的单位(可以是 UNITS 或 PAGES),例如:yview(SCROLL,
3, PAGES) 表示向下滚动三页





yview_moveto(fraction)


-- 跟 yview(MOVETO, fraction) 一样




yview_scroll(number, what)


-- 跟 yview(SCROLL, number, what) 一样


Frame 框架

功能

Frame(框架)组件是在屏幕上的一个矩形区域。Frame 主要是作为其他组件的框架基础,或为其他组件提供间距填充。

Frame 组件主要用于在复杂的布局中将其他组件分组,也用于填充间距和作为实现高级组件的基类。

用法

Frame 组件可以用于装饰界面:

from tkinter import *

Label(text="天王盖地虎").pack()

separator = Frame(height=2, bd=1, relief=SUNKEN)
separator.pack(fill=X, padx=5, pady=5)

Label(text="小鸡炖蘑菇").pack()

mainloop()

参数说明

Frame(master=None, options)(class)
master -- 父组件
options -- 组件选项,下方表格详细列举了各个选项的具体含义和用法:

















































































选项

含义
background 1. 设置 Frame 组件的背景颜色

2. 默认值由系统指定

3. 为了防止更新,可以将颜色值设置为空字符串
bg 跟 background 一样
borderwidth 1. 指定 Frame 的边框宽度

2. 默认值是 0
bd 跟 borderwidth 一样
class_ 默认值是 Frame
colormap 1. 有些显示器只支持 256 色(有些可能更少),这种显示器通常提供一个颜色映射来指定要使用要使用的 256 种颜色

2. 该选项允许你指定用于该组件以及其子组件的颜色映射

3. 默认情况下,Frame 使用与其父组件相同的颜色映射

4. 使用此选项,你可以使用其他窗口的颜色映射代替(两窗口必须位于同个屏幕并且具有相同的视觉特性)

5. 你也可以直接使用 "new" 为 Frame 组件分配一个新的颜色映射

6. 一旦创建 Frame 组件实例,你就无法修改这个选项的值
container 1. 该选项如果为 True,意味着该窗口将被用作容器,一些其它应用程序将被嵌入
 

2. 默认值是 False
cursor 1. 指定当鼠标在 Frame 上飘过的时候的鼠标样式

2. 默认值由系统指定
height 1. 设置 Frame 的高度

2. 默认值是 0
highlightbackground 1. 指定当 Frame 没有获得焦点的时候高亮边框的颜色

2. 默认值由系统指定,通常是标准背景颜色
highlightcolor 1. 指定当 Frame 获得焦点的时候高亮边框的颜色

2. 默认值由系统指定
highlightthickness 1. 指定高亮边框的宽度

2. 默认值是 0(不带高亮边框)
padx 水平方向上的边距
pady 垂直方向上的边距
relief 1. 指定边框样式

2. 默认值是 FLAT

3. 另外你还可以设置 SUNKEN,RAISED,GROOVE 或 RIDGE

4. 注意,如果你要设置边框样式,记得设置 borderwidth 或 bd 选项不为 0,才能看到边框
takefocus 1. 指定该组件是否接受输入焦点(用户可以通过 tab 键将焦点转移上来)

2. 默认值是 False
visual 1. 为新窗口指定视觉信息

2. 该选项没有默认值
width 1. 设置 Frame 的宽度

2. 默认值是 0



LabelFrame 标签框架

功能

LabelFrame 组件是 Frame 组件的变体。默认情况下,LabelFrame 会在其子组件的周围绘制一个边框以及一个标题。

当你想要将一些相关的组件分为一组的时候,可以使用 LabelFrame 组件,比如一系列 Radiobutton(单选按钮)组件。

用法

为组件分组,需要先创建一个 LabelFrame,然后像往常一样将子组件添加进去。LabelFrame 组件会自动绘制一个边框将子组件包围起来,并在它们上方显示一个文本标题。

from tkinter import *

master = Tk()

group = LabelFrame(master, text="你从哪里得知我的?", padx=5, pady=5)
group.pack(padx=10, pady=10)

v = IntVar()
r1 = Radiobutton(group, text="同学/同事介绍", variable=v, value=1).pack(anchor=W)
r2 = Radiobutton(group, text="老婆大人介绍", variable=v, value=2).pack(anchor=W)
r3 = Radiobutton(group, text="老师/学长介绍", variable=v, value=3).pack(anchor=W)

mainloop()

你还可以通过选项定义如何绘制标签和边界,请看下边详细说明。

参数说明

LabelFrame(master=None, options)(class)
master -- 父组件
options -- 组件选项,下方表格详细列举了各个选项的具体含义和用法:









































































































选项

含义
background 1. 设置 LabelFrame 组件的背景颜色

2. 默认值由系统指定

3. 为了防止更新,可以将颜色值设置为空字符串
bg 跟 background 一样
borderwidth 1. 指定 LabelFrame 的边框宽度

2. 默认值是 2 像素
bd 跟 borderwidth 一样
class 默认值是 LabelFrame
colormap 1. 有些显示器只支持 256 色(有些可能更少),这种显示器通常提供一个颜色映射来指定要使用要使用的 256 种颜色

2. 该选项允许你指定用于该组件以及其子组件的颜色映射

3. 默认情况下,Frame 使用与其父组件相同的颜色映射

4. 使用此选项,你可以使用其他窗口的颜色映射代替(两窗口必须位于同个屏幕并且具有相同的视觉特性)

5. 你也可以直接使用 "new" 为 Frame 组件分配一个新的颜色映射

6. 一旦创建 Frame 组件实例,你就无法修改这个选项的值
container 1. 该选项如果为 True,意味着该窗口将被用作容器,一些其它应用程序将被嵌入
 

2. 默认值是 False
cursor 1. 指定当鼠标在 LabelFrame 上飘过的时候的鼠标样式

2. 默认值由系统指定
foreground 1. 设置 LabelFrame 的文本颜色

2. 默认值由系统指定
fg 跟 foreground 一样
font 1. 指定 LabelFrame 中文本的字体

2. 默认值由系统指定
height 1. 设置 LabelFrame 的高度

2. 单位是像素
highlightbackground 1. 指定当 LabelFrame 没有获得焦点的时候高亮边框的颜色

2. 默认值由系统指定,通常是标准背景颜色
highlightcolor 1. 指定当 LabelFrame 获得焦点的时候高亮边框的颜色

2. 默认值由系统指定
highlightthickness 1. 指定高亮边框的宽度

2. 默认值是 1 或 2 像素
labelanchor 1. 控制文本在 LabelFrame 的显示位置

2. N, NE, E, SE, S, SW, W, NW, 或 CENTER 来定位(EWSN代表东西南北,上北下南左西右东)

3. 默认值是 NW
labelwidget 1. 指定一个组件替代默认的文本 Label

2. 如果同时设置此选项和 text 选项,则忽略 text 选项的内容


padx 1. 指定 FrameLabel 水平方向上的额外间距(内容和边框间)

2. 默认值是 0
pady 1. 指定 FrameLabel 垂直方向上的额外间距(内容和边框间)

2. 默认值是 0
relief 1. 指定边框样式

2. 默认值是 GROOVE

3. 另外你还可以设置 FLAT,SUNKEN,RAISED 或 RIDGE

4. 注意,如果你要设置边框样式,记得设置 borderwidth 或 bd 选项不为 0,才能看到边框
takefocus 1. 指定该组件是否接受输入焦点(用户可以通过 tab 键将焦点转移上来)

2. 默认值是 False
text 1. 指定 LabelFrame 显示的文本

2. 文本可以包含换行符
visual 1. 为新窗口指定视觉信息

2. 该选项没有默认值
width 1. 设置 LabelFrame 的宽度

2. 默认值是 0



Entry 输入框

功能

Entry(输入框)组件通常用于获取用户的输入文本。

Entry 组件仅允许用于输入一行文本,如果用于输入的字符串长度比该组件可显示空间更长,那内容将被滚动。这意味着该字符串将不能被全部看到(你可以用鼠标或键盘的方向键调整文本的可见范围)。

如果你希望接收多行文本的输入,可以使用 Text 组件。

用法

使用代码为 Entry 组件添加文本,可以使用 insert() 方法。如果要替换当前文本,可以先使用 delete() 方法,再使用 insert() 方法实现:

from tkinter import *

master = Tk()

e = Entry(master)
e.pack(padx=20, pady=20)

e.delete(0, END)
e.insert(0, "默认文本...")

mainloop()

获取当前输入框的文本,可以使用 get() 方法:

s = e.get()

你也可以绑定 Entry 组件到 Tkinter 变量(StringVar),并通过该变量设置和获取输入框的文本:

v = StringVar()
e = Entry(master, textvariable=v)
e.pack()

v.set("I love FishC.com!")
s = v.get()

下边的例子演示将 Entry 组件和 Button 组件配合,点击“获取信息”按钮时自动清空输入框并将内容输出:

from tkinter import *

master = Tk()

Label(master, text="作品:").grid(row=0)
Label(master, text="作者:").grid(row=1)

e1 = Entry(master)
e2 = Entry(master)
e1.grid(row=0, column=1, padx=10, pady=5)
e2.grid(row=1, column=1, padx=10, pady=5)

def show():
    print("作品:《%s》" % e1.get())
    print("作者:%s" % e2.get())
    e1.delete(0, END)
    e2.delete(0, END)

Button(master, text="获取信息", width=10, command=show).grid(row=3, column=0, sticky=W, padx=10, pady=5)
Button(master, text="退出", width=10, command=master.quit).grid(row=3, column=1, sticky=E, padx=10, pady=5)

mainloop()

最后需要提到的是 Entry 组件允许通过以下几种方式指定字符的位置:

  • 数字索引号
  • ANCHOR
  • END
  • INSERT
  • 鼠标坐标("@x")

数字索引号:常规的 Python 索引号,从 0 开始
ANCHOR:对应第一个被选中的字符(如果有的话)
END:对应已存在文本的后一个位置
INSERT:对应插入光标的当前位置
鼠标坐标("@x"):x 是鼠标位置与 Entry 左侧边缘的水平距离,这样就可以通过鼠标相对地定位字符的位置

参数说明

Entry(master=None, options)(class)
master -- 父组件
options -- 组件选项,下方表格详细列举了各个选项的具体含义和用法:













































































































































选项

含义
background 1. 设置 Entry 的背景颜色

2. 默认值由系统指定
bg 跟 background 一样
borderwidth 1. 设置 Entry 的边框宽度

2. 默认值是 1 或 2 像素
bd 跟 borderwidth 一样
cursor 1. 指定当鼠标在 Entry 上飘过的时候的鼠标样式

2. 默认值由系统指定
exportselection 1. 指定选中的文本是否可以被复制到剪贴板

2. 默认值是 True

3. 可以修改为 False 表示不允许复制文本
font 1. 指定 Entry 中文本的字体

2. 默认值由系统指定
foreground 1. 设置 Entry 的文本颜色

2. 默认值由系统指定
fg 跟 foreground 一样
highlightbackground 1. 指定当 Entry 没有获得焦点的时候高亮边框的颜色

2. 默认值由系统指定
highlightcolor 1. 指定当 Entry 获得焦点的时候高亮边框的颜色

2. 默认值由系统指定
highlightthickness 1. 指定高亮边框的宽度

2. 默认值是 1 或 2 像素
insertbackground 指定输入光标的颜色
insertborderwidth 1. 指定输入光标的边框宽度

2. 如果被设置为非 0 值,光标样式会被设置为 RAISED

3. 小甲鱼温馨提示:将 insertwidth 设置大一点才能看到效果哦
insertofftime 1. 该选项控制光标的闪烁频率(灭)

2. 单位是毫秒
insertontime 1. 该选项控制光标的闪烁频率(亮)

2. 单位是毫秒
insertwidth 1. 指定光标的宽度

2. 默认值是 1 或 2 像素
invalidcommand 1. 指定当输入框输入的内容“非法”时调用的函数

2. 也就是指定当 validateCommand 选项指定的函数返回 False 时的函数

3. 详见本内容最下方小甲鱼关于验证详解
invcmd 跟 invalidcommand 一样
justify 1. 定义如何对齐输入框中的文本

2. 使用 LEFT,RIGHT 或 CENTER

3. 默认值是 LEFT
relief 1. 指定边框样式

2. 默认值是 SUNKEN

3. 其他可以选择的值是 FLAT,RAISED,GROOVE 和 RIDGE
selectbackground 1. 指定输入框的文本被选中时的背景颜色

2. 默认值由系统指定
selectborderwidth 1. 指定输入框的文本被选中时的边框宽度(选中边框)

2. 默认值由系统指定
selectforeground 1. 指定输入框的文本被选中时的字体颜色

2. 默认值由系统指定
show 1. 设置输入框如何显示文本的内容

2. 如果该值非空,则输入框会显示指定字符串代替真正的内容

3. 将该选项设置为 "*",则是密码输入框
state 1. Entry 组件可以设置的状态:NORMAL,DISABLED 或 "readonly"(注意,这个是字符串。它跟 DISABLED 相似,但它支持选中和拷贝,只是不能修改,而
DISABLED 是完全禁止)

2. 默认值是 NORMAL

3. 注意,如果此选项设置为 DISABLED 或 "readonly",那么调用 insert() 和 delete() 方法都会被忽略
takefocus 1. 指定使用 Tab 键可以将焦点移动到输入框中

2. 默认是开启的,可以将该选项设置为 False 避免焦点在此输入框中
textvariable 1. 指定一个与输入框的内容相关联的 Tkinter 变量(通常是 StringVar)

2. 当输入框的内容发生改变时,该变量的值也会相应发生改变
validate 1. 该选项设置是否启用内容验证
 

2. 详见本内容最下方小甲鱼关于验证详解
validatecommand 1. 该选项指定一个验证函数,用于验证输入框内容是否合法

2. 验证函数需要返回 True 或 False 表示验证结果

3. 注意,该选项只有当 validate 的值非 "none" 时才有效

3. 详见本内容最下方小甲鱼关于验证详解
vcmd 跟 validatecommand 一样
width 1. 设置输入框的宽度,以字符为单位

2. 默认值是 20

3. 对于变宽字体来说,组件的实际宽度等于字体的平均宽度乘以 width 选项的值
xscrollcommand 1. 与 scrollbar(滚动条)组件相关联

2. 如果你觉得用户输入的内容会超过该组件的输入框宽度,那么可以考虑设置该选项

3. 使用方法可以参考:Scrollbar 组件







方法






delete(first, last=None)


-- 删除参数 first 到 last 范围内(包含 first 和 last)的所有内容


-- 如果忽略 last 参数,表示删除 first 参数指定的选项


-- 使用 delete(0, END) 实现删除输入框的所有内容




get()


-- 获得当前输入框的内容




icursor(index)


-- 将光标移动到 index 参数指定的位置


-- 这同时也会设置 INSERT 的值




index(index)


-- 返回与 index 参数相应的选项的序号(例如 e.index(END))




insert(index, text)


-- 将 text 参数的内容插入到 index 参数指定的位置


-- 使用 insert(INSERT, text) 将 text 参数指定的字符串插入到光标的位置


-- 使用 insert(END, text) 将 text 参数指定的字符串插入到输入框的末尾




scan_dragto(x)


--  见下方 scan_mark(x)




scan_mark(x)


-- 使用这种方式来实现输入框内容的滚动


-- 需要将鼠标按下事件绑定到 scan_mark(x) 方法(x 是鼠标当前的水平位置),然后再将 <motion> 事件绑定到 scan_dragto(x)
方法(x 是鼠标当前的水平位置),就可以实现输入框在当前位置和 sacn_mack(x) 指定位置之间的水平滚动





select_adjust(index)


-- 与 selection_adjust(index) 相同,见下方解释




select_clear()


-- 与 selection_clear() 相同,见下方解释




select_from(index)


-- 与 selection_from(index) 相同,见下方解释




select_present()


-- 与 selection_present() 相同,见下方解释




select_range(start, end)


-- 与 selection_range(start, end) 相同,见下方解释




select_to(index)


-- 与 selection_to(index) 相同,见下方解释




selection_adjust(index)


-- 该方法是为了确保输入框中选中的范围包含 index 参数所指定的字符


-- 如果选中的范围已经包含了该字符,那么什么事情也不会发生


-- 如果选中的范围不包含该字符,那么会从光标的位置将选中的范围扩展至该字符




selection_clear()


-- 取消选中状态




selection_from(index)


-- 开始一个新的选中范围


-- 会设置 ANCHOR 的值




selection_present()


-- 返回输入框是否有处于选中状态的文本


-- 如果有则返回 True,否则返回 False




selection_range(start, end)


-- 设置选中范围


-- start 参数必须必 end 参数小


-- 使用 selection_range(0, END) 选中整个输入框的所有内容




selection_to(index)


-- 选中 ANCHOR 到 index 参数的间的所有内容




xview(index)


-- 该方法用于确保给定的 index 参数所指定的字符可见


-- 如有必要,会滚动输入框的内容




xview_moveto(fraction)


-- 根据 fraction 参数给定的比率调整输入框内容的可见范围


-- fraction 参数的范围是 0.0 ~ 1.0,0.0 表示输入框的开始位置,1.0 表示输入框的结束位置




xview_scroll(number, what)


-- 根据给定的参数水平滚动输入框的可见范围


-- number 参数指定滚动的数量,如果是负数则表示反向滚动


-- what 参数指定滚动的单位,可以是 UNITS 或 PAGES(UNITS 表示一个字符单元,PAGES 表示一页)


关于验证

Entry 组件是支持验证输入内容的合法性的,比如要求输入数字,你输入了字母那就是非法。实现该功能,需要通过设置 validate、validatecommand 和 invalidcommand 选项。

首先启用验证的“开关”是 validate 选项,该选项可以设置的值有:



































含义
'focus' 当 Entry 组件获得或失去焦点的时候验证
'focusin' 当 Entry 组件获得焦点的时候验证
'focusout' 当 Entry 组件失去焦点的时候验证
'key' 当输入框被编辑的时候验证


'all' 当出现上边任何一种情况的时候验证
'none' 1. 关闭验证功能

2. 默认设置该选项(即不启用验证)

3. 注意,是字符串的 'none',而非 None



其次是为 validatecommand 选项指定一个验证函数,该函数只能返回 True 或 False 表示验证的结果。一般情况下验证函数只需要知道输入框的内容即可,可以通过 Entry 组件的 get() 方法获得该字符串。

下边的例子中,在第一个输入框输入“小甲鱼”并通过 Tab 键将焦点转移到第二个输入框的时候,验证功能被成功触发:

from tkinter import *

master = Tk()

def test():
    if e1.get() == "wby":
        print("正确!")
        return True
    else:
        print("错误!")
        e1.delete(0, END)
        return False

v = StringVar()

e1 = Entry(master, textvariable=v, validate="focusout", validatecommand=test)
e2 = Entry(master)
e1.pack(padx=10, pady=10)
e2.pack(padx=10, pady=10)

mainloop()

然后,invalidcommand 选项指定的函数只有在 validatecommand 的返回值为 False 的时候才被调用。

下边的例子中,在第一个输入框输入“xxx”,并通过 Tab 键将焦点转移到第二个输入框,validatecommand 指定的验证函数被触发并返回 False,接着 invalidcommand 被触发:

from tkinter import *

master = Tk()

v = StringVar()

def test1():
    if v.get() == "wby":
        print("正确!")
        return True
    else:
        print("错误!")
        e1.delete(0, END)
        return False

def test2():
    print("我被调用了......")
    return True

e1 = Entry(master, textvariable=v, validate="focusout", validatecommand=test1, invalidcommand=test2)
e2 = Entry(master)
e1.pack(padx=10, pady=10)
e2.pack(padx=10, pady=10)

mainloop()

最后,其实 Tkinter 还有隐藏技能,不过需要冷却才能触发

Tkinter 为验证函数提供一些额外的选项:

额外选项 含义
'%d' 操作代码:0 表示删除操作;1 表示插入操作;2 表示获得、失去焦点或 textvariable 变量的值被修改
'%i' 1. 当用户尝试插入或删除操作的时候,该选线表示插入或删除的位置(索引号)
2. 如果是由于获得、失去焦点或 textvariable 变量的值被修改而调用验证函数,那么该值是 -1
'%P' 1. 当输入框的值允许改变的时候,该值有效
2. 该值为输入框的最新文本内容
'%s' 该值为调用验证函数前输入框的文本内容
'%S' 1. 当插入或删除操作触发验证函数的时候,该值有效
2. 该选项表示文本被插入和删除的内容
'%v' 该组件当前的 validate 选项的值
'%V' 1. 调用验证函数的原因
2. 该值是 'focusin','focusout','key' 或 'forced'(textvariable 选项指定的变量值被修改)中的一个
'%W' 该组件的名字



为了使用这些选项,你可以这样写:validatecommand=(f, s1, s2, ...)

其中,f 就是你“冷却后”的验证函数名,s1、s2、s3 这些是额外的选项,这些选项会作为参数依次传给 f 函数。我们刚刚说了,使用隐藏技能前需要冷却,其实就是调用 register() 方法将验证函数包装起来:

from tkinter import *

master = Tk()

v = StringVar()

def test(content, reason, name):
    if content == "wby":
        print("正确!")
        print(content, reason, name)
        return True
    else:
        print("错误!")
        print(content, reason, name)
        return False

testCMD = master.register(test)
e1 = Entry(master, textvariable=v, validate="focusout", validatecommand=(testCMD, '%P', '%v', '%W'))
e2 = Entry(master)
e1.pack(padx=10, pady=10)
e2.pack(padx=10, pady=10)

mainloop()

Text 文本框

功能

Text(文本)组件用于显示和处理多行文本。在 Tkinter 的所有组件中,Text 组件显得异常强大和灵活,适用于多种任务。虽然该组件的主要目的是显示多行文本,但它常常也被用于作为简单的文本编辑器和网页浏览器使用。

Text 组件用于显示文本文档,包含纯文本或格式化文本(使用不同字体,嵌入图片,显示链接,甚至是带 CSS 格式的 HTML 等)。因此,它常常也被用于作为简单的文本编辑器和网页浏览器使用。

用法

基本用法

当你创建一个 Text 组件的时候,它里边是没有内容的。为了给其插入内容,你可以使用 insert() 方法以及 INSERT 或 END 索引号:

from tkinter import *

root = Tk()

text = Text(root)
text.pack()

# INSERT 索引表示插入光标当前的位置
text.insert(INSERT, "I love ")
text.insert(END, "FishC.com!")

mainloop()

值得一提的是,Text 组件的 insert() 方法有一个可选的参数,用于指定一个或多个“标签”(标签用于设置文本的格式,请参考下方【Tags 用法】)到新插入的文本中:

from tkinter import *

root = Tk()

text = Text(root, width=20, height=5)
text.pack()

# 设置 tag
text.tag_config("tag_1", backgroun="yellow", foreground="red")

# INSERT 索引表示插入光标当前的位置
text.insert(INSERT, "I love ")
text.insert(END, "FishC.com!", "tag_1")

mainoop()

在 Text 组件中插入对象,可以使用 window_create() 和 image_create() 方法:

from tkinter import *

root = Tk()

text = Text(root, width=20, height=5)
text.pack()

text.insert(INSERT, "I love FishC.com!")

def show():
    print("哟,我被点了一下~")
    
b1 = Button(text, text="点我点我", command=show)
text.window_create(INSERT, window=b1)

mainloop()

删除 Text 组件中的内容可以用 delete() 方法,下边代码用于删除所有内容(也包含 window 和 image 对象,但不会删除 marks 的内容):

text.delete(1.0, END)

删除单独一个字符(或者一个 window 对象,或者一个 image 对象),你可以仅使用一个参数:

text.delete(b1)

将 state 选项从默认的 NORMAL 修改为 DISABLED,使得 Text 组件中的内容为“只读”形式。不过需要注意的是,当你需要进行任何修改的时候,记得将 state 选项改回 NORMAL,否则 insert() 和 delete() 方法都会失效。

获得 Text 组件的内容,可以使用 get() 方法(仅获取文本内容):

contents = text.get(1.0, END)

在下边例子中,通过校检 Text 组件中文本的 MD5 摘要来判断内容是否发生改变:

from tkinter import *
import hashlib

root = Tk()

text = Text(root, width=20, height=5)
text.pack()

text.insert(INSERT, "I love FishC.com!")
contents = text.get(1.0, END)

def getSig(contents):
    m = hashlib.md5(contents.encode())
    return m.digest()

sig = getSig(contents)

def check():
    contents = text.get(1.0, END)
    if sig != getSig(contents):
        print("警报:内容发生变动!")
    else:
        print("风平浪静~")

Button(root, text="检查", command=check).pack()

mainloop()

index() 方法用于将所有支持的“索引”格式(请参考下方【Indexes 用法】)转换为“行.列”格式的索引号:

print(text.index(INSERT))
text.insert(INSERT, "You are good!")
print(text.index(INSERT))

如果你需要跟踪一个位置,那么你可以将该位置“标记”下来(请参考下方【Marks 用法】):

text.insert(INSERT, "You are good!")
text.mark_set("here", '1.8')
text.insert("here", "very ")

最后,使用 search() 方法可以搜索 Text 组件中的内容。你可以提供一个确切的目标进行搜索(默认),也可以使用 Tcl 格式的正则表达式进行搜索(需设置 regexp 选项为 True):

from tkinter import *

root = Tk()

text = Text(root, width=30, height=5)
text.pack()

text.insert(INSERT, "I love FishC.com!")

# 将任何格式的索引号统一为元祖 (行,列) 的格式输出
def getIndex(text, index):
    return tuple(map(int, str.split(text.index(index), ".")))

start = 1.0
while True:
    pos = text.search("o", start, stopindex=END)
    if not pos:
        break
    print("找到啦,位置是:", getIndex(text, pos))
    start = pos + "+1c"  # 将 start 指向下一个字符

mainloop()

如果忽略 stopindex 选项,表示直到文本的末尾结束搜索。设置 backwards 选项为 True,则是修改搜索的方向(变为向后搜索,那么 start 变量你应该设置为 END,stopindex 选项设置为 1.0,最后 "+1c" 改为 "-1c")

“恢复”和“撤销”操作

Text 组件还支持“恢复”和“撤销”操作,这使得 Text 组件显得相当高大上。

通过设置 undo 选项为 True 可以开启 Text 组件的“撤销”功能。然后用 edit_undo() 方法实现“撤销”操作,用 edit_redo() 方法实现“恢复”操作。

这是因为 Text 组件内部有一个栈专门用于记录内容的每次变动,所以每次“撤销”操作就是一次弹栈操作,“恢复”就是再次压栈。

默认情况下,每一次完整的操作将会放入栈中。但怎么样算是一次完整的操作呢?Tkinter 觉得每次焦点切换、用户按下 Enter 键、删除\插入操作的转换等之前的操作算是一次完整的操作。也就是说你连续输入“FishC 是个 P”的话,一次的“撤销”操作就会将所有的内容删除。

那我们能不能自定义呢?比如我希望插入一个字符就算一次完整的操作,然后每次点击“撤销”就去掉一个字符。

当然可以!做法就是先将 autoseparators 选项设置为 False(因为这个选项是让 Tkinter 在认为一次完整的操作结束后自动插入“分隔符”),然后绑定键盘事件,每次有输入就用 edit_separator() 方法人为地插入一个“分隔符”:

from tkinter import *

root = Tk()

text = Text(root, width=30, height=5, autoseparators=False, undo=True, maxundo=10)
text.pack()

def callback(event):
    text.edit_separator()

text.bind('<Key>', callback)

text.insert(INSERT, "I love FishC")

def show():
    text.edit_undo()

Button(root, text="撤销", command=show).pack()

mainloop()
Index的用法

Indexes(索引)是用来指向 Text 组件中文本的位置,跟 Python 的序列索引一样,Text 组件索引也是对应实际字符之间的位置。

Tkinter 提供一系列不同的索引类型:

  • "line.column"(行/列)
  • "line.end"(某一行的末尾)
  • INSERT
  • CURRENT
  • END
  • user-defined marks
  • user-defined tags("tag.first","tag.last")
  • selection(SEL_FIRST,SEL_LAST)
  • window coordinate("@x,y")
  • embedded object name(window,images)
  • expressions

下边我们逐个给大家讲解:

line.column

行/列 是最基础的索引方式,它们将索引位置的行号和列号以字符串的形式表示出来(中间以 "." 分隔,例如 "1.0")。需要注意的是,行号以 1 开始,列号则以 0 开始。你还可以使用以下语法构建索引:

"%d.%d" % (line, column)

指定超出现有文本的最后一行的行号,或超出一行中列数的列号都不会引发错误。对于这样的指定,Tkinter 解释为已有内容的末尾的下一个位置。

需要注意的是,使用 行/列 的索引方式看起来像是浮点值。其实不只像而已,你在需要指定索引的时候使用浮点值代替也是可以的:

text.insert(INSERT, "I love FishC")
print(text.get("1.2", 1.6))

使用 index() 方法可以将所有支持的“索引”格式转换为“行/列”格式的索引号。

line.end

行号加上字符串 ".end" 的格式表示为该行最后一个字符的位置:

text.insert(INSERT, "I love FishC")
print(text.get("1.2", "1.end"))

INSERT(或 "insert") 对应插入光标的位置。

CURRENT(或 "current") 对应与鼠标坐标最接近的位置。不过,如果你紧按鼠标任何一个按钮,它会直到你松开它才响应。

END(或 "end") 对应 Text 组件的文本缓冲区最后一个字符的下一个位置。

user-defined marks user-defined marks 是对 Text 组件中位置的命名。INSERT 和 CURRENT 是两个预先命名好的 marks,除此之外你可以自定义 marks(请参考下方【Marks 用法】)。

User-defined tags User-defined tags 代表可以分配给 Text 组件的特殊事件绑定和风格(请参考下方【Tags 用法】)。

你可以使用 "tag.first"(使用 tag 的文本的第一个字符之前)和 "tag.last"(使用 tag 的文本的最后一个字符之后)语法表示标签的范围。

"%s.first" % tagname
"%s.last" % tagname

如果查无此 tag,那么 Tkinter 会抛出一个TclError 异常。

selection(SEL_FIRST,SEL_LAST) selection 是一个名为 SEL(或 "sel")的特殊 tag,表示当前被选中的范围,你可以使用 SEL_FIRST 到 SEL_LAST 来表示这个范围。如果没有选中的内容,那么 Tkinter 会抛出一个TclError 异常。

window coordinate("@x,y") 你还可以使用窗口坐标作为索引。例如在一个事件绑定中,你可以使用以下代码找到最接近鼠标位置的字符:

"@%d,%d" % (event.x, event.y)

embedded object name(window,images) embedded object name 用于指向在 Text 组件中嵌入的 window 和 image 对象。要引用一个 window,只要简单地将一个 Tkinter 组件实例作为索引即可。引用一个嵌入的 image,只需使用相应的 PhotoImage 和 BitmapImage 对象。

expressions expressions 用于修改任何格式的索引,用字符串的形式实现修改索引的表达式。

具体表达式实现如下:













































表达式



含义

"+ count chars" 1. 将索引向前(->)移动 count 个字符

2. 可以越过换行符,但不能超过 END 的位置
"- count chars" 1. 将索引向后(<-)移动 count 个字符

2. 可以越过换行符,但不能超过 "1.0" 的位置
"+ count lines" 1. 将索引向前(->)移动 count 行

2. 索引会尽量保持与移动前在同一列上,但如果移动后的那一行字符太少,将移动到该行的末尾
"- count lines" 1. 将索引向后(<-)移动 count 行

2. 索引会尽量保持与移动前在同一列上,但如果移动后的那一行字符太少,将移动到该行的末尾
" linestart" 1. 将索引移动到当前索引所在行的起始位置

2. 注意,使用该表达式前边必须有一个空格隔开
" lineend" 1. 将索引移动到当前索引所在行的末尾

2. 注意,使用该表达式前边必须有一个空格隔开
" wordstart" 1. 将索引移动到当前索引指向的单词的开头

2. 单词的定义是一系列字母、数字、下划线或任何非空白字符的组合

3. 注意,使用该表达式前边必须有一个空格隔开
" wordend" 1. 将索引移动到当前索引指向的单词的末尾

2. 单词的定义是一系列字母、数字、下划线或任何非空白字符的组合

3. 注意,使用该表达式前边必须有一个空格隔开



TIPS:只要结果不产生歧义,关键字可以被缩写,空格也可以省略。例如:"+ 5 chars" 可以简写成 "+5c"

在实现中,为了确保表达式为普通字符串,你可以使用 str 或格式化操作来创建一个表达式字符串。下边例子演示了如何删除插入光标前边的一个字符:

def backspace(event):
    event.widget.delete("%s-1c" % INSERT, INSERT)
Marks 用法

Marks(标记)通常是嵌入到 Text 组件文本中的不可见对象。事实上 Marks 是指定字符间的位置,并跟随相应的字符一起移动。Marks 有 INSERT,CURRENT 和 user-defined marks(用户自定义的 Marks)。其中,INSERT 和 CURRENT 是 Tkinter 预定义的特殊 Marks,它们不能够被删除。

INSERT(或 "insert")用于指定当前插入光标的位置,Tkinter 会在该位置绘制一个闪烁的光标(因此并不是所有的 Marks 都不可见)。

CURRENT(或 "current")用于指定与鼠标坐标最接近的位置。不过,如果你紧按鼠标任何一个按钮,它会直到你松开它才响应。

你还可以自定义任意数量的 Marks,Marks 的名字是由普通字符串组成,可以是除了空白字符外的任何字符(为了避免歧义,你应该起一个有意义的名字)。使用 mark_set() 方法创建和移动 Marks。

如果你在一个 Mark 标记的位置之前插入或删除文本,那么 Mark 跟着一并移动。删除 Marks 你需要使用 mark_unset() 方法,删除 Mark 周围的文本并不会删除 Mark 本身。

如果有做相关练习的鱼油应该会被 Mark 的很多特性所疑惑,小甲鱼在准备这个内容的时候也很是迷惑,找了不知多少文档......最后总结为下边几个例子讲解:

例1,Mark 事实上就是索引,用于表示位置:

text.insert(INSERT, "I love FishC")
text.mark_set("here", "1.2")
text.insert("here", "插")

例2,如果 Mark 前边的内容发生改变,那么 Mark 的位置也会跟着移动(说白了就是 Mark 会“记住”它后边的那货~):

text.insert(INSERT, "I love FishC")
text.mark_set("here", "1.2")
text.insert("here", "插")
text.insert("here", "入")

例3,如果 Mark 周围的文本被删除了,Mark 仍然还在噢(只是它后边的那货被删除了,所以它六神无主,只能初始化为 "1.0"):

text.insert(INSERT, "I love FishC")
text.mark_set("here", "1.2")
text.insert("here", "插")

text.delete("1.0", END)
text.insert("here", "入")

例4,只有 mark_unset() 方法可以解除 Mark 的封印:

text.insert(INSERT, "I love FishC")
text.mark_set("here", "1.2")
text.insert("here", "插")

text.mark_unset("here")

text.delete("1.0", END)
text.insert("here", "入")

好,讲最后一点,我们看到了,默认插入内容到 Mark,是插入到它的左侧(就是说插入一个字符的话,Mark 向后移动了一个字符的位置)。那能不能插入到 Mark 的右侧呢?其实是可以的,通过 mark_gravity() 方法就可以实现。

例5(对比例2):

text.insert(INSERT, "I love FishC")

text.mark_set("here", "1.2")
text.mark_gravity("here", LEFT)

text.insert("here", "插")
text.insert("here", "入")
Tags 用法

Tags(标签)通常用于改变 Text 组件中内容的样式和功能。你可以修改文本的字体、尺寸和颜色。另外,Tags 还允许你将文本、嵌入的组件和图片与键盘和鼠标等事件相关联。除了 user-defined tags(用户自定义的 Tags),还有一个预定义的特殊 Tag:SEL。

SEL(或 "sel")用于表示对应的选中内容(如果有的话)。

你可以自定义任意数量的 Tags,Tags 的名字是由普通字符串组成,可以是除了空白字符外的任何字符。另外,任何文本内容都支持多个 Tags 描述,任何 Tag 也可以用于描述多个不同的文本内容。

为指定文本添加 Tags 可以使用 tag_add() 方法:

text.insert(INSERT, "I love FishC.com!")
text.tag_add("tag1", "1.7", "1.12", "1.14")
text.tag_config("tag1", background="yellow", foreground="red")

如上,使用 tag_config() 方法可以设置 Tags 的样式。下边罗列了 tag_congif() 方法可以使用的选项:
























































































选项

含义
background 1. 指定该 Tag 所描述的内容的背景颜色

2. 注意:bg 并不是该选项的缩写,在这里 bg 被解释为 bgstipple 选项的缩写
bgstipple 1. 指定一个位图作为背景,并使用 background 选项指定的颜色填充

2. 只有设置了 background 选项该选项才会生效

3. 默认的标准位图有:'error', 'gray75', 'gray50', 'gray25', 'gray12', 'hourglass',
'info', 'questhead', 'question' 和 'warning'
borderwidth 1. 指定文本框的宽度

2. 默认值是 0

3. 只有设置了 relief 选项该选项才会生效

4. 注意:该选项不能使用 bd 缩写
fgstipple 1. 指定一个位图作为前景色

2. 默认的标准位图有:'error', 'gray75', 'gray50', 'gray25', 'gray12', 'hourglass',
'info', 'questhead', 'question' 和 'warning'
font 指定该 Tag 所描述的内容使用的字体
foreground 1. 指定该 Tag 所描述的内容的前景色

2. 注意:fg 并不是该选项的缩写,在这里 fg 被解释为 fgstipple 选项的缩写
justify 1. 控制文本的对齐方式

2. 默认是 LEFT(左对齐),还可以选择 RIGHT(右对齐)和 CENTER(居中)

3. 注意:需要将 Tag 指向该行的第一个字符,该选项才能生效
lmargin1 1. 设置 Tag 指向的文本块第一行的缩进

2. 默认值是 0

3. 注意:需要将 Tag 指向该文本块的第一个字符或整个文本块,该选项才能生效


lmargin2 1. 设置 Tag 指向的文本块除了第一行其他行的缩进

2. 默认值是 0

3. 注意:需要将 Tag 指向整个文本块,该选项才能生效
offset
1. 设置 Tag 指向的文本相对于基线的偏移距离
2. 可以控制文本相对于基线是升高(正数值)或者降低(负数值)

3. 默认值是 0
overstrike 1. 在 Tag 指定的文本范围画一条删除线

2. 默认值是 False
relief 1. 指定 Tag 对应范围的文本的边框样式

2. 可以使用的值有:SUNKEN, RAISED, GROOVE, RIDGE 或 FLAT

3. 默认值是 FLAT(没有边框)
rmargin 1. 设置 Tag 指向的文本块右侧的缩进

2. 默认值是 0
spacing1 1. 设置 Tag 所描述的文本块中每一行与上方的空白间隔

2. 注意:自动换行不算

3. 默认值是 0
spacing2 1. 设置 Tag 所描述的文本块中自动换行的各行间的空白间隔

2. 注意:换行符('\n')不算

3. 默认值是 0
spacing3 1. 设置 Tag 所描述的文本块中每一行与下方的空白间隔
 

2. 注意:自动换行不算

3. 默认值是 0
tabs 1. 定制 Tag 所描述的文本块中 Tab 按键的功能

2. 默认 Tab 被定义为 8 个字符的宽度

3. 你还可以定义多个制表位:tabs=('3c', '5c', '12c') 表示前 3 个 Tab 宽度分别为 3厘米,5厘米,12厘米,接着的
Tab 按照最后两个的差值计算,即:19厘米,26厘米,33厘米

4. 你应该注意到了,它上边 'c' 的含义是“厘米”而不是“字符”,还可以选择的单位有 'i'(英寸),'m'(毫米)和 'p'(DPI,大约是
'1i' 等于 '72p')

5. 如果是一个整型值,则单位是像素
underline 1. 该选项设置为 True 的话,则 Tag 所描述的范围内文本将被画上下划线

2. 默认值是 False
wrap 1. 设置当一行文本的长度超过 width 选项设置的宽度时,是否自动换行

2. 该选项的值可以是:NONE(不自动换行),CHAR(按字符自动换行)和 WORD(按单词自动换行)



如果你对同一个范围内的文本加上多个 Tags,并且设置相同的选项,那么新创建的 Tag 样式会覆盖比较旧的 Tag:

text.tag_config("tag1", background="yellow", foreground="red")  # 旧的 Tag
text.tag_config("tag2", foreground="blue")  # 新的 Tag

# 那么新创建的 Tag2 会覆盖比较旧的 Tag1 的相同选项
# 注意,与下边的调用顺序没有关系
text.insert(INSERT, "I love FishC.com!", ("tag2", "tag1"))

你或许想控制 Tags 间的优先级,这可以实现吗?小甲鱼来告诉你,完全没有问题!你可以使用 tag_raise() 和 tag_lower() 方法来提高和降低某个 Tag 的优先级:

text.tag_config("tag1", background="yellow", foreground="red")
text.tag_config("tag2", foreground="blue")

text.tag_lower("tag2")

text.insert(INSERT, "I love FishC.com!", ("tag2", "tag1"))

另外 Tags 还支持事件绑定,使用的是 tag_bind() 的方法。

下边例子中我们将文本("FishC.com")与鼠标事件进行绑定,当鼠标进入该文本段的时候,鼠标样式切换为 "arrow" 形态,离开文本段的时候切换回 "xterm" 形态。当触发鼠标“左键点击操作”事件的时候,使用默认浏览器打开网页:

from tkinter import *
import webbrowser

root = Tk()

text = Text(root, width=30, height=5)
text.pack()

text.insert(INSERT, "I love FishC.com!")

text.tag_add("link", "1.7", "1.16")
text.tag_config("link", foreground="blue", underline=True)

def show_hand_cursor(event):
    text.config(cursor="arrow")

def show_arrow_cursor(event):
    text.config(cursor="xterm")

def click(event):
    webbrowser.open("http://www.fishc.com")

text.tag_bind("link", "<Enter>", show_hand_cursor)
text.tag_bind("link", "<Leave>", show_arrow_cursor)
text.tag_bind("link", "<Button-1>", click)

mainloop()

参数说明

Text(master=None, options)(class)
master -- 父组件
options -- 组件选项,下方表格详细列举了各个选项的具体含义和用法:

































































































































































选项

含义
autoseparators 1. 指定实现“撤销”操作的时候是否自动插入一个“分隔符”(用于分隔操作记录)

2. 默认值是 True

3. 详见上方用法【“撤销”和“恢复”操作】
background 1. 设置 Text 组件的背景颜色

2. 注意:通过使用 Tags 可以使 Text 组件中的文本支持多种背景颜色显示(请参考上方【Tags 用法】)
bg 跟 background 一样
borderwidth 1. 设置 Entry 的边框宽度

2. 默认值是 1 像素
bd 跟 borderwidth 一样
cursor 1. 指定当鼠标在 Text 组件上飘过的时候的鼠标样式

2. 默认值由系统指定
exportselection 1. 指定选中的文本是否可以被复制到剪贴板

2. 默认值是 True

3. 可以修改为 False 表示不允许复制文本
font 1. 设置 Text 组件中文本的默认字体

2. 注意:通过使用 Tags 可以使 Text 组件中的文本支持多种字体显示(请参考上方【Tags 用法】)
foreground 1. 设置 Text 组件中文本的颜色

2. 注意:通过使用 Tags 可以使 Text 组件中的文本支持多种颜色显示(请参考上方【Tags 用法】)
fg 跟 foreground 一样
height 1. 设置 Text 组件的高度

2. 注意:单位是行数,不是像素噢
highlightbackground 1. 指定当 Text 组件没有获得焦点的时候高亮边框的颜色

2. 默认值由系统指定
highlightcolor 1. 指定当 Text 组件获得焦点的时候高亮边框的颜色

2. 默认值由系统指定
highlightthickness 1. 指定高亮边框的宽度

2. 默认值是 0
insertbackground 1. 设置插入光标的颜色

2. 默认是 BLACK(或 "black")
insertborderwidth 1. 设置插入光标的边框宽度

2. 默认值是 0

3. 提示:你得设置 insertwidth 选项为比较大的数值才能看出来噢
insertofftime 1. 该选项控制光标的闪烁频率(灭)

2. 单位是毫秒
insertontime 1. 该选项控制光标的闪烁频率(亮)

2. 单位是毫秒
insertwidth 1. 指定光标的宽度

2. 默认值是 2 像素
maxundo 1. 设置允许“撤销”操作的最大次数

2. 默认值是 0

3. 设置为 -1 表示不限制
padx 1. 指定水平方向上的额外间距(内容和边框间)

2. 默认值是 1
pady 1. 指定垂直方向上的额外间距(内容和边框间)

2. 默认值是 1
relief 1. 指定边框样式

2. 默认值是 SUNKEN

3. 其他可以选择的值是 FLAT,RAISED,GROOVE 和 RIDGE
selectbackground 1. 指定被选中文本的背景颜色

2. 默认值由系统指定
selectborderwidth 1. 指定被选中文本的边框宽度

2. 默认值是 0
selectforeground 1. 指定被选中文本的字体颜色

2. 默认值由系统指定
setgrid 1. 指定一个布尔类型的值,确定是否启用网格控制

2. 默认值是 False
spacing1 1. 指定 Text 组件的文本块中每一行与上方的空白间隔

2. 注意:自动换行不算

3. 默认值是 0
spacing2 1. 指定 Text 组件的文本块中自动换行的各行间的空白间隔

2. 注意:换行符('\n')不算

3. 默认值是 0
spacing3 1. 指定 Text 组件的文本中每一行与下方的空白间隔
 

2. 注意:自动换行不算

3. 默认值是 0
state 1. 默认情况下 Text 组件响应键盘和鼠标事件(NORMAL)

2. 如果将该选项的值设置为 DISABLED,那么上述响应就不会发生,并且你无法修改里边的内容
tabs 1. 定制 Tag 所描述的文本块中 Tab 按键的功能

2. 默认 Tab 被定义为 8 个字符的宽度

3. 你还可以定义多个制表位:tabs=('3c', '5c', '12c') 表示前 3 个 Tab 宽度分别为 3厘米,5厘米,12厘米,接着的
Tab 按照最后两个的差值计算,即:19厘米,26厘米,33厘米

4. 你应该注意到了,它上边 'c' 的含义是“厘米”而不是“字符”,还可以选择的单位有 'i'(英寸),'m'(毫米)和 'p'(DPI,大约是
'1i' 等于 '72p')

5. 如果是一个整型值,则单位是像素
takefocus 1. 指定使用 Tab 键可以将焦点移动到 Text 组件中

2. 默认是开启的,可以将该选项设置为 False 避免焦点在此 Text 组件中
undo 1. 该选项设置为 True 开启“撤销”功能

2. 该选项设置为 False 关闭“撤销”功能

3. 默认值是 False
width 1. 设置 Text 组件的宽度

2. 注意:单位是字符数,因此 Text 组件的实际宽度还取决于字体的大小
wrap 1. 设置当一行文本的长度超过 width 选项设置的宽度时,是否自动换行

2. 该选项的值可以是:NONE(不自动换行),CHAR(按字符自动换行)和 WORD(按单词自动换行)
xscrollcommand 1. 与 scrollbar(滚动条)组件相关联(水平方向)

2. 使用方法可以参考:crollbar 组件
yscrollcommand 1. 与 scrollbar(滚动条)组件相关联(垂直方向)

2. 使用方法可以参考:Scrollbar 组件







方法






bbox(index)


-- 返回给定索引指定的字符的边界框


-- 返回值是一个 4 元组:(x, y, width, height)


-- 如果该字符是不可见的,那么返回 None


-- 注意:只有当 Text 组件被更新的时候该方法才有效,可以使用 update_idletasks() 方法先更新 Text 组件




compare(index1, op, index2)


-- 返回对比 index1 和 index2 指定的两个字符的结果


-- op 是操作符:'<', '<=', '==', '>=', '>' 或 '!='(不支持 Python 的 '<>'
操作符)



-- 返回布尔类型的值表示对比的结果




debug(boolean=None)


-- 开启或关闭 Debug 状态




delete(start, end=None)


-- 删除给定范围的文本或嵌入对象


-- 如果在给定范围内有任何 Marks 标记的位置,则将 Marks 移动到 start 参数开始的位置




dlineinfo(index)


-- 返回给定索引指定的字符所在行的边界框


-- 返回值是一个 5 元组:(x, y, width, height, offset),offset 表示从该行的顶端到基线的偏移


-- 如果该行不可见,则返回 None


-- 注意:只有当 Text 组件被更新的时候该方法才有效,可以使用 update_idletasks() 方法先更新 Text 组件




dump(index1, index2=None, command=None, kw)


-- 返回 index1 和 index2 之间的内容


-- 返回的值是一个由 3 元组(关键词,值,索引)组成的列表,关键词参数的顺序为:all, image, mark, tag, text, window


-- 默认关键词是 'all',表示全部关键词均为选中状态


-- 如果需要筛选个别关键词,可以用 dump(index1, index2, image=True, text=True) 这样的形式调用


-- 如果指定了 command 函数,那么会为列表中的每一个三元组作为参数调用一次该函数(这种情况下,dump() 不返回值)




edit_modified(arg=None)


-- 该方法用于查询和设置 modified 标志(该标标志用于追踪 Text 组件的内容是否发生变化)


-- 如果不指定 arg 参数,那么返回 modified 标志是否被设置


-- 你可以传递显式地使用 True 或 False 作为参数来设置或清除 modified 标志


-- 任何代码或用户的插入或删除文本操作,“撤销”或“恢复”操作,都会是的 modified 标志被设置




edit_redo(self)


-- “恢复”上一次的“撤销”操作


-- 如果 undo 选项为 False,该方法无效


-- 详见上方用法【“撤销”和“恢复”操作】




edit_reset()


-- 清空存放操作记录的栈




edit_separator()


-- 插入一个“分隔符”到存放操作记录的栈中,用于表示已经完成一次完整的操作


-- 如果 undo 选项为 False,该方法无效


-- 详见上方用法【“撤销”和“恢复”操作】




edit_undo()


-- 撤销最近一次操作


-- 如果 undo 选项为 False,该方法无效


-- 详见上方用法【“撤销”和“恢复”操作】




get(index1, index2=None)


-- 返回 index1 到 index2(不包含)之间的文本


-- 如果 index2 参数忽略,则返回一个字符


-- 如果包含 image 和 window 的嵌入对象,均被忽略


-- 如果包含有多行文本,那么自动插入换行符('\n')




image_cget(index, option)


-- 返回 index 参数指定的嵌入 image 对象的 option 选项的值


-- 如果给定的位置没有嵌入 image 对象,则抛出 TclError 异常




image_configure(index, options)



-- 修改 index 参数指定的嵌入 image 对象的一个或多个 option 选项的值


-- 如果给定的位置没有嵌入 image 对象,则抛出 TclError 异常




image_create(index, cnf={}, **kw)


-- 在 index 参数指定的位置嵌入一个 image 对象


-- 该 image 对象必须是 Tkinter 的 PhotoImage 或 BitmapImage 实例


-- 可选选项 align:设定此图像的垂直对齐,可以是 TOP、CENTER、BOTTOM 或 BASELINE


-- 可选选项 image:PhotoImage 或 BitmapImage 对象


-- 可选选项 name:你可以为该图像实例命名,如果你忽略此选项,那么 Tkinter 会自动为其取一个独一无二的名字。


-- 可选选项 padx:设置水平方向上的额外间距


-- 可选选项 pady:设置垂直方向上的额外间距




image_names()


-- 返回 Text 组件中嵌入的所有 image 对象的名字




index(index)


-- 将 index 参数指定的位置以 "line.column" 的索引形式返回


-- index 参数支持任何格式的索引




insert(index, text, tags)


-- 在 index 参数指定的位置插入字符串


-- 可选参数 tags 用于指定文本的样式


-- 详见上方【Tags 用法】




mark_gravity(self, markName, direction=None)


-- 设置 Mark 的方向,可以是 LEFT 或 RIGHT(默认是 RIGHT,即如果在 Mark 处插入文本的话,Mark 将发生相应的移动以保持在插入文本的右侧)


-- 如果设置为 LEFT,那么在 Mark 处插入文本并不会移动 Mark(因为 Mark 在插入文本的左侧)


-- 如果忽略 direction 参数,则返回指定 Mark 的方向


-- 详见上方【Marks 用法】




mark_names()


-- 返回 Text 组件中所有 Marks 的名字


-- 包括两个特殊 Mark:INSERT 和 CURRENT


-- 注意:END 是特殊的索引,不是 Mark




mark_next(index)


-- 返回在 index 指定的位置后边的一个 Mark 的名字


-- 如果不存在则返回空字符串




mark_previous(index)


-- 返回在 index 指定的位置前边的一个 Mark 的名字


-- 如果不存在则返回空字符串




mark_set(markName, index)


-- 移动 Mark 到 index 参数指定的位置


-- 如果 markName 参数指定的 Mark 不存在,则创建一个新的 Mark




mark_unset(
markNames)


-- 删除 markNames 指定的 Marks


-- 不能删除预定义的 INSERT 和 CURRENT




replace(index1, index2, chars, *args)


-- 将 index1 到 index2 之间的内容替换为 chars 参数指定的字符串


-- 如果需要为替换的内容添加 Tag,可以在 args 参数指定 Tag


-- 详见上方【Tags 用法】




scan_dragto(x, y)


-- 详见下方 scan_mark(x, y)




scan_mark(x, y)


-- 使用这种方式来实现 Text 组件内容的滚动


-- 需要将鼠标按钮事件以及鼠标当前位置绑定到 scan_mark(x, y) 方法,然后将 <motion> 事件及当前鼠标位置绑定到 scan_dragto(x,

y) 方法,就可以实现 Text 组件的内容在当前位置和 scan_mark(x, y) 指定的位置 (x, y) 之间滚动




search(pattern, index, stopindex=None, forwards=None, backwards=None, exact=None,
regexp=None, nocase=None, count=None)



-- 从 index 开始搜索 pattern,到 stopindex 结束(不指定表示搜索到末尾)


-- 如果成功找到,以 "line.column" 返回第一个匹配的字符;否则返回空字符串


-- forwards 参数设置为 True 表示向前(->)搜索


-- backwards 参数设置为 True 表示向后(<-)搜索


-- exact 参数设置为 True 表示搜索与 pattern 完全匹配的结果


-- regexp 参数设置为 True,则 pattern 被解释为 Tcl 格式的正则表达式


-- nocase 参数设置为 True 是忽略大小写,默认是区分大小写的搜索


-- count 参数指定为一个 IntVar 的 Tkinter 变量,用于存放当找到匹配的字符个数(如果匹配结果中没有嵌入的 image 或 window
对象的话,一般该值等于 pattern 的字符个数)





see(index)


-- 滚动内容,确保 index 指定的位置可见




tag_add(tagName, index1, index2=None)


-- 为 index1 到 index2 之间的内容添加一个 Tag(tagName 参数指定)


-- 如果 index2 参数忽略,则单独为 index1 指定的内容添加 Tag


-- 详见上方【Tags 用法】




tag_bind(tagName, sequence, func, add=None)


-- 为 Tag 绑定事件


-- 详见上方【Tags 用法】




tag_cget(tagName, option)


-- 返回 tagName 指定的 option 选项的值




tag_config(tagName, cnf=None, kw)


-- 跟 tag_configure(tagName, cnf=None,
kw) 一样




tag_configure(tagName, cnf=None, **kw)


-- 设置 tagName 的选项


-- 详见上方【Tags 用法】




tag_delete(tagNames)


-- 删除 tagNames 指定的 Tags




tag_lower(tagName, belowThis=None)


-- 降低 Tag 的优先级


-- 如果 belowThis 参数不为空,则表示 tagName 需要比 belowThis 指定的 Tag 优先级更低


-- 详见上方【Tags 用法】




tag_names(index=None)


-- 如果不带参数,表示返回 Text 组件中所有 Tags 的名字


-- index 参数表示返回该位置上所有的 Tags 的名字




tag_nextrange(tagName, index1, index2=None)


-- 在 index1 到 index2 的范围内第一个 tagName 的位置


-- 如果没有则返回空字符串




tag_prevrange(tagName, index1, index2=None)


-- tag_nextrange() 的反向查找,也就是查找范围是 index2 到 index1




tag_raise(tagName, aboveThis=None)


-- 提高 Tag 的优先级


-- 如果 aboveThis 参数不为空,则表示 tagName 需要比 aboveThis 指定的 Tag 优先级更高


-- 详见上方【Tags 用法】




tag_ranges(tagName)


-- 返回所有 tagName 指定的文本,并将它们的范围以列表的形式返回




tag_remove(tagName, index1, index2=None)


-- 删除 index1 到 index2 之间所有的 tagName


-- 如果忽略 index2 参数,那么只删除 index1 指定的那个字符的 tagName(如果有的话)




tag_unbind(tagName, sequence, funcid=None)


-- 解除与 tagName 绑定的事件(sequence 指定)




window_cget(index, option)


-- 返回 index 参数指定的嵌入 window 对象的 option 选项的值


-- 如果给定的位置没有嵌入 window 对象,则抛出 TclError 异常




window_config(index, cnf=None, kw)


-- 跟 window_configure(index, cnf=None,
kw) 一样




window_configure(index, cnf=None, kw)


-- 修改 index 参数指定的嵌入 window 对象的一个或多个 option 选项的值


-- 如果给定的位置没有嵌入 window 对象,则抛出 TclError 异常




window_create(index, options)



-- 在 index 参数指定的位置嵌入一个 window 对象


-- 支持两种方式在 Text 组件中嵌入 window 对象:请看下方 create 选项和 window 选项的描述


-- 可选选项 align:设定此图像的垂直对齐,可以是 TOP、CENTER、BOTTOM 或 BASELINE


-- 可选选项 create:指定一个回调函数用于创建嵌入的 window 组件,该函数没有参数,并且必须创建 Text 的子组件并返回


-- 可选选项 padx:设置水平方向上的额外间距


-- 可选选项 pady:设置垂直方向上的额外间距


-- 可选选项 stretch:该选项控制当行的高度大于嵌入组件的高度时,嵌入组件是否延伸。默认值是 False,表示组件保持原形;设置为 True 表示将该组件垂直部分延伸至行的高度


-- 可选选项 window:指定一个已经创建好的 window 组件,该组件必须是 Text 组件的子组件




window_names()


-- 返回 Text 组件中嵌入的所有 window 对象的名字




xview(
args)


-- 该方法用于在水平方向上滚动 Text 组件的内容,一般通过绑定 Scollbar 组件的 command 选项来实现(具体操作参考:Scrollbar)


-- 如果第一个参数是 MOVETO,则第二个参数表示滚动到指定的位置:0.0 表示最左端,1.0 表示最右端


-- 如果第一个参数是 SCROLL,则第二个参数表示滚动的数量,第三个参数表示滚动的单位(可以是 UNITS 或 PAGES),例如:xview(SCROLL,3, UNITS) 表示向右滚动三行




xview_moveto(fraction)


-- 跟 xview(MOVETO, fraction) 一样




xview_scroll(number, what)

-- 跟 xview(SCROLL, number, what) 一样
yview(*args)
-- 该方法用于在垂直方向上滚动 Text 组件的内容,一般通过绑定 Scollbar 组件的 command 选项来实现(具体操作参考:Scrollbar)
-- 如果第一个参数是 MOVETO,则第二个参数表示滚动到指定的位置:0.0 表示最顶端,1.0 表示最底端
-- 如果第一个参数是 SCROLL,则第二个参数表示滚动的数量,第三个参数表示滚动的单位(可以是 UNITS 或 PAGES),例如:yview(SCROLL, 3, PAGES) 表示向下滚动三页


yview_moveto(fraction)
-- 跟 yview(MOVETO, fraction) 一样


yview_scroll(number, what)
-- 跟 yview(SCROLL, number, what) 一样


Scrollbar 滚动条

功能

Scrollbar(滚动条)组件用于滚动一些组件的可见范围,根据方向可分为垂直滚动条和水平滚动条。Scrollbar 组件常常被用于实现文本、画布和列表框的滚动。

Scrollbar 组件通常几乎与 Text 组件、Canvas 组件和 Listbox 组件一起使用,水平滚动条还能跟 Entry 组件配合。

用法

下边例子我们演示如何使用垂直滚动条。为了在某个组件上安装垂直滚动条,你需要做两件事:

  1. 设置该组件的 yscrollbarcommand 选项为 Scrollbar 组件的 set() 方法;

  2. 设置 Scrollbar 组件的 command 选项为该组件的 yview() 方法。

from tkinter import *

root = Tk()

sb = Scrollbar(root)
sb.pack(side=RIGHT, fill=Y)

lb = Listbox(root, yscrollcommand=sb.set)

for i in range(1000):
    lb.insert(END, str(i))

lb.pack(side=LEFT, fill=BOTH)

sb.config(command=lb.yview)

mainloop()

分析:当 Listbox 组件的可视范围发生改变的时候,Listbox 组件通过调用 set() 方法通知 Scrollbar 组件。而当用户操纵滚动条的时候,将自动调用 Listbox 组件的 yview() 方法。

添加水平滚动条方法跟上边一样,只是将 yscrollcommand 改为 xscrollcommand,yview 改为 xview 即可。

参数说明

Scrollbar(master=None, options)(class)
master -- 父组件
options -- 组件选项,下方表格详细列举了各个选项的具体含义和用法:

























































































选项

含义
activebackground 1. 指定当鼠标在上方飘过的时候滑块和箭头的背景颜色

2. 默认值由系统指定
activerelief 1. 指定当鼠标在上方飘过的时候滑块的样式

2. 默认值是 RAISED

3. 可以选择 FLAT,SUNKEN,GROOVE,RIDGE
background 1. 指定背景颜色

2. 默认值由系统指定
bg 跟 background 一样
borderwidth 1. 指定边框宽度

2. 默认值是 0
bd 跟 borderwidth 一样
command 1. 当滚动条更新时回调的函数

2. 通常的是指定对应组件的 xview() 或 yview() 方法


cursor 1. 指定当鼠标在上方飘过的时候的鼠标样式

2. 默认值由系统指定
elementborderwidth 1. 指定滚动条和箭头的边框宽度

2. 默认值是 -1(表示使用 borderwidth 选项的值)
highlightbackground 1. 指定当滚动条没有获得焦点的时候高亮边框的颜色

2. 默认值由系统指定
highlightcolor 1. 指定当滚动条获得焦点的时候高亮边框的颜色

2. 默认值由系统指定
highlightthickness 1. 指定高亮边框的宽度

2. 默认值是 0(不带高亮边框)
jump 1. 指定当用户拖拽滚动条时的行为

2. 默认值是 False,滚动条的任何一丝变动都会即刻调用 command 选项指定的回调函数

3. 设置为 True 则当用户松开鼠标才调用
orient 1. 指定绘制 HORIZONTAL(垂直滚动条)还是 VERTICAL(水平滚动条)

2. 默认值是 VERTICAL
relief 1. 指定边框样式

2. 默认值是 SUNKEN

3. 可以选择 FLAT,RAISED,GROOVE,RIDGE
repeatdelay 1. 该选项指定鼠标左键点击滚动条凹槽的响应时间

2. 默认值是 300(毫秒)
repeatinterval 1. 该选项指定鼠标左键紧按滚动条凹槽时的响应间隔

2. 默认值是 100(毫秒)
takefocus 1. 指定使用 Tab 键可以将焦点移到该 Scrollbar 组件上

2. 默认是开启的,可以将该选项设置为 False 避免焦点在此组件上
troughcolor 1. 指定凹槽的颜色

2. 默认值由系统指定
width 1. 指定滚动条的宽度

2. 默认值是 16 像素







方法






activate(element)

 



-- 显示 element 参数指定的元素的背景颜色和样式


-- element 参数可以设置为:"arrow1"(箭头1),"arrow2"(箭头2)或 "slider"(滑块)




delta(deltax, deltay)


-- 给定一个鼠标移动的范围 deltax 和 deltay(像素为单位,deltax 表示水平移动量,deltay 表示垂直移动量),然后该方法返回一个浮点类型的值(范围
-1.0 ~ 1.0)



-- 这通常在鼠标绑定上使用,用于确定当用户拖拽鼠标时滑块的如何移动




fraction(x, y)


-- 给定一个像素坐标 (x, y),该方法返回最接近给定坐标的滚动条位置(范围 0.0 ~ 1.0)




get()


-- 返回当前滑块的位置 (a, b)


-- a 值表示当前滑块的顶端或左端的位置,b 值表示当前滑块的底端或右端的位置(范围 0.0 ~ 1.0)




identify(x, y)


-- 返回一个字符串表示指定位置下(如果有的话)的滚动条部件


-- 返回值可以是:"arrow1"(箭头1),"arrow2"(箭头2)、"slider"(滑块)或 ""(啥都没有)




set(*args)


-- 设置当前滚动条的位置


-- 如果设置则需要两个参数 (first, last),first 表示当前滑块的顶端或左端的位置,last 表示当前滑块的底端或右端的位置(范围 0.0
~ 1.0)



Scale 刻度

功能

Scale(刻度)组件看起来像是一个带数据的 Scrollbar(滚动条)组件,但事实上它们是不同的两个东东。Scale 组件允许用于通过滑动滑块来选择一个范围内的数字。你可以控制该组件的最大值、最小值,以及分辨率。

当你希望用户输入某个范围内的一个数值,使用 Scale 组件可以很好的代替 Entry 组件。

用法

创建一个指定范围的 Scale 组件其实非常容易,你只需要指定它的 from 和 to 两个选项即可。但由于 from 本身是 Python 的关键字,所以为了区分需要在后边紧跟一个下划线:from_

from tkinter import *

root = Tk()

Scale(root, from_=0, to=42).pack()
Scale(root, from_=0, to=200, orient=HORIZONTAL).pack()

mainloop()

使用 get() 方法可以获取当前滑块的位置:

from tkinter import *

root = Tk()

s1 = Scale(root, from_=0, to=42)
s1.pack()

s2 = Scale(root, from_=0, to=200, orient=HORIZONTAL)
s2.pack()

def show():
    print(s1.get(), s2.get())

Button(root, text="获得位置", command=show).pack()

mainloop()

然后,你可以通过 resolution 选项控制分辨率(步长),通过 tickinterval 选项设置刻度:

from tkinter import *

root = Tk()

Scale(root, from_=0, to=42, tickinterval=5, length=200, \
      resolution=5, orient=VERTICAL).pack()
Scale(root, from_=0, to=200, tickinterval=10, length=600, \
      orient=HORIZONTAL).pack()

mainloop()

参数说明

Scale(master=None, options)(class)
master -- 父组件
options -- 组件选项,下方表格详细列举了各个选项的具体含义和用法:













































































































































选项

含义
activebackground 1. 指定当鼠标在上方飘过的时候滑块的背景颜色

2. 默认值由系统指定
background 1. 滚动槽外部的背景颜色

2. 默认值由系统指定
bg 跟 background 一样
bigincrement 1. 设置“大”增长量

2. 该选项设置增长量的大小

3. 默认值是 0,增长量为范围的 1/10
borderwidth 1. 指定边框宽度

2. 默认值是 2
bd 跟 borderwidth 一样
command 1. 指定一个函数,每当滑块发生改变的时候都会自动调用该函数

2. 该函数有一个唯一的参数,就是最新的滑块位置

3. 如果滑块快速地移动,函数可能无法获得每一个位置,但一定会获得滑块停下时的最终位置
cursor 1. 指定当鼠标在上方飘过的时候的鼠标样式

2. 默认值由系统指定
digits 1. 设置最多显示多少位数字

2. 补充注释:例如设置 from 选项为 0,to 选项为 20,digits 选项设置为 5,那么滑块的范围就是在 0.000 ~ 20.000
直接滑动

3. 默认值是 0(不开启)
foreground 1. 指定滑块左侧的 Label 和刻度的文字颜色

2. 默认值由系统指定
fg 跟 foreground 一样
font 1. 指定滑块左侧的 Label 和刻度的文字字体

2. 默认值由系统指定
from 1. 设置滑块最顶(左)端的位置

2. 默认值是 0
highlightbackground 1. 指定当 Scale 没有获得焦点的时候高亮边框的颜色

2. 默认值由系统指定
highlightcolor 1. 指定当 Scale 获得焦点的时候高亮边框的颜色

2. 默认值由系统指定
highlightthickness 1. 指定高亮边框的宽度

2. 默认值是 0(不带高亮边框)
label 1. 你可以在垂直的 Scale 组件的顶端右侧(水平的话是左端上方)显示一个文本标签

2. 默认值是不显示标签
length 1. Scale 组件的长度

2. 默认值是 100 像素
orient 1. 设置该 Scale 组件是水平放置(HORIZONTAL)还是垂直放置(VERTICAL)

2. 默认值是 VERTICAL
relief 1. 指定边框样式
 

2. 默认值是 SUNKEN

3. 可以选择 FLAT,RAISED,GROOVE 和 RIDGE
repeatdelay 1. 该选项指定鼠标左键点击滚动条凹槽的响应时间

2. 默认值是 300(毫秒)
repeatinterval 1. 该选项指定鼠标左键紧按滚动条凹槽时的响应间隔

2. 默认值是 100(毫秒)
resolution 1. 指定 Scale 组件的分辨率(步长,即在凹槽点击一下鼠标左键它移动的数量)

2. 补充注释:例如设置 from 选项为 0,to 选项为 20,resolution 选项设置为 0.1 的话,那么每点击一下鼠标就是在
0.0 ~ 20.0 之间以 0.1 的步长移动

3. 默认值是 1
showvalue 1. 设置是否显示滑块旁边的数字

2. 默认值为 True
sliderlength 1. 设置滑块的长度

2. 默认值是 30 像素
sliderrelief 1. 设置滑块的样式

2. 默认值是 RAISED

3. FLAT,SUNKEN,GROOVE 和 RIDGE
state 1. 默认情况下 Scale 组件支持鼠标事件和键盘事件,可以通过设置该选项为 DISABLED 来禁用此功能

2. 默认值是 NORMAL
takefocus 1. 指定使用 Tab 键是否可以将焦点移动到该 Scale 组件上

2. 默认是开启的,可以通过将该选项设置为 False 避免焦点落在此组件上
tickinterval 1. 设置显示的刻度,如果设置一个值,那么就会按照该值的倍数显示刻度

2. 默认值是不显示刻度
to 1. 设置滑块最底(右)端的位置

2. 默认值是 100
troughcolor 1. 设置凹槽的颜色

2. 默认值由系统指定
variable 1. 指定一个与 Scale 组件相关联的 Tkinter 变量,该变量存放滑块最新的位置

2. 当滑块移动的时候,该变量的值也会发生相应的变化
width 1. 指定 Scale 组件的宽度

2. 默认值是 15 像素







方法






coords(value=None)


-- 获得当前滑块的位置对应 Scale 组件左上角的相对坐标


-- 如果设置 value 参数,则返回当滑块所在该位置时的相对坐标




get()


-- 获得当前滑块的位置


-- Tkinter 会尽可能地返回一个整型值,否则返回一个浮点型值




identify(x, y)


-- 返回一个字符串表示指定位置下(如果有的话)的 Scale 部件


-- 返回值可以是:"slider"(滑块),"trough1"(左侧或上侧的凹槽),"trough2"(右侧或下侧的凹槽)或 ""(啥都没有)




set(value)


-- 设置 Scale 组件的值(滑块的位置)


Canvas 画布

功能

Canvas(画布)组件为 Tkinter 的图形绘制提供了基础。Canvas 是一个高度灵活的组件,你可以用它绘制图形和图表,创建图形编辑器,并实现各种自定义的小部件。

Canvas 是一个通用的组件,通常用于显示和编辑图形。你可以用它来绘制线段、圆形、多边形,甚至是绘制其它组件。

用法

在 Canvas 组件上绘制对象,可以用 create_xxx() 的方法(xxx 表示对象类型,例如线段 line,矩形 rectangle,文本 text 等):

from tkinter import *

root = Tk()

w = Canvas(root, width=200, height=100)
w.pack()

# 画一条黄色的横线
w.create_line(0, 50, 200, 50, fill="yellow")
# 画一条红色的竖线(虚线)
w.create_line(100, 0, 100, 100, fill="red", dash=(4, 4))
# 中间画一个蓝色的矩形
w.create_rectangle(50, 25, 150, 75, fill="blue")

mainloop()

注意,添加到 Canvas 上的对象会一直保留直着。如果你希望修改它们,你可以使用 coords(),itemconfig() 和 move() 方法来移动画布上的对象,或者使用 delete() 方法来删除:

line1 = w.create_line(0, 50, 200, 50, fill="yellow")
line2 = w.create_line(100, 0, 100, 100, fill="red", dash=(4, 4))
rect1 = w.create_rectangle(50, 25, 150, 75, fill="blue")

w.coords(line1, 0, 25, 200, 25)
w.itemconfig(rect1, fill="red")
w.delete(line2)

Button(root, text="删除全部", command=(lambda x=ALL : w.delete(x))).pack()

你还可以在 Canvas 上显示文本,使用的是 create_text() 方法:

w.create_line(0, 0, 200, 100, fill="green", width=3)
w.create_line(200, 0, 0, 100, fill="green", width=3)
w.create_rectangle(40, 20, 160, 80, fill="green")
w.create_rectangle(65, 35, 135, 65, fill="yellow")

w.create_text(100, 50, text="FishC")

使用 create_oval() 方法绘制椭圆形(或圆形),参数是指定一个限定矩形(Tkinter 会自动在这个矩形内绘制一个椭圆):

w.create_rectangle(40, 20, 160, 80, dash=(4, 4))
w.create_oval(40, 20, 160, 80, fill="pink")
w.create_text(100, 50, text="FishC")

然后,你想要绘制多边形,可以使用 create_polygon() 方法:

from tkinter import *
import math as m

root = Tk()

w = Canvas(root, width=200, height=100, background="red")
w.pack()

center_x = 100
center_y = 50
r = 50

points = [
    # 左上点
    center_x - int(r * m.sin(2 * m.pi / 5)),
    center_y - int(r * m.cos(2 * m.pi / 5)),
    # 右上点
    center_x + int(r * m.sin(2 * m.pi / 5)),
    center_y - int(r * m.cos(2 * m.pi / 5)),
    # 左下点
    center_x - int(r * m.sin(m.pi / 5)),
    center_y + int(r * m.cos(m.pi / 5)),
    # 顶点
    center_x,
    center_y - r,
    # 右下点
    center_x + int(r * m.sin(m.pi / 5)),
    center_y + int(r * m.cos(m.pi / 5)),
    ]

w.create_polygon(points, outline="green", fill="yellow")

mainloop()

最后,不得不说有点遗憾的是 Tkinter 并没有提供画“点”的方法。不过,我们可以通过绘制一个超小的椭圆形来表示一个“点”。下边例子中,通过响应“鼠标左键按住拖动”事件(<B1-Motion>),我们在鼠标拖动的同时获取鼠标的实时位置(x, y),并绘制一个超小的椭圆来代表一个“点”:

from tkinter import *

root = Tk()

w = Canvas(root, width=400, height=200)
w.pack()

def paint(event):
    x1, y1 = (event.x - 1), (event.y - 1)
    x2, y2 = (event.x + 1), (event.y + 1)
    w.create_oval(x1, y1, x2, y2, fill="red")
    
w.bind("<B1-Motion>", paint)

Label(root, text="按住鼠标左键并移动,开始绘制你的理想蓝图吧......").pack(side=BOTTOM)

mainloop()

一些概念

Canvas 组件支持对象:

  • arc(弧形、弦或扇形)
  • bitmap(内建的位图文件或 XBM 格式的文件)
  • image(BitmapImage 或 PhotoImage 的实例对象)
  • line(线)
  • oval(圆或椭圆形)
  • polygon(多边形)
  • rectangle(矩形)
  • text(文本)
  • window(组件)

其中,弦、扇形、椭圆形、圆形、多边形和矩形这些“封闭式”图形都是由轮廓线和填充颜色组成的,但都可以设置为透明(传入空字符串表示透明)。

坐标系
由于画布可能比窗口大(带有滚动条的 Canvas 组件),因此 Canvas 组件可以选择使用两种坐标系:

  • 窗口坐标系:以窗口的左上角作为坐标原点
  • 画布坐标系:以画布的左上角作为坐标原点

将窗口坐标系转换为画布坐标系,可以使用 canvasx() 或 canvasy() 方法:

def callback(event):
    canvas = event.widget
    x = canvas.canvasx(event.x)
    y = canvas.canvasy(event.y)
    print canvas.find_closest(x, y)

画布对象显示的顺序
Canvas 组件中创建的画布对象都会被列入显示列表中,越接近背景的画布对象位于显示列表的越下方。显示列表决定当两个画布对象重叠的时候是如何覆盖的(默认情况下新创建的会覆盖旧的画布对象的重叠部分,即位于显示列表上方的画布对象将覆盖下方那个)。当然,显示列表中的画布对象可以被重新排序。

指定画布对象
Canvas 组件提供几种方法让你指定画布对象:

  • Item handles
  • Tags
  • ALL
  • CURRENT

Item handles 事实上是一个用于指定某个画布对象的整型数字(也成为画布对象的 ID)。当你在 Canvas 组件上创建一个画布对象的时候,Tkinter 将自动为其指定一个在该 Canvas 组件中独一无二的整型值。然后各种 Canvas 的方法可以通过这个值操纵该画布对象。

Tags 是附在画布对象上的标签,Tags 由普通的非空白字符串组成。一个画布对象可以与多个 Tags 相关联,一个 Tag 也可用于描述多个画布对象。然而,与 Text 组件不同,没有指定画布对象的 Tags 不能进行事件绑定和配置样式。也就是说,Canvas 组件的 Tags 是仅为画布对象所拥有。

Canvas 组件预定义了两个 Tags:ALL 和 CURRENT

ALL(或 "all")表示 Canvas 组件中的所有画布对象

CURRENT(或 "current")表示鼠标指针下的画布对象(如果有的话)

参数说明

Canvas(master=None, options)
 
(class)
master -- 父组件
options -- 组件选项,下方表格详细列举了各个选项的具体含义和用法:





































































































选项

含义
background 指定 Canvas 的背景颜色


bg 跟 background 一样
borderwidth 指定 Canvas 的边框宽度
bd 跟 borderwidth 一样
closeenough 1. 指定一个距离,当鼠标与画布对象的距离小于该值时,鼠标被认为在画布对象上

2. 该选项是一个浮点类型的值
confine 1. 指定 Canvas 组件是否允许滚动超出 scrollregion 选项指定的范围

2. 默认值是 True
cursor 指定当鼠标在 Canvas 上飘过的时候的鼠标样式
height 1. 指定 Canvas 的高度

2. 单位是像素
highlightbackground 指定当 Canvas 没有获得焦点的时候高亮边框的颜色
highlightcolor 指定当 Canvas 获得焦点的时候高亮边框的颜色
highlightthickness 指定高亮边框的宽度
relief 1. 指定 Canvas 的边框样式

2. 默认值是 FLAT

3. 其他可以选择的值是 SUNKEN,RAISED,GROOVE 和 RIDGE
scrollregion 1. 指定 Canvas 可以被滚动的范围

2. 该选项的值是一个 4 元组(x1, y1, x2, y2)表示的矩形
selectbackground 指定当画布对象被选中时的背景色
selectborderwidth 指定当画布对象被选中时的边框宽度(选中边框)
selectforeground 指定当画布对象被选中时的前景色
state 1. 设置 Canvas 的状态:NORMAL 或 DISABLED

2. 默认值是 NORMAL

3. 注意:该值不会影响画布对象的状态
takefocus 1. 指定使用 Tab 键可以将焦点移动到输入框中

2. 默认是开启的,可以将该选项设置为 False 避免焦点在此输入框中
width 1. 指定 Canvas 的宽度

2. 单位是像素
xscrollcommand 1. 与 scrollbar(滚动条)组件相关联(水平方向)

2. 使用方法可以参考:Scrollbar 组件
xscrollincrement 1. 该选项指定 Canvas 水平滚动的“步长”

2. 例如 '3c' 表示 3 厘米,还可以选择的单位有 'i'(英寸),'m'(毫米)和 'p'(DPI,大约是 '1i' 等于 '72p')

3. 默认值是 0,表示可以水平滚动到任意位置
yscrollcommand 1. 与 scrollbar(滚动条)组件相关联(垂直方向)

2. 使用方法可以参考:Scrollbar 组件
yscrollincrement 1. 该选项指定 Canvas 垂直滚动的“步长”

2. 例如 '3c' 表示 3 厘米,还可以选择的单位有 'i'(英寸),'m'(毫米)和 'p'(DPI,大约是 '1i' 等于 '72p')

3. 默认值是 0,表示可以水平滚动到任意位置







方法






addtag(tag, method, args)


-- 添加一个 Tag 到一系列画布对象中


-- 指定添加 Tag 的位置,可以是:"above","all","below","closest","enclosed","overlapping" 或
"withtag"



-- args 是附加参数,请参考下方等同的方法




addtag_above(tag, item)


-- 为显示列表中 item 上方的画布对象添加 Tag


-- 该方法相当于 addtag(tag, "above", item)


-- item 可以是单个画布对象的 ID,也可以是某个 Tag




addtag_all(tag)


-- 为 Canvas 组件中所有的画布对象添加 Tag


-- 该方法相当于 addtag(tag, "all")




addtag_below(tag, item)


-- 为显示列表中 item 下方的画布对象添加 Tag


-- 该方法相当于 addtag(tag, "below", item)


-- item 可以是单个画布对象的 ID,也可以是某个 Tag




addtag_closest(tag, x, y, halo=None, start=None)


-- 将 Tag 添加到与给定坐标(x, y)相临近的画布对象


-- 可选参数 halo 指定一个距离,表示以(x, y)为中心,该距离内的所有画布对象均添加 Tag


-- 可选参数 start 指定一个画布对象,该方法将为低于但最接近该对象的画布对象添加 Tag


-- 该方法相当于 addtag(tag, "closet", x, y, halo=None, start=None)


-- 注1:使用的是画布坐标系


-- 注2:如果同时由几个画布对象与给定坐标(x, y)的距离相同,则为位于显示列表上方的那个画布对象添加 Tag




addtag_enclosed(tag, x1, y1, x2, y2)


-- 为所有坐标在矩形(x1, y1, x2, y2)中的画布对象添加 Tag


-- 该方法相当于 addtag(tag, "enclosed", x1, y1, x2, y2)




addtag_overlapped(tag, x1, y1, x2, y2)


-- 跟 addtag_enclosed() 方法相似,不过该方法范围更广(即使画布对象只有一部分在矩形中也算)


-- 该方法相当于 addtag(tag, "overlapping", x1, y1, x2, y2)




addtag_withtag(tag, item)


-- 为 item 参数指定的画布对象添加 Tag


-- item 参数如果指定一个 Tag,则为所有拥有此 Tag 的画布对象添加新的 Tag


-- item 参数如果指定一个画布对象,那么只为其添加 Tag


-- 该方法相当于 addtag(tag, "withtag", item)


-- item 可以是单个画布对象的 ID,也可以是某个 Tag




bbox(
args)


-- 返回一个四元组(x1, y1, x2, y2)用于描述 args 指定的画布对象所在的矩形范围


-- 如果 args 参数忽略,返回所有的画布对象所在的矩形范围




canvasx(screenx, gridspacing=None)


-- 将窗口坐标系的 X 坐标(screenx)转化为画布坐标系


-- 如果提供 gridspacing 参数,则转换结果将为该参数的整数倍




canvasy(screeny, gridspacing=None)


-- 将窗口坐标系的 Y 坐标(screenx)转化为画布坐标系


-- 如果提供 gridspacing 参数,则转换结果将为该参数的整数倍




coords(*args)


-- 如果仅提供一个参数(画布对象),返回该画布对象的坐标 (x1, y1, x2, y2)


-- 你可以通过 coords(item, x1, y1, x2, y2) 来移动画布对象




create_arc(bbox, options)




-- 根据 bbox (x1, y1, x2, y2) 创建一个扇形(PIESLICE)、弓形(CHORD)或弧形(ARC)


-- 新创建的画布对象位于显示列表的顶端


-- 创建成功后返回该画布对象的 ID


-- 下方表格列举了各个 options 选项的具体含义:




















































































































选项

含义
activedash 当画布对象状态为 ACTIVE 的时候,绘制虚线


activefill 当画布对象状态为 ACTIVE 的时候,填充颜色
activeoutline 当画布对象状态为 ACTIVE 的时候,绘制轮廓线
activeoutlinestipple 当画布对象状态为 ACTIVE 的时候,指定填充轮廓的位图
activestipple 当画布对象状态为 ACTIVE 的时候,指定填充的位图
activewidth 当画布对象状态为 ACTIVE 的时候,指定边框的宽度
dash 1. 指定绘制虚线轮廓

2. 该选项值是一个整数元组,元组中的元素分别代表短线的长度和间隔

3. 例如 (3, 5) 代表 3 个像素的短线和 5 个像素的间隔
dashoffset 1. 指定虚线轮廓开始的偏移位置

2. 例如当 dash=(5, 1, 2, 1),dashoffset=3,则从 2 开始画虚线
disableddash 当画布对象状态为 DISABLE 的时候,绘制虚线
disabledfill 当画布对象状态为 DISABLE 的时候,填充颜色
disabledoutline 当画布对象状态为 DISABLE 的时候,绘制轮廓线
disabledoutlinestipple 当画布对象状态为 DISABLE 的时候,指定填充轮廓的位图
disabledstipple 当画布对象状态为 DISABLE 的时候,指定填充的位图
disabledwidth 当画布对象状态为 DISABLE 的时候,指定边框的宽度
extent 1. 指定跨度(从 start 选项指定的位置开始到结束位置的角度)

2. 默认值是 90.0
fill 1. 指定填充的颜色

2. 空字符串表示透明
offset 1. 指定当点画模式时填充位图的偏移

2. 该选项的值可以是:"x,y", "#x,y", N, NE, E, SE, S, SW, W, NW, CENTER
outline 指定轮廓的颜色
outlineoffset 1. 指定当点画模式绘制轮廓时位图的偏移

2. 该选项的值可以是:"x,y", "#x,y", N, NE, E, SE, S, SW, W, NW, CENTER
outlinestipple 1. 当 outline 选项被设置时,该选项用于指定一个位图来填充边框

2. 默认值是空字符串,表示黑色
start 指定起始位置的偏移角度
state 1. 指定该画布对象的状态

2. 可以是 NORMAL,DISABLED(不可用,不响应事件)和 HIDDEN(隐藏)

3. 默认值是 NORMAL
stipple 1. 指定一个位图用于填充

2. 默认值是空字符串,表示实心


style 1. 指定该方法创建的是扇形(PIESLICE)、弓形(CHORD)还是弧形(ARC)

2. 默认创建的是扇形


tags 为创建的画布对象添加标签
width 指定边框的宽度





create_bitmap(position, options)





-- 在 position 指定的位置(x, y)创建一个位图对象


-- 创建成功后返回该位图对象的 ID


-- 下方表格列举了各个 options 选项的具体含义:




























































选项

含义
activebackground 指定当位图对象状态为 ACTIVE 时候的背景颜色


activebitmap 指定当位图对象状态为 ACTIVE 时候填充的位图
activeforeground 指定当位图对象状态为 ACTIVE 时候的前景颜色
anchor 1. 指定位图在 position 参数的相对位置

2. N, NE, E, SE, S, SW, W, NW, 或 CENTER 来定位(EWSN代表东西南北,上北下南左西右东)

3. 默认值是 CENTER
background 1. 指定背景颜色

2. 即在位图中值为 0 的点的颜色

2. 空字符串表示透明
bitmap 指定显示的位图
disabledbackground 指定当位图对象状态为 DISABLED 时候的背景颜色


disabledbitmap 指定当位图对象状态为 DISABLED 时候填充的位图
disabledforeground 指定当位图对象状态为 DISABLED 时候的前景颜色
foreground 1. 指定前景颜色

2. 即在位图中值为 1 的点的颜色


state 1. 指定该画布对象的状态

2. 可以是 NORMAL,DISABLED(不可用,不响应事件)和 HIDDEN(隐藏)

3. 默认值是 NORMAL
tags 为创建的位图对象添加标签





create_image(position, options)




-- 在 position 指定的位置(x, y)创建一个图片对象


-- 创建成功后返回该图片对象的 ID


-- 下方表格列举了各个 options 选项的具体含义:




































选项

含义
activeimage 指定当图片对象状态为 ACTIVE 时候显示的图片
anchor 1. 指定位图在 position 参数的相对位置

2. N, NE, E, SE, S, SW, W, NW, 或 CENTER 来定位(EWSN代表东西南北,上北下南左西右东)

3. 默认值是 CENTER
image 指定要显示的图片
disabledimage 指定当图片对象状态为 DISABLED 时候显示的图片
state 1. 指定该图片对象的状态

2. 可以是 NORMAL,DISABLED(不可用,不响应事件)和 HIDDEN(隐藏)

3. 默认值是 NORMAL
tags 为创建的图片对象添加标签





create_line(coords, options)





-- 根据 coords 给定的坐标创建一条或多条线段


-- 如果给定的坐标多余两个点,则会首尾相连变成一条折线


-- 创建成功后返回该画布对象的 ID


-- 下方表格列举了各个 options 选项的具体含义:




































































































选项

含义
activedash 当画布对象状态为 ACTIVE 的时候,绘制虚线


activefill 当画布对象状态为 ACTIVE 的时候,填充颜色
activestipple 当画布对象状态为 ACTIVE 的时候,指定填充的位图
activewidth 当画布对象状态为 ACTIVE 的时候,指定边框的宽度
arrow 1. 默认线段是不带箭头的

2. 你可以通过设置该选项添加箭头到线段中

3. FIRST 表示添加箭头到线段开始的位置

4. LAST 表示添加箭头到线段结束的位置

5. BOTH 表示两端均添加箭头
arrowshape 1. 用一个三元组 (a, b, c) 来指定箭头的形状

2. a, b, c 分别代表箭头的三条边的长

3. 默认值是 (8, 10, 3)
capstyle 1. 指定线段两端的样式

2. 该选项的值可以是:

-- BUTT(线段的两段平切于起点和终点)

-- PROJECTING(线段的两段在起点和终点的位置分别延长一半 width 选项设置的长度)

-- ROUND(线段的两段在起点和终点的位置分别延长一半 width 选项设置的长度并以圆角绘制)

3. 默认值是 BUTT

4. 如果还不理解请看小甲鱼下方图解你就秒懂了~
dash 1. 绘制虚线

2. 该选项值是一个整数元组,元组中的元素分别代表短线的长度和间隔

3. 例如 (3, 5) 代表 3 个像素的短线和 5 个像素的间隔
dashoffset 1. 指定虚线开始的偏移位置

2. 例如当 dash=(5, 1, 2, 1),dashoffset=3,则从 2 开始画虚线
disableddash 当画布对象状态为 DISABLE 的时候,绘制虚线
disabledfill 当画布对象状态为 DISABLE 的时候,填充颜色
disabledstipple 当画布对象状态为 DISABLE 的时候,指定填充的位图
disabledwidth 当画布对象状态为 DISABLE 的时候,指定边框的宽度
fill 1. 指定填充的颜色

2. 空字符串表示透明
joinstyle 1. 指定当绘制两个相邻线段之间接口的样式

2. 该选项的值可以是:

-- ROUND(以连接点为圆心,1/2 width 选项设置的长度为半径绘制圆角)

-- BEVEL(在连接点处对两线段的夹角平切)

-- MITER(沿着两线段的夹角延伸至一个点)

3. 默认值是 ROUND

4. 如果还不理解请看上方 create_line() 函数 joinstyle 选项的图解你就秒懂了~
offset 1. 指定当点画模式时填充位图的偏移

2. 该选项的值可以是:"x,y", "#x,y", N, NE, E, SE, S, SW, W, NW, CENTER
smooth 1. 该选项的值为 True 时,将绘制贝塞尔样条曲线代替线段(资料:戳我

2. 默认值为 False
splinesteps 1. 当绘制贝塞尔样条曲线的时候,该选项指定由多少条折线来构成曲线

2. 默认值是 12

3. 只有当 smooth 选项为 True 时该选项才能生效
state 1. 指定该画布对象的状态

2. 可以是 NORMAL,DISABLED(不可用,不响应事件)和 HIDDEN(隐藏)

3. 默认值是 NORMAL
stipple 1. 指定一个位图用于填充

2. 默认值是空字符串,表示实心


tags 为创建的画布对象添加标签
width 指定边框的宽度



有关 capstyle 和 joinstyle 选项的图解:





<img id="aimg_35290" aid="35290" src="https://xxx.ilovefishc.com/forum/201505/03/160926ky7yr8xnnsp4p7nn.png"
zoomfile="https://xxx.ilovefishc.com/forum/201505/03/160926ky7yr8xnnsp4p7nn.png"
file="https://xxx.ilovefishc.com/forum/201505/03/160926ky7yr8xnnsp4p7nn.png"
class="zoom" onclick="zoom(this, this.src, 0, 0, 0)" width="450" inpost="1" onmouseover="showMenu({'ctrlid':this.id,'pos':'12'})"
lazyloaded="true" _load="1">
 








create_oval(bbox, options)




-- 根据限定矩形 bbox 绘制一个椭圆


-- 新创建的画布对象位于显示列表的顶端


-- 创建成功后返回该画布对象的 ID


-- 下方表格列举了各个 options 选项的具体含义:








































































































选项

含义
activedash 当画布对象状态为 ACTIVE 的时候,绘制虚线


activefill 当画布对象状态为 ACTIVE 的时候,填充颜色
activeoutline 当画布对象状态为 ACTIVE 的时候,绘制轮廓线
activeoutlinestipple 当画布对象状态为 ACTIVE 的时候,指定填充轮廓的位图
activestipple 当画布对象状态为 ACTIVE 的时候,指定填充的位图
activewidth 当画布对象状态为 ACTIVE 的时候,指定边框的宽度
dash 1. 指定绘制虚线轮廓

2. 该选项值是一个整数元组,元组中的元素分别代表短线的长度和间隔

3. 例如 (3, 5) 代表 3 个像素的短线和 5 个像素的间隔
dashoffset 1. 指定虚线轮廓开始的偏移位置

2. 例如当 dash=(5, 1, 2, 1),dashoffset=3,则从 2 开始画虚线
disableddash 当画布对象状态为 DISABLE 的时候,绘制虚线
disabledfill 当画布对象状态为 DISABLE 的时候,填充颜色
disabledoutline 当画布对象状态为 DISABLE 的时候,绘制轮廓线
disabledoutlinestipple 当画布对象状态为 DISABLE 的时候,指定填充轮廓的位图
disabledstipple 当画布对象状态为 DISABLE 的时候,指定填充的位图
disabledwidth 当画布对象状态为 DISABLE 的时候,指定边框的宽度
fill 1. 指定填充的颜色

2. 空字符串表示透明
offset 1. 指定当点画模式时填充位图的偏移

2. 该选项的值可以是:"x,y", "#x,y", N, NE, E, SE, S, SW, W, NW, CENTER
outline 指定轮廓的颜色
outlineoffset 1. 指定当点画模式绘制轮廓时位图的偏移

2. 该选项的值可以是:"x,y", "#x,y", N, NE, E, SE, S, SW, W, NW, CENTER
outlinestipple 1. 当 outline 选项被设置时,该选项用于指定一个位图来填充边框

2. 默认值是空字符串,表示黑色
state 1. 指定该画布对象的状态

2. 可以是 NORMAL,DISABLED(不可用,不响应事件)和 HIDDEN(隐藏)

3. 默认值是 NORMAL
stipple 1. 指定一个位图用于填充

2. 默认值是空字符串,表示实心


tags 为创建的画布对象添加标签
width 指定边框的宽度





create_polygon(coords, options)

-- 根据 coords 给定的坐标绘制一个多边形


-- 新创建的画布对象位于显示列表的顶端


-- 创建成功后返回该画布对象的 ID


-- 下方表格列举了各个 options 选项的具体含义:




















































































































选项

含义
activedash 当画布对象状态为 ACTIVE 的时候,绘制虚线


activefill 当画布对象状态为 ACTIVE 的时候,填充颜色
activeoutline 当画布对象状态为 ACTIVE 的时候,绘制轮廓线
activeoutlinestipple 当画布对象状态为 ACTIVE 的时候,指定填充轮廓的位图
activestipple 当画布对象状态为 ACTIVE 的时候,指定填充的位图
activewidth 当画布对象状态为 ACTIVE 的时候,指定边框的宽度
dash 1. 指定绘制虚线轮廓

2. 该选项值是一个整数元组,元组中的元素分别代表短线的长度和间隔

3. 例如 (3, 5) 代表 3 个像素的短线和 5 个像素的间隔
dashoffset 1. 指定虚线轮廓开始的偏移位置

2. 例如当 dash=(5, 1, 2, 1),dashoffset=3,则从 2 开始画虚线
disableddash 当画布对象状态为 DISABLE 的时候,绘制虚线
disabledfill 当画布对象状态为 DISABLE 的时候,填充颜色
disabledoutline 当画布对象状态为 DISABLE 的时候,绘制轮廓线
disabledoutlinestipple 当画布对象状态为 DISABLE 的时候,指定填充轮廓的位图
disabledstipple 当画布对象状态为 DISABLE 的时候,指定填充的位图
disabledwidth 当画布对象状态为 DISABLE 的时候,指定边框的宽度
fill 1. 指定填充的颜色

2. 空字符串表示透明
joinstyle 1. 指定当绘制两个相邻线段之间接口的样式

2. 该选项的值可以是:

-- ROUND(以连接点为圆心,1/2 width 选项设置的长度为半径绘制圆角)

-- BEVEL(在连接点处对两线段的夹角平切)

-- MITER(沿着两线段的夹角延伸至一个点)

3. 默认值是 ROUND

4. 如果还不理解请看小甲鱼下方图解你就秒懂了~
offset 1. 指定当点画模式时填充位图的偏移

2. 该选项的值可以是:"x,y", "#x,y", N, NE, E, SE, S, SW, W, NW, CENTER
outline 指定轮廓的颜色
outlineoffset 1. 指定当点画模式绘制轮廓时位图的偏移

2. 该选项的值可以是:"x,y", "#x,y", N, NE, E, SE, S, SW, W, NW, CENTER
outlinestipple 1. 当 outline 选项被设置时,该选项用于指定一个位图来填充边框

2. 默认值是空字符串,表示黑色
smooth 1. 该选项的值为 True 时,将绘制贝塞尔样条曲线代替线段(资料:戳我

2. 默认值为 False
splinesteps 1. 当绘制贝塞尔样条曲线的时候,该选项指定由多少条折线来构成曲线

2. 默认值是 12

3. 只有当 smooth 选项为 True 时该选项才能生效
state 1. 指定该画布对象的状态

2. 可以是 NORMAL,DISABLED(不可用,不响应事件)和 HIDDEN(隐藏)

3. 默认值是 NORMAL
stipple 1. 指定一个位图用于填充

2. 默认值是空字符串,表示实心


tags 为创建的画布对象添加标签
width 指定边框的宽度





create_rectangle(bbox, options)
-- 根据限定矩形 bbox 绘制一个矩形


-- 新创建的画布对象位于显示列表的顶端


-- 创建成功后返回该画布对象的 ID


-- 下方表格列举了各个 options 选项的具体含义:




































































































选项

含义
activedash 当画布对象状态为 ACTIVE 的时候,绘制虚线


activefill 当画布对象状态为 ACTIVE 的时候,填充颜色
activeoutline 当画布对象状态为 ACTIVE 的时候,绘制轮廓线
activeoutlinestipple 当画布对象状态为 ACTIVE 的时候,指定填充轮廓的位图
activestipple 当画布对象状态为 ACTIVE 的时候,指定填充的位图
activewidth 当画布对象状态为 ACTIVE 的时候,指定边框的宽度
dash 1. 指定绘制虚线轮廓

2. 该选项值是一个整数元组,元组中的元素分别代表短线的长度和间隔

3. 例如 (3, 5) 代表 3 个像素的短线和 5 个像素的间隔
dashoffset 1. 指定虚线轮廓开始的偏移位置

2. 例如当 dash=(5, 1, 2, 1),dashoffset=3,则从 2 开始画虚线
disableddash 当画布对象状态为 DISABLE 的时候,绘制虚线
disabledfill 当画布对象状态为 DISABLE 的时候,填充颜色
disabledoutline 当画布对象状态为 DISABLE 的时候,绘制轮廓线
disabledoutlinestipple 当画布对象状态为 DISABLE 的时候,指定填充轮廓的位图
disabledstipple 当画布对象状态为 DISABLE 的时候,指定填充的位图
disabledwidth 当画布对象状态为 DISABLE 的时候,指定边框的宽度
fill 1. 指定填充的颜色

2. 空字符串表示透明
offset 1. 指定当点画模式时填充位图的偏移

2. 该选项的值可以是:"x,y", "#x,y", N, NE, E, SE, S, SW, W, NW, CENTER
outline 指定轮廓的颜色
outlineoffset 1. 指定当点画模式绘制轮廓时位图的偏移

2. 该选项的值可以是:"x,y", "#x,y", N, NE, E, SE, S, SW, W, NW, CENTER
outlinestipple 1. 当 outline 选项被设置时,该选项用于指定一个位图来填充边框

2. 默认值是空字符串,表示黑色
state 1. 指定该画布对象的状态

2. 可以是 NORMAL,DISABLED(不可用,不响应事件)和 HIDDEN(隐藏)

3. 默认值是 NORMAL
stipple 1. 指定一个位图用于填充

2. 默认值是空字符串,表示实心
tags 为创建的画布对象添加标签
width 指定边框的宽度





create_text(position, options)

-- 在 position 指定的位置(x, y)创建一个文本对象


-- 创建成功后返回该文本对象的 ID


-- 下方表格列举了各个 options 选项的具体含义:
































































选项

含义
activefill 指定当文本对象状态为 ACTIVE 时候文本的颜色


activestipple 指定当文本对象状态为 ACTIVE 时候文本填充的位图
anchor 1. 指定文本在 position 参数的相对位置

2. N, NE, E, SE, S, SW, W, NW, 或 CENTER 来定位(EWSN代表东西南北,上北下南左西右东)

3. 默认值是 CENTER
disabledfill 指定当文本对象状态为 DISABLED 时候文本的颜色
disabledstipple 指定当文本对象状态为 ACTIVE 时候文本填充的位图
fill 指定文本的颜色
font 指定文本的字体、尺寸等信息


justify 1. 指定对于多行文本的对齐方式

2. 该选项可以使用的值有:LEFT(默认)、CENTER 和 RIGHT
offset 1. 指定当点画模式时填充位图的偏移

2. 该选项的值可以是:"x,y", "#x,y", N, NE, E, SE, S, SW, W, NW, CENTER
state 1. 指定该画布对象的状态

2. 可以是 NORMAL,DISABLED(不可用,不响应事件)和 HIDDEN(隐藏)

3. 默认值是 NORMAL
stipple 1. 指定一个位图用于填充

2. 默认值是空字符串,表示实心
tags 为创建的位图对象添加标签
text 指定该文本对象将要显示的文本内容


width 1. 如果指定该选项,则文本会在该宽度处自动断行

2. 如果不指定该选项,文本对象的宽度等于文本最长行的长度





create_window(position, options)
-- 在 position 指定的位置(x, y)创建一个窗口组件


-- 创建成功后返回该窗口组件的 ID


-- 下方表格列举了各个 options 选项的具体含义:
































选项

含义
anchor 1. 指定位图在 position 参数的相对位置

2. N, NE, E, SE, S, SW, W, NW, 或 CENTER 来定位(EWSN代表东西南北,上北下南左西右东)

3. 默认值是 CENTER
height 指定窗口组件的高度
state 1. 指定该图片的状态

2. 可以是 NORMAL,DISABLED(不可用,不响应事件)和 HIDDEN(隐藏)

3. 默认值是 NORMAL
tags 为创建的图片对象添加标签
width 指定窗口组件的宽度
window 指定一个窗口组件





dchars(item, from, to=None)


-- 删除 item 中从 from 到 to(包含)参数中的字符串


-- item 可以是单个画布对象的 ID,也可以是某个 Tag




delete(item)


-- 删除 item 参数指定的画布对象


-- 如果不存在 item 指定的画布对象,并不会产生错误


-- item 可以是单个画布对象的 ID,也可以是某个 Tag




dtag(item, tag=None)


-- 在 item 参数指定的画布对象中删除指定的 tag


-- 如果 tag 参数被忽略,则删除指定画布对象所有的 tags


-- 如果不存在 item 指定的画布对象,并不会产生错误


-- item 可以是单个画布对象的 ID,也可以是某个 Tag




find_above(item)


-- 返回在 item 参数指定的画布对象之上的 ID


-- 如果有多个画布对象符合要求,那么返回最顶端的那个


-- 如果 item 参数指定的是最顶层的画布对象,那么返回一个空元组


-- item 可以是单个画布对象的 ID,也可以是某个 Tag




find_all()


-- 返回 Canvas 组件上所有的画布对象


-- 返回格式是一个元组,包含所有画布对象的 ID


-- 按照显示列表的顺序返回


-- 该方法相当于 find_withtag(ALL)




find_below(item)


-- 返回在 item 参数指定的画布对象之下的 ID


-- 如果有多个画布对象符合要求,那么返回最底端的那个


-- 如果 item 参数指定的是最底层的画布对象,那么返回一个空元组


-- item 可以是单个画布对象的 ID,也可以是某个 Tag




find_closest(x, y, halo=None, start=None)


-- 返回一个元组,包含所有靠近点(x, y)的画布对象的 ID


-- 如果没有符合的画布对象,则返回一个空元组


-- 可选参数 halo 用于增加点(x, y)的辐射范围


-- 可选参数 start 指定一个画布对象,该方法仅返回在显示列表中低于但最接近的一个 ID


-- 注意,点(x, y)的坐标是采用画布坐标系来表示




find_enclosed(x1, y1, x2, y2)


-- 返回完全包含在限定矩形内所有画布对象的 ID




find_overlapping(x1, y1, x2, y2)


-- 返回所有与限定矩形有重叠的画布对象的 ID(让然也包含在限定矩形内的画布对象)




find_withtag(item)


-- 返回 item 指定的所有画布对象的 ID


-- item 可以是单个画布对象的 ID,也可以是某个 Tag




focus(item=None)


-- 将焦点移动到指定的 item


-- 如果有多个画布对象匹配,则将焦点移动到显示列表中第一个可以接受光标输入的画布对象


-- item 可以是单个画布对象的 ID,也可以是某个 Tag




gettags(item)


-- 返回与 item 相关联的所有 Tags


-- item 可以是单个画布对象的 ID,也可以是某个 Tag




icursor(item, index)


-- 将光标移动到 item 指定的画布对象


-- 这里要求 item 指定的画布对象支持文本输入和转移焦点


-- item 可以是单个画布对象的 ID,也可以是某个 Tag




index(item, index)


-- 返回 index 在指定 item 中的位置(沿用 Python 的惯例:0 表示第一)


-- index 参数可以是:INSERT(当前光标的位置),END(最后一个字符的位置),SEL_FIRST(当前选中文本的起始位置),SEL_LAST(当前选中文本的结束位置),还可以使用格式为
"@x, y"(x 和 y 是画布坐标系)来获得与此坐标最接近的位置



-- item 可以是单个画布对象的 ID,也可以是某个 Tag




insert(item, index, text)


-- 在允许进行文本编辑的画布对象的指定位置插入文本


-- index 参数可以是:INSERT(当前光标的位置),END(最后一个字符的位置),SEL_FIRST(当前选中文本的起始位置),SEL_LAST(当前选中文本的结束位置),还可以使用格式为
"@x, y"(x 和 y 是画布坐标系)来获得与此坐标最接近的位置



-- item 可以是单个画布对象的 ID,也可以是某个 Tag




itemcget(item, option)


-- 获得指定 item 的选项的当前值


-- item 可以是单个画布对象的 ID,也可以是某个 Tag




itemconfig(item, options)



-- 修改指定 item 的选项的当前值


-- item 可以是单个画布对象的 ID,也可以是某个 Tag




itemconfigure(item, options)


-- 跟 itemconfig() 一样




lift(item, options)



-- 将指定画布对象移动到显示列表的顶部


-- item 可以是单个画布对象的 ID,也可以是某个 Tag


-- 跟 tag_raise 一样




lower(item, options)


-- 将指定画布对象移动到显示列表的底部


-- item 可以是单个画布对象的 ID,也可以是某个 Tag


-- 跟 tag_lower 一样




move(item, dx, dy)


-- 将 item 移动到新位置(x, y)


-- item 可以是单个画布对象的 ID,也可以是某个 Tag




postscript(options)



-- 将 Canvas 的当前内容封装成 PostScript 格式(什么是 PostScript
)表示


-- 下方表格列举了各个 options 选项的具体含义:




































选项

含义
colormode 该选项的值可以是:'color'(颜色输出),'gray'(灰阶输出)和 'mono'(黑白输出)
file 1. 该选项指定一个文件,将 PostScript 写入该文件中

2. 如果忽略该选项,PostScript 将以字符串的形式返回
height 1. 指定要打印的 Canvas 组件的高度

2. 默认值是 Canvas 组件的整体高度
rotate 1. 如果该选项的值为 False,该页面将以纵向呈现

2. 如果该选项的值为 True,该页面将以横向呈现
x 开始打印的最左边位置,以画布坐标系表示
y 开始打印的最顶端位置,以画布坐标系表示
width 1. 指定要打印的 Canvas 组件的宽度

2. 默认值是 Canvas 组件的整体宽度





scale(item, xOrigin, yOrigin, xScale, yScale)


-- 缩放 item 指定的画布对象


-- xOrigin 和 yOrigin 决定要缩放的位置


-- xScale 和 yScale 决定缩放的比例


-- item 可以是单个画布对象的 ID,也可以是某个 Tag


-- 注意:该方法无法缩放 Text 画布对象




scan_dragto(x, y)


-- 见下方 scan_mark(x, y)




scan_mark(x, y)


-- 使用这种方式来实现 Canvas 内容的滚动


-- 需要将鼠标按钮事件及当前鼠标位置绑定到 scan_mark(x, y) 方法,然后再将 <motion> 事件及当前鼠标位置绑定到 scan_dragto(x,

y) 方法,就可以实现 Canvas 在当前位置和 sacn_mack(x, y) 指定的位置 (x, y) 之间滚动




select_adjust(item, index)


-- 调整选中范围,使得给定的 index 参数指定的位置在范围内


-- item 可以是单个画布对象的 ID,也可以是某个 Tag




select_clear()


-- 取消 Canvas 组件中所有选中的范围




select_from(item, index)


-- 调整选中范围的起始位置为 index 参数指定的位置


-- item 可以是单个画布对象的 ID,也可以是某个 Tag




select_item()


-- 范围在 Canvas 组件中当前文本的选中范围


-- 如果没有则返回 None




select_to(item, index)


-- 调整选中范围的结束位置为 index 参数指定的位置




tag_bind(item, event=None, callback, add=None)


-- 为 Canvas 组件上的画布对象绑定方法


-- event 参数是绑定的事件名称,callback 是与之关联的方法


-- item 可以是单个画布对象的 ID,也可以是某个 Tag


-- 注意:与绑定事件关联的是画布对象,而不是 Tag




tag_lower(item)


-- 将一个或多个画布对象移至底部


-- 如果是多个画布对象,将它们都移至底部并保留原有顺序


-- item 可以是单个画布对象的 ID,也可以是某个 Tag


-- 注意:该方法对窗口组件无效,请使用 lower 代替




tag_raise(item)


-- 将一个或多个画布对象移至顶部


-- 如果是多个画布对象,将它们都移至顶部并保留原有顺序


-- item 可以是单个画布对象的 ID,也可以是某个 Tag


-- 注意:该方法对窗口组件无效,请使用 lift 代替




tag_unbind(item, event, callback=None)


-- 解除与 item 绑定的事件


-- item 可以是单个画布对象的 ID,也可以是某个 Tag




tkraise(item, **options)


-- 将指定画布对象移动到显示列表的顶部


-- item 可以是单个画布对象的 ID,也可以是某个 Tag


-- 跟 tag_raise 一样




type(item)


-- 返回指定画布对象的类型


-- 返回值可以是:"arc", "bitmap", "image", "line", "oval", "polygon", "rectangle", "text",
或 "window"





xview(args)


-- 该方法用于在水平方向上滚动 Canvas 组件的内容,一般通过绑定 Scollbar 组件的 command 选项来实现(具体操作参考:Scrollbar


-- 如果第一个参数是 MOVETO,则第二个参数表示滚动到指定的位置:0.0 表示最左端,1.0 表示最右端


-- 如果第一个参数是 SCROLL,则第二个参数表示滚动的数量,第三个参数表示滚动的单位(可以是 UNITS 或 PAGES),例如:xview(SCROLL,
3, UNITS) 表示向右滚动三行





xview_moveto(fraction)


-- 跟 xview(MOVETO, fraction) 一样




xview_scroll(number, what)


-- 跟 xview(SCROLL, number, what) 一样




yview(
args)


-- 该方法用于在垂直方向上滚动 Canvas 组件的内容,一般通过绑定 Scollbar 组件的 command 选项来实现(具体操作参考:Scrollbar


-- 如果第一个参数是 MOVETO,则第二个参数表示滚动到指定的位置:0.0 表示最顶端,1.0 表示最底端


-- 如果第一个参数是 SCROLL,则第二个参数表示滚动的数量,第三个参数表示滚动的单位(可以是 UNITS 或 PAGES),例如:yview(SCROLL,
3, PAGES) 表示向下滚动三页





yview_moveto(fraction)


-- 跟 yview(MOVETO, fraction) 一样




yview_scroll(number, what)


-- 跟 yview(SCROLL, number, what) 一样


Message 消息框

功能

Message(消息)组件是 Label 组件的变体,用于显示多行文本消息。Message 组件能够自动换行,并调整文本的尺寸使其适应给定的尺寸。

Message 组件用于显示简单的文本消息,通常你可以使用 Label 来代替。如果你希望使用多种字体来显示文本,那么应该使用 Text 组件。

用法

创建一个 Message 组件,所有你要做的事就是指定要显示的文本内容。在必要的时候,该组件会自动换行,请随意感受下:

from tkinter import *

root = Tk()

w1 = Message(root, text="这是一则消息", width=100)
w1.pack()

w2 = Message(root, text="这是一则骇人听闻的长长长长长消息!", width=100)
w2.pack()

mainloop()

参数说明

Message(master=None, options)(class)
master -- 父组件
options -- 组件选项,下方表格详细列举了各个选项的具体含义和用法:





























































































选项

含义
anchor 1. 控制文本消息的显示位置

2. N, NE, E, SE, S, SW, W, NW, 或 CENTER 来定位(EWSN 代表东西南北,上北下南左西右东)

3. 默认值是 CENTER
aspect 1. 设置高宽比,即宽度/高度的百分比的值

2. 默认值是 150(宽度比高度大 50%)

3. 注意:如果设置了 width 选项的值,该选项将被忽略
background 1. 设置背景颜色

2. 默认值由系统指定
bg 跟 background 一样
borderwidth 1. 指定边框宽度

2. 默认值由系统指定,通常是 1 或 2 像素
bd 跟 borderwidth 一样
cursor 1. 指定当鼠标在 Message 上飘过的时候的鼠标样式

2. 默认值由系统指定
font 1. 指定 Message 中文本的字体

2. 只能指定一种字体

3. 默认值由系统指定
foreground 1. 设置 Message 的文本的颜色

2. 默认值由系统指定
fg 跟 foreground 一样
highlightbackground 1. 指定当 Message 没有获得焦点的时候高亮边框的颜色

2. 默认值由系统指定,通常是标准背景颜色
highlightcolor 1. 指定当 Message 获得焦点的时候高亮边框的颜色

2. 默认值由系统指定
highlightthickness 1. 指定高亮边框的宽度

2. 默认值是 0(不带高亮边框)
justify 1. 定义如何对齐多行文本

2. 使用 LEFT,RIGHT 或 CENTER

3. 注意,文本的位置取决于 anchor 选项

4. 默认值是 CENTER
padx 1. 指定水平方向上的额外间距(内容和边框间)

2. 单位是像素
pady 1. 指定垂直方向上的额外间距(内容和边框间)

2. 单位是像素
relief 1. 指定边框样式

2. 默认值是 FLAT

3. 另外你还可以设置 SUNKEN,RAISED,GROOVE 或 RIDGE
takefocus 1. 如果是 True,该组件接受输入焦点

2. 默认值是 False
text 1. 指定 Label 显示的文本

2. 为了达到指定的高宽比(aspect 选项指定),文本内容将自动进行换行


textvariable 1. Message 显示 Tkinter 变量(通常是一个 StringVar 变量)的内容

2. 如果变量被修改,Message 的文本会自动更新
width 1. 设置 Message 的宽度

2. 单位是文本单元

3. 如果忽略该选项,将根据 aspect 选项设置的高宽比来设置合适的宽度



Spinbox 选择框

功能

Spinbox 组件(Tk8.4 新增)是 Entry 组件的变体,用于从一些固定的值中选取一个。

Spinbox 组件通常用于在限定数字中选取的情况下代替普通的 Entry 组件。

注意:Spinbox 组件仅支持 Python2.3 和 Tk8.4 以上版本。

用法

Spinbox 组件跟 Entry 组件用法非常相似,主要区别是使用 Spinbox 组件,你可以通过范围或者元组指定允许用户输入的内容。

from tkinter import *

root = Tk()

w = Spinbox(root, from_=0, to=10)
w.pack()

mainloop()

你还可以通过元组指定允许输入的值:

from tkinter import *

root = Tk()

w = Spinbox(root, values= ("小甲鱼", "~风介~", "wei_Y", "戴宇轩"))
w.pack()

mainloop()

参数说明

Spinbox(master=None, options)(class)
master -- 父组件
options -- 组件选项,下方表格详细列举了各个选项的具体含义和用法:









































































































































































































选项

含义
activebackground 设置当 Spinbox 处于 ACTIVE 状态下的背景颜色
background 1. 设置背景颜色

2. 默认值由系统指定
bg 跟 background 一样
borderwidth 1. 设置边框宽度

2. 默认值是 1 或 2 像素
buttonbackground 设置调节箭头的背景颜色
buttoncursor 指定当鼠标在调节箭头上方的鼠标样式
buttondownrelief 1. 指定向下调节箭头的样式

2. 默认值是 RAISED

3. 还可以设置为 FLAT,SUNKEN,GROOVE 和 RIDGE
buttonup 1. 指定向上调节箭头的样式
 

2. 默认值是 RAISED

3. 还可以设置为 FLAT,SUNKEN,GROOVE 和 RIDGE
command 1. 指定一个函数,当用户点击调节箭头的时候将自动调用该函数

2. 注意:当用户直接在输入框中输入数据时并不会触发该函数
cursor 1. 指定当鼠标在 Spinbox 上飘过的时候的鼠标样式

2. 默认值由系统指定
disabledbackground 设置当 Spinbox 处于 DISABLED 状态下的背景颜色
disabledforeground 设置当 Spinbox 处于 DISABLED 状态下的前景颜色
exportselection 1. 指定选中的文本是否可以被复制到剪贴板

2. 默认值是 True

3. 可以修改为 False 表示不允许复制文本
font 1. 指定 Spinbox 中文本的字体

2. 默认值由系统指定
foreground 1. 设置前景(文本)颜色

2. 默认值由系统指定
fg 跟 foreground 一样
format 1. 使用该选项设置选择数值的样式(from_ 和 to 指定范围,用户自行输入的不算)

2. 例如 format='%10.4f' 表示显示的数值占 10 位,小数点后保留 4 位
from_ 1. 该选项和 to 选项共同指定一个范围的数值

2. increment 选项设置每次点击调节箭头递增(递减)的精度
highlightbackground 1. 指定当 Spinbox 没有获得焦点的时候高亮边框的颜色

2. 默认值由系统指定
highlightcolor 1. 指定当 Spinbox 获得焦点的时候高亮边框的颜色

2. 默认值由系统指定
highlightthickness 指定高亮边框的宽度
increment 1. 该选项指定当用户每次点击调节箭头的时候递增(递减)的精度

2. 例如 from_=1, to=10, increment=0.5,那么每次用户点击调节箭头的时候,输入框中的数字递增(递减)0.5
insertbackground 指定输入光标的颜色
insertborderwidth 1. 指定输入光标的边框宽度

2. 如果被设置为非 0 值,光标样式会被设置为 RAISED

3. 小甲鱼温馨提示:将 insertwidth 设置大一点才能看到效果哦
insertofftime 1. 该选项控制光标的闪烁频率(灭)

2. 单位是毫秒
insertontime 1. 该选项控制光标的闪烁频率(亮)

2. 单位是毫秒
insertwidth 1. 指定光标的宽度

2. 默认值是 1 或 2 像素
invalidcommand 1. 指定当输入框输入的内容“非法”时调用的函数

2. 也就是指定当 validateCommand 选项指定的函数返回 False 时的函数

3. 详见
 Entry 组件最下方小甲鱼关于验证详解
invcmd 跟 invalidcommand 一样
justify 1. 定义如何对齐输入框中的文本

2. 使用 LEFT,RIGHT 或 CENTER

3. 默认值是 LEFT
readonlybackground 设置当 Spinbox 处于 "readonly" 状态下的背景颜色
relief 1. 指定边框样式

2. 默认值是 SUNKEN

3. 其他可以选择的值是 FLAT,RAISED,GROOVE 和 RIDGE
repeatdelay 1. 该选项指定鼠标左键点击滚动条凹槽的响应时间

2. 默认值是 400(毫秒)
repeatinterval 1. 该选项指定鼠标左键紧按滚动条凹槽时的响应间隔

2. 默认值是 100(毫秒)
selectbackground 1. 指定输入框的文本被选中时的背景颜色

2. 默认值由系统指定
selectborderwidth 1. 指定输入框的文本被选中时的边框宽度(选中边框)

2. 默认值由系统指定
selectforeground 1. 指定输入框的文本被选中时的字体颜色

2. 默认值由系统指定
state 1. Spinbox 组件可以设置的状态:NORMAL,DISABLED 或 "readonly"(注意,这个是字符串。它跟 DISABLED 相似,但它支持选中和拷贝,只是不能修改,而
DISABLED 是完全禁止)

2. 默认值是 NORMAL

3. 注意,如果此选项设置为 DISABLED 或 "readonly",那么调用 insert() 和 delete() 方法都会被忽略
takefocus 1. 指定使用 Tab 键可以将焦点移动到输入框中

2. 默认是开启的,可以将该选项设置为 False 避免焦点在此输入框中
textvariable 1. 指定一个与输入框的内容相关联的 Tkinter 变量(通常是 StringVar)

2. 当输入框的内容发生改变时,该变量的值也会相应发生改变
to 1. 该选项和 from_ 选项共同指定一个范围的数值

2. increment 选项设置每次点击调节箭头递增(递减)的精度
validate 1. 该选项设置是否启用内容验证
 

2. 详见
 Entry 组件最下方小甲鱼关于验证详解
validatecommand 1. 该选项指定一个验证函数,用于验证输入框内容是否合法

2. 验证函数需要返回 True 或 False 表示验证结果

3. 注意,该选项只有当 validate 的值非 "none" 时才有效

3. 详见本内容最下方小甲鱼关于验证详解
vcmd 跟 validatecommand 一样
values 1. 提供两个方法限定用户输入的内容,一种是通过 from_ 和 to 选项设置范围,另一种则是将可选值以元组的形式赋值给 values 选项

2. 例如 values= ("小甲鱼", "~风介~", "wei_Y", "戴宇轩") 则允许用户在这 4 个字符串中选择
width 1. 设置输入框的宽度,以字符为单位

2. 默认值是 20

3. 对于变宽字体来说,组件的实际宽度等于字体的平均宽度乘以 width 选项的值
wrap 1. 默认情况下(Flase),当输入框中的值是第一个(最后一个)的时候,再点击向上(向下)调节箭头,内容不会改变

2. 当该选项的值设置为 True,则当达到第一个(最后一个)值的时候,再点击向上(向下)调节箭头,内容将回到最后一个(第一个)

3. 小甲鱼注:其实就是开启循环的意^_^
xscrollcommand 1. 与 scrollbar(滚动条)组件相关联

2. 如果你觉得用户输入的内容会超过该组件的输入框宽度,那么可以考虑设置该选项

3. 使用方法可以参考:Scrollbar 组件








方法







bbox(index)


-- 返回一个 4 元组(x1, y1, x2, y2)用于描述输入框中 index 参数指定的字符所在的矩形范围




delete(first, last=None)


-- 删除参数 first 到 last 范围内(包含 first 和 last)的所有内容


-- 如果忽略 last 参数,表示删除 first 参数指定的选项


-- 使用 delete(0, END) 实现删除输入框的所有内容




get()


-- 返回 Spinbox 当前的值




icursor(index)


-- 将光标移动到 index 参数指定的位置


-- 这同时也会设置 INSERT 的值




identify(x, y)


-- 返回给定坐标(x, y)在 Spinbox 中对应的元素名字


-- 返回值可以是:"none"(什么都不是),"buttondown"(向下调节箭头),"buttonup"(向上调节箭头)或 "entry"(输入框)




index(index)


-- 返回与 index 参数相应的选项的序号(例如 e.index(END))




insert(index, text)


-- 将 text 参数的内容插入到 index 参数指定的位置


-- 使用 insert(INSERT, text) 将 text 参数指定的字符串插入到光标的位置


-- 使用 insert(END, text) 将 text 参数指定的字符串插入到输入框的末尾




invoke(element)


-- 调用该方法的效果相当于用户点击调节箭头


-- element 参数的值必须是 "buttonup" 或 "buttondown"




scan_dragto(x)


--  见下方 scan_mark(x)




scan_mark(x)


-- 使用这种方式来实现输入框内容的滚动


-- 需要将鼠标按下事件绑定到 scan_mark(x) 方法(x 是鼠标当前的水平位置),然后再将 <motion> 事件绑定到 scan_dragto(x)
方法(x 是鼠标当前的水平位置),就可以实现输入框在当前位置和 sacn_mack(x) 指定位置之间的水平滚动





selection('from', index)


-- 设置选中范围的起始位置是 index 参数指定的值




selection('to', index)


-- 设置选中范围的结束位置是 index 参数指定的值




selection('range', start, end)


-- 设置选中范围是 statr 到 end 参数之间的值




selection_adjust(index)


-- 该方法是为了确保输入框中选中的范围包含 index 参数所指定的字符


-- 如果选中的范围已经包含了该字符,那么什么事情也不会发生


-- 如果选中的范围不包含该字符,那么会从光标的位置将选中的范围扩展至该字符




selection_clear()


-- 取消选中状态




selection_element(element=None)


-- 该方法用于“设置”或“获取”选择范围


-- 如果给 element 参数赋值,那么表示设置选择范围


-- 否则表示获得当前的选择范围




窗口与菜单

PanedWindow 多空间窗口

功能

PanedWindow 组件(Tk8.4 新增)是一个空间管理组件。跟 Frame 组件类似,都是为组件提供一个框架,不过 PanedWindow 允许让用户调整应用程序的空间划分。

当你需要提供一个可供用户调整的多空间框架的时候,可以使用 PanedWindow 组件。PanedWindow 组件会为每一个子组件生成一个独立地窗格,用户可以自由调整窗格的大小。

用法

创建一个 2 窗格的 PanedWindow 组件非常简单:

from tkinter import *

m = PanedWindow(orient=VERTICAL)
m.pack(fill=BOTH, expand=1)

top = Label(m, text="top pane")
m.add(top)

bottom = Label(m, text="bottom pane")
m.add(bottom)

mainloop()

创建一个 3 窗格的 PanedWindow 组件则需要一点小技巧:

from tkinter import *

m1 = PanedWindow()
m1.pack(fill=BOTH, expand=1)

left = Label(m1, text="left pane")
m1.add(left)

m2 = PanedWindow(orient=VERTICAL)
m1.add(m2)

top = Label(m2, text="top pane")
m2.add(top)

bottom = Label(m2, text="bottom pane")
m2.add(bottom)

mainloop()

这里不同窗格事实上是有一条“分割线”(sash)隔开,虽然你看不到,但你却可以感受到它的存在。不信?不妨把鼠标缓慢移动到大概的位置,当鼠标指针改变的时候后拖拽鼠标......

但我们也可以把“分割线”给显式地显示出来,并且可以为它附上一个“手柄”(handle):

from tkinter import *

m1 = PanedWindow(showhandle=True, sashrelief=SUNKEN)
m1.pack(fill=BOTH, expand=1)

left = Label(m1, text="left pane")
m1.add(left)

m2 = PanedWindow(orient=VERTICAL, showhandle=True, sashrelief=SUNKEN)
m1.add(m2)

top = Label(m2, text="top pane")
m2.add(top)

bottom = Label(m2, text="bottom pane")
m2.add(bottom)

mainloop()

参数说明

PanedWindow(master=None, options)(class)
master -- 父组件
options -- 组件选项,下方表格详细列举了各个选项的具体含义和用法:









































































选项

含义
background 设置背景颜色


bg 跟 background 一样
borderwidth 设置边框宽度


bd 跟 borderwidth 一样
cursor 1. 指定当鼠标在 PanedWindow 上飘过的时候的鼠标样式

2. 默认值由系统指定
handlepad 1. 调节“手柄”的位置

2. 例如 orient=VERTICAL,则 handlepad 选项表示“分割线”上的手柄与左端的距离

3. 默认值是 8 像素
handlesize 1. 设置“手柄”的尺寸(由于“手柄”必须是一个正方形,所以是设置正方形的边长)

2. 默认值是 8 像素
height 1. 设置 PanedWindow 的高度

2. 如果忽略该选项,则高度由子组件的尺寸决定
opaqueresize 1. 该选项定义了用户调整窗格尺寸的操作

2. 如果该选项的值为 True(默认),窗格的尺寸随用户鼠标的拖拽而改变

3. 如果该选项的值为 False,窗格的尺寸在用户释放鼠标的时候才更新到新的位置
orient 1. 指定窗格的分布方式

2. 可以是 HORIZONTAL(横向分布)和 VERTICAL(纵向分布)
relief 1. 指定边框样式

2. 默认值是 FLAT

3. 另外你还可以设置 SUNKEN,RAISED,GROOVE 或 RIDGE


sashpad 设置每一条分割线到窗格间的间距
sashrelief 1. 设置分割线的样式

2. 默认值是:FLAT

3. 另外你还可以设置 SUNKEN,RAISED,GROOVE 或 RIDGE
sashwidth 设置分割线的宽度
showhandle 1. 设置是否显示调节窗格的手柄

2. 默认值为 False
width 1. 设置 PanedWindow 的宽度

2. 如果忽略该选项,则高度由子组件的尺寸决定







方法






add(child, options)


-- 添加一个新的子组件到窗格中


-- 下方表格列举了各个 options 选项具体含义:








































选项

含义
after 添加新的子组件到指定子组件后边


before 添加新的子组件到指定子组件前边
height 指定子组件的高度
minsize 1. 该选项控制窗格不得低于的值

2. 如果 orient=HORIZONTAL,表示窗格的宽度不得低于该选项的值

3. 如果 orient=VERTICAL,表示窗格的高度不得低于该选项的值
padx 指定子组件的水平间距
pady 指定子组件的垂直间距
sticky 1. 当窗格的尺寸大于子组件时,该选项指定子组件位于窗格的位置

2. 可选的值有:E、S、W、N(分别代表东南西北四个方位)以及它们的组合值

3. 例如 NE 表示子组件显示在右上角的位置
width 指定子组件的宽度





forget(child)


-- 删除一个子组件




identify(x, y)


-- 给定一个坐标(x, y),返回该坐标所在的元素名称


-- 如果该坐标位于子组件上,返回空字符串


-- 如果该坐标位于分割线上,返回一个二元组(n, 'sash'),n 为 0 表示第一个分割线


-- 如果该坐标位于手柄上,返回一个二元组(n, 'handle'),n 为 0 表示第一个手柄




panecget(child, option)


-- 获得子组件指定选项的值
paneconfig(child, options)



-- 设置子组件的各种选项


-- 下方表格列举了各个 options 选项具体含义:








































选项

含义
after 添加新的子组件到指定子组件后边


before 添加新的子组件到指定子组件前边
height 指定子组件的高度
minsize 1. 该选项控制窗格不得低于的值

2. 如果 orient=HORIZONTAL,表示窗格的宽度不得低于该选项的值

3. 如果 orient=VERTICAL,表示窗格的高度不得低于该选项的值
padx 指定子组件的水平间距
pady 指定子组件的垂直间距
sticky 1. 当窗格的尺寸大于子组件时,该选项指定子组件位于窗格的位置

2. 可选的值有:E、S、W、N(分别代表东南西北四个方位)以及它们的组合值

3. 例如 NE 表示子组件显示在右上角的位置
width 指定子组件的宽度





paneconfigure(child, **options)


-- 跟 paneconfig() 一样




panes()


-- 将子组件以列表的形式返回




remove(child)


-- 跟 forget() 一样




sash_coord(index)


-- 返回一个二元组表示指定分割线的起点坐标




sash_dragto(index, x, y)


-- 实现将指定的分割线拖拽到一个新的位置


-- 与 sash_mark() 一起实现




sash_mark(index, x, y)


-- 注册当前的鼠标位置




sash_place(index, x, y)


-- 将指定分割线移动到一个新的位置




Toplevel 顶级窗口

功能

Toplevel(顶级窗口)组件类似于 Frame 组件,但 Toplevel 组件是一个独立的顶级窗口,这种窗口通常拥有标题栏、边框等部件。

Toplevel 组件通常用在显示额外的窗口、对话框和其他弹出窗口上。

用法

下边例子中,我们在 root 窗口添加一个按钮用于创建一个顶级窗口,点一下来一个:

from tkinter import *

root = Tk()

def create():
    top = Toplevel()
    top.title("FishC Demo")

    msg = Message(top, text="I love FishC.com!")
    msg.pack()

Button(root, text="创建顶级窗口", command=create).pack()

mainloop()

想要几个就点几下:

参数说明

Toplevel(master=None, options)(class)
master -- 父组件
options -- 组件选项,下方表格详细列举了各个选项的具体含义和用法:

















































































选项

含义
background 1. 设置背景颜色

2. 默认值由系统指定

3. 为了防止更新,可以将颜色值设置为空字符串
bg 跟 background 一样
borderwidth 设置边框宽度


bd 跟 borderwidth 一样
class_ 默认值是 Toplevel
colormap 1. 有些显示器只支持 256 色(有些可能更少),这种显示器通常提供一个颜色映射来指定要使用要使用的 256 种颜色

2. 该选项允许你指定用于该组件以及其子组件的颜色映射

3. 默认情况下,Toplevel 使用与其父组件相同的颜色映射

4. 使用此选项,你可以使用其他窗口的颜色映射代替(两窗口必须位于同个屏幕并且具有相同的视觉特性)

5. 你也可以直接使用 "new" 为 Toplevel 组件分配一个新的颜色映射

6. 一旦创建 Toplevel 组件实例,你就无法修改这个选项的值
container 1. 该选项如果为 True,意味着该窗口将被用作容器,一些其它应用程序将被嵌入
 

2. 默认值是 False
cursor 1. 指定当鼠标在 Toplevel 上飘过的时候的鼠标样式

2. 默认值由系统指定
height 设置高度
highlightbackground 指定当 Toplevel 没有获得焦点的时候高亮边框的颜色
highlightcolor 指定当 Toplevel 获得焦点的时候高亮边框的颜色
highlightthickness 指定高亮边框的宽度
menu 设置该选项为 Toplevel 窗口提供菜单栏
padx 水平方向上的边距
pady 垂直方向上的边距
relief 1. 指定边框样式

2. 默认值是 FLAT

3. 另外你还可以设置 SUNKEN,RAISED,GROOVE 或 RIDGE

4. 注意,如果你要设置边框样式,记得设置 borderwidth 或 bd 选项不为 0,才能看到边框
takefocus 1. 指定该组件是否接受输入焦点(用户可以通过 tab 键将焦点转移上来)

2. 默认值是 False
width 设置宽度







Tk和Toplevel Window方法汇总

下边这一系列方法用于与窗口管理器进行交互。他们可以被 Tk(根窗口)进行调用,同样也适用于 Toplevel(顶级窗口)。

注:并非所有操作系统均完全支持下方所有方法的实现。

aspect(minNumer=None, minDenom=None, maxNumer=None, maxDenom=None)
-- 控制该窗口的宽高比(width:height)
-- 宽高比限制在:minNumer / minDenom ~ maxNumer / maxDenom
-- 如果忽略参数,则返回一个 4 元组表示当前的限制(如果有的话)
attributes(args)
-- 设置和获取窗口属性
-- 如果你只给出选项名,将返回当前窗口该选项的值
-- 注意:以下选项不支持关键字参数,你需要在选项前添加横杠(-)并用字符串的方式表示,用逗号(,)隔开选项和值。
-- 例如你希望设置窗口的透明度为 50%,你应该使用 attribute("-alpha", 0.5) 代替 attribute(alpha=0.5)
-- 下方表格列举了 args 可以使用各个选项的具体含义及用法:





































选项

含义
alpha1.(Windows,Mac)控制窗口的透明度

2. 1.0 表示不透明,0.0 表示完全透明

3. 该选项并不支持所有的系统,对于不支持的系统,Tkinter 绘制一个不透明(1.0)的窗口
disabled(Windows)禁用整个窗口(这时候你只能从任务管理器中关闭它)
fullscreen(Windows,Mac)如果设置为 True,则全屏显示窗口
modified(Mac)如果设置为 True,该窗口被标记为改动过
titlepath(Mac)设置窗口代理图标的路径
toolwindow(Windows)如果设置为 True,该窗口采用工具窗口的样式
topmost(Windows,Mac)如果设置为 True,该窗口将永远置于顶层





client(name=None)


-- 设置和获取 WM_CLIENT_MACHINE 属性


-- 如果要删除 WM_CLIENT_MACHINE 属性,赋值为空字符串即可


-- 该属性仅支持 X 窗口系统的窗口管理器,其他系统均忽略




colormapwindows(
wlist)


-- 设置和获取 WM_COLORMAP_WINDOWS 属性


-- 该属性仅支持 X 窗口系统的窗口管理器,其他系统均忽略




command(value=None)


-- 设置和获取 WM_COMMAND 属性


-- 该属性仅支持 X 窗口系统的窗口管理器,其他系统均忽略




deiconify()


-- 显示窗口


-- 默认情况下新创建的窗口都会显示在屏幕上,但使用 iconify() 或 withdraw() 方法可以在屏幕上移除窗口




focusmodel(model=None)


-- 设置和获取焦点模式




frame()


-- 返回一个字符串表示当前系统特征


-- 对于类 Unix 系统,返回值是 X 窗口标识符


-- 对于 Windows 系统,返回值是 HWND 强制转换为长整形的结果




geometry(geometry=None)


-- 设置和获取窗口的尺寸


-- geometry 参数的格式为:"%dx%d%+d%+d" % (width, height, xoffset, yoffset)




grid(baseWidth=None, baseHeight=None, widthInc=None, heightInc=None)


-- 通知窗口管理器该窗口将以网格的形式重新调整尺寸


-- baseWidth 和 baseHeight 指定 Tk_GeometryRequest 要求的网格单元数


-- widthInc 和 heightInc 指定网格单元的宽度和高度(像素)




group(window=None)


-- 将窗口添加到窗口群中


-- window 参数指定控制窗口群的主窗口


-- 如果忽略该参数,将返回当前窗口群的主窗口




iconbitmap(bitmap=None, default=None)


-- 设置和获取窗口的图标


-- 例如 root.iconbitmap(bitmap="FishC.ico")


-- default 参数可以用于指定由该窗口创建的子窗口的默认图标




iconify()


-- 将窗口图标化(最小化)


-- 需要重新显示窗口,使用 deiconify() 方法


-- 该方法会使得 state() 返回 "iconic"




iconmask(bitmap=None)


-- 设置和获取位图掩码




iconname(newName=None)


-- 设置和获取当窗口图标化(最小化)时的图标名字




iconposition(x=None, y=None)


-- 设置和获取当窗口图标化(最小化)时的图标位置




iconwindow(pathName=None)


-- 设置和获取当窗口图标化(最小化)时的组件窗口


-- 该方法会使得 state() 返回 "icon"




maxsize(width=None, height=None)


-- 设置和获取该窗口的最大尺寸




minsize(width=None, height=None)


-- 设置和获取该窗口的最小尺寸




overrideredirect(boolean=None)


-- 如果参数为 True,该窗口忽略所有的小部件(也就是说该窗口将没有传统的标题栏、边框等部件)




positionfrom(who=None)


-- 指定窗口位置由“谁”决定


-- 如果 who 参数是 "user",窗口位置由用户决定


-- 如果 who 参数是 "program",窗口位置由系统决定




protocol(name=None, func=None)


-- 将回调函数 func 与相应的规则 name 绑定


-- name 参数可以是 "WM_DELETE_WINDOW":窗口被关闭的时候


-- name 参数可以是 "WM_SAVE_YOURSELF":窗口被保存的时候


-- name 参数可以是 "WM_TAKE_FOCUS":窗口获得焦点的时候




resizable(width=None, height=None)


-- 指定是否可以改变该窗口的尺寸


-- width 为 True 说明允许调整窗口的水平尺寸


-- height 为 True 说明允许调整窗口的垂直尺寸




sizefrom(who=None)


-- 指定窗口尺寸由“谁”决定


-- 如果 who 参数是 "user",窗口位置由用户决定


-- 如果 who 参数是 "program",窗口位置由系统决定




state(newstate=None)


-- 设置和获得当前窗口的状态


-- newstate 的值可以是 "normal","iconic"(见 iconify),"withdrawn"(见 withdraw),"icon"(见
iconwindow)和 "zoomed"(放大,Windows 特有)





title(string=None)


-- 设置窗口的标题




transient(master=None)


-- 指定为 master 的临时窗口




withdraw()


-- 将窗口从屏幕上移除(并没有销毁)


-- 需要重新显示窗口,使用 deiconify() 方法


-- 该方法会使得 state() 返回 "withdrawn"




wm_aspect(minNumer=None, minDenom=None, maxNumer=None, maxDenom=None)


-- 见上方 aspect()




wm_attributes(args)


-- 见上方 attributes()




wm_client(name=None)


-- 见上方 client()




wm_colormapwindows(
wlist)


-- 见上方 colormapwindows()




wm_command(value=None)


-- 见上方 command()




wm_deiconify()


-- 见上方 deiconify()




wm_focusmodel(model=None)


-- 见上方 focusmodel()




wm_frame()


-- 见上方 frame()




wm_geometry(geometry=None)


-- 见上方 geometry()




wm_grid(baseWidth=None, baseHeight=None, widthInc=None, heightInc=None)


-- 见上方 grid()




wm_group(window=None)


-- 见上方 group()




wm_iconbitmap(bitmap=None, default=None)


-- 见上方 iconbitmap()




wm_iconify()


-- 见上方 iconify()




wm_iconmask(bitmap=None)


-- 见上方 iconmask()




wm_iconname(newName=None)


-- 见上方 iconname()




wm_iconposition(x=None, y=None)


-- 见上方 iconposition()




wm_iconwindow(pathName=None)


-- 见上方 iconwindow()




wm_maxsize(width=None, height=None)


-- 见上方 maxsize()




wm_minsize(width=None, height=None)


-- 见上方 minsize()




wm_overrideredirect(boolean=None)


-- 见上方 overrideredirect()




wm_positionfrom(who=None)


-- 见上方 positionfrom()




wm_protocol(name=None, func=None)


-- 见上方 protocol()




wm_resizable(width=None, height=None)


-- 见上方 resizable()




wm_sizefrom(who=None)


-- 见上方 sizefrom()




wm_state(newstate=None)


-- 见上方 state()




wm_title(string=None)


-- 见上方 title()




wm_transient(master=None)


-- 见上方 transient()




wm_withdraw()


-- 见上方 withdraw()


功能

Menu(菜单)组件用于实现顶级菜单、下拉菜单和弹出菜单。

Menu 组件通常被用于实现应用程序上的各种菜单,由于该组件是底层代码实现,所以不建议你自行通过按钮和其他组件来实现菜单功能。

用法

创建一个顶级菜单,你需要先创建一个菜单实例,然后使用 add() 方法将命令和其它子菜单添加进去:

from tkinter import *

root = Tk()

def callback():
    print("~被调用了~")

# 创建一个顶级菜单
menubar = Menu(root)
menubar.add_command(label="Hello", command=callback)
menubar.add_command(label="Quit", command=root.quit)

# 显示菜单
root.config(menu=menubar)

mainloop()

创建一个下拉菜单(或者其他子菜单),方法也是大同小异,最主要的区别是它们最后需要添加到主菜单上(而不是窗口上):

from tkinter import *

root = Tk()

def callback():
    print("~被调用了~")

# 创建一个顶级菜单
menubar = Menu(root)

# 创建一个下拉菜单“文件”,然后将它添加到顶级菜单中
filemenu = Menu(menubar, tearoff=False)
filemenu.add_command(label="打开", command=callback)
filemenu.add_command(label="保存", command=callback)
filemenu.add_separator()
filemenu.add_command(label="退出", command=root.quit)
menubar.add_cascade(label="文件", menu=filemenu)

# 创建另一个下拉菜单“编辑”,然后将它添加到顶级菜单中
editmenu = Menu(menubar, tearoff=False)
editmenu.add_command(label="剪切", command=callback)
editmenu.add_command(label="拷贝", command=callback)
editmenu.add_command(label="粘贴", command=callback)
menubar.add_cascade(label="编辑", menu=editmenu)

# 显示菜单
root.config(menu=menubar)

mainloop()

创建一个弹出菜单方法也是一致的,不过需要使用 post() 方法明确的将其显示出来:

from tkinter import *

root = Tk()

def callback():
    print("~被调用了~")

# 创建一个弹出菜单
menu = Menu(root, tearoff=False)
menu.add_command(label="撤销", command=callback)
menu.add_command(label="重做", command=callback)

frame = Frame(root, width=512, height=512)
frame.pack()

def popup(event):
    menu.post(event.x_root, event.y_root)

# 绑定鼠标右键
frame.bind("<Button-3>", popup)

mainloop()

参数说明

Menu(master=None, options)(class)
master -- 父组件
options -- 组件选项,下方表格详细列举了各个选项的具体含义和用法:

















































































选项

含义
activebackground 设置当 Menu 处于活动状态(通过 state 选项设置状态)的背景色


activeborderwidth 设置当 Menu 处于活动状态(通过 state 选项设置状态)的边框宽度


activeforeground 设置当 Menu 处于活动状态(通过 state 选项设置状态)的前景色


background 设置背景颜色


bg 跟 background 一样
borderwidth 指定边框宽度


bd 跟 borderwidth 一样
cursor 指定当鼠标在 Menu 上飘过的时候的鼠标样式


disabledforeground 指定当 Menu 处于 DISABLED 状态的时候的前景色


font 指定 Menu 中文本的字体


foreground 设置 Menu 的前景色


fg 跟 foreground 一样
postcommand 将此选项与一个方法相关联,当菜单被打开的时候该方法将自动被调用
relief 1. 指定边框样式

2. 默认值是 FLAT

3. 另外你还可以设置 SUNKEN,RAISED,GROOVE 或 RIDGE
selectcolor 指定当菜单项显示为单选按钮或多选按钮时选择中标志的颜色
tearoff 1. 默认情况下菜单可以被“撕下”(点击 IDLE 菜单上边的 --------- 试试)

2. 将该选项设置为 Flase 关闭这一特性
tearoffcommand 如果你希望当用户“撕下”你的菜单时通知你的程序,那么你可以将该选项与一个方法相关联,那么当用户“撕下”你的菜单时,Tkinter 会带着两个参数去调用你的方法(一个参数是当前窗口的
ID,另一个参数是承载被“撕下”的菜单的窗口 ID)


title 默认情况下,被“撕下”的菜单标题是其主菜单的名字,不过你也可以通过修改此项的值来修改标题







方法






add(type, options)


-- type 参数指定添加的菜单类型,可以是:"command","cascade","checkbutton","radiobutton" 或 "separator"


-- 还可以通过 options 选项设置菜单的属性,下表列举了 options 可以使用的选项和具体含义:




































































































选项

含义
accelerator 1. 显示该菜单项的加速键(快捷键)

2. 例如 accelerator = "Ctrl+N"

3. 该选项仅显示,并没有实现加速键的功能(通过按键绑定实现)
activebackground 设置当该菜单项处于活动状态(通过 state 选项设置状态)的背景色
activeforeground 设置当该菜单项处于活动状态(通过 state 选项设置状态)的前景色
background 设置该菜单项的背景颜色
bitmap 指定显示到该菜单项上的位图


columnbreak 从该菜单项开始另起一列显示
command 将该选项与一个方法相关联,当用户点击该菜单项时将自动调用此方法
compound 1. 控制菜单项中文本和图像的混合模式

2. 如果该选项设置为 CENTER,文本显示在图像上(文本重叠图像)

3. 如果该选项设置为 BOTTOM,LEFT,RIGHT 或 TOP,那么图像显示在文本的旁边(如 BOTTOM,则图像在文本的下方


font 指定文本的字体


foreground 设置前景色
hidemargin 是否显示菜单项旁边的空白
image 1. 指定菜单项显示的图片

2. 该值应该是 PhotoImage,BitmapImage,或者能兼容的对象


label 指定菜单项显示的文本
menu 1. 该选项仅在 cascade 类型的菜单中使用

2. 用于指定它的下级菜单
offvalue 1. 默认情况下,variable 选项设置为 1 表示选中状态,反之设置为 0

2. 设置 offvalue 的值可以自定义未选中状态的值
onvalue 1. 默认情况下,variable 选项设置为 1 表示选中状态,反之设置为 0

2. 设置 onvalue 的值可以自定义选中状态的值
selectcolor 指定当菜单项显示为单选按钮或多选按钮时选择中标志的颜色
selectimage 如果你在单选按钮或多选按钮菜单中使用图片代替文本,那么设置该选项指定被菜单项被选中时显示的图片
state 1. 跟 text 选项一起使用,用于指定哪一个字符画下划线(例如用于表示键盘快捷键)
underline 1. 用于指定在该菜单项的某一个字符处画下划线

2. 例如设置为 1,则说明在该菜单项的第 2 个字符处画下划线
value 1. 当菜单项为单选按钮时,用于标志该按钮的值

2. 在同一组中的所有按钮应该拥有各不相同的值

3. 通过将该值与 variable 选项的值对比,即可判断用户选中了哪个按钮

4. 如在使用上有不懂具体可以参照
 Radiobutton
 组件的说明
variable 1. 当菜单项是单选按钮或多选按钮时,与之关联的变量

2. 如在使用上有不懂具体可以参照:Checkbutton
 
 Radiobutton
 组件的说明





add_cascade(options)



-- 添加一个父菜单


-- 相当于 add("cascade", options)




add_checkbutton(options)



-- 添加一个多选按钮的菜单项


-- 相当于 add("checkbutton", options)




add_command(options)



-- 添加一个普通的命令菜单项


-- 相当于 add("command", options)




add_radiobutton(options)



-- 添加一个单选按钮的菜单项


-- 相当于 add("radiobutton", options)




add_separator(options)



-- 添加一条分割线


-- 相当于 add("separator", options)




delete(index1, index2=None)


-- 删除 index1 ~ index2(包含)的所有菜单项


-- 如果忽略 index2 参数,则删除 index1 指向的菜单项


-- 注意:对于一个被“撕下”的菜单,你无法使用该方法




entrycget(index, option)


-- 获得指定菜单项的某选项的值




entryconfig(index, options)



-- 设置指定菜单项的选项


-- 选项的参数及具体含义请参考上方 add() 方法




entryconfigure(index, options)


-- 跟 entryconfig() 一样




index(index)


-- 返回与 index 参数相应的选项的序号(例如 e.index(END))




insert(index, itemType, options)



-- 插入指定类型的菜单项到 index 参数指定的位置


-- itemType 参数指定添加的菜单类型,可以是:"command","cascade","checkbutton","radiobutton" 或 "separator"


-- 选项的参数及具体含义请参考上方 add() 方法




insert_cascade(index, options)


-- 在 index 参数指定的位置添加一个父菜单


-- 相当于 insert("cascade",
options)





insert_checkbutton(index, options)


-- 在 index 参数指定的位置添加一个多选按钮


-- 相当于 insert("checkbutton",
options)





insert_command(index, options)


-- 在 index 参数指定的位置添加一个普通的命令菜单项


-- 相当于 insert("command",
options)





insert_radiobutton(index, options)


-- 在 index 参数指定的位置添加一个单选按钮


-- 相当于 insert("radiobutton",
options)




insert_separator(index, options)


-- 在 index 参数指定的位置添加一条分割线


-- 相当于 insert("separator",
options)




invoke(index)


-- 调用 index 指定的菜单项相关联的方法


-- 如果是单选按钮,设置该菜单项为选中状态


-- 如果是多选按钮,切换该菜单项的选中状态




post(x, y)


-- 在指定的位置显示弹出菜单


-- 参考上方【用法】中的创建弹窗菜单的例子




type(index)


-- 获得 index 参数指定菜单项的类型


-- 返回值可以是:"command","cascade","checkbutton","radiobutton" 或 "separator"




unpost()


-- 移除弹出菜单




yposition(index)


-- 返回 index 参数指定的菜单项的垂直偏移位置


-- 该方法的目的是为了让你精确放置相对于当前鼠标的位置弹出菜单


功能

Menubutton 组件是一个与 Menu 组件相关联的按钮,它可以放在窗口中的任意位置,并且在被按下时弹出下拉菜单。

在 Tkinter 的早期版本,Menubutton 组件主要是用于实现顶级菜单,但现在我们直接用 Menu 组件就可以实现了。因此,现在该组件适用于你希望菜单按钮出现在其他位置的时候。

用法

创建一个 Menubutton 组件,并创建一个 Menu 组件与之相关联:

from tkinter import *

root = Tk()

def callback():
    print("~被调用了~")

mb = Menubutton(root, text="点我", relief=RAISED)
mb.pack()

filemenu = Menu(mb, tearoff=False)
filemenu.add_checkbutton(label="打开", command=callback, selectcolor="yellow")
filemenu.add_command(label="保存", command=callback)
filemenu.add_separator()
filemenu.add_command(label="退出", command=root.quit)
mb.config(menu = filemenu)

mainloop()

参数说明

Menubutton(master=None, options)(class)
master -- 父组件
options -- 组件选项,下方表格详细列举了各个选项的具体含义和用法:









































































































































选项

含义
activebackground 设置当 Menubutton 处于活动状态(通过 state 选项设置状态)的背景色


activeforeground 设置当 Menubutton 处于活动状态(通过 state 选项设置状态)的前景色


anchor 1. 控制文本(或图像)在 Menubutton 中显示的位置

2. N, NE, E, SE, S, SW, W, NW, 或 CENTER 来定位(EWSN代表东西南北,上北下南左西右东)

3. 默认值是 CENTER
background 设置背景颜色


bg 跟 background 一样
bitmap 指定显示到 Menubutton 上的位图


borderwidth 指定 Menubutton 的边框宽度


bd 跟 borderwidth 一样
compound 1. 控制 Menubutton 中文本和图像的混合模式

2. 如果该选项设置为 CENTER,文本显示在图像上(文本重叠图像)

3. 如果该选项设置为 BOTTOM,LEFT,RIGHT 或 TOP,那么图像显示在文本的旁边(如 BOTTOM,则图像在文本的下方)

4. 默认值是 NONE
cursor 指定当鼠标在 Menubutton 上飘过的时候的鼠标样式


direction 1. 默认情况下菜单是显示在按钮的下方,你可以通过修改此选项来改变这一特征

2. 你可以将该选项设置为 "left"(按钮的左边),"right"(按钮的右边),"above"(按钮的上方)
disabledforeground 指定当 Menubutton 不可用的时候前景色的颜色


font 指定 Menubutton 中文本的字体


foreground 设置 Menubutton 的文本和位图的颜色


fg 跟 foreground 一样
height 1. 设置 Menubutton 的高度

2. 如果 Menubutton 显示的是文本,那么单位是文本单元

3. 如果 Menubutton 显示的是图像,那么单位是像素(或屏幕单元)

4. 如果设置为 0 或者干脆不设置,那么会自动根据 Menubutton 的内容计算出高度
highlightbackground 指定当 Menubutton 没有获得焦点的时候高亮边框的颜色


highlightcolor 指定当 Menubutton 获得焦点的时候高亮边框的颜色


highlightthickness 指定高亮边框的宽度


image 1. 指定 Menubutton 显示的图片

2. 该值应该是 PhotoImage,BitmapImage,或者能兼容的对象


justify 1. 定义如何对齐多行文本

2. 使用 LEFT,RIGHT 或 CENTER

3. 注意,文本的位置取决于 anchor 选项

4. 默认值是 CENTER
menu 1. 指定与 Menubutton 相关联的 Menu 组件

2. Menu 组件的第一个参数必须是 Menubutton 的实例(参考上边例子)
padx 指定 Menubutton 水平方向上的额外间距(内容和边框间)
pady 指定 Menubutton 垂直方向上的额外间距(内容和边框间)
relief 1. 指定边框样式

2. 默认值是 FLAT

3. 可以设置为 SUNKEN,RAISED,GROOVE,RIDGE
state 1. 指定 Menubutton 的状态

2. 默认值是 NORMAL

3. 另外你还可以设置 ACTIVE 或 DISABLED
takefocus 指定使用 Tab 键可以将焦点移到该 Button 组件上(这样按下空格键也相当于触发按钮事件)


text 1. 指定 Menubutton 显示的文本

2. 文本可以包含换行符


textvariable 1. Menubutton 显示 Tkinter 变量(通常是一个 StringVar 变量)的内容

2. 如果变量被修改,Menubutton 的文本会自动更新
underline 1. 跟 text 选项一起使用,用于指定哪一个字符画下划线(例如用于表示键盘快捷键)
 

2. 默认值是 -1

3. 例如设置为 1,则说明在 Menubutton 的第 2 个字符处画下划线
width 1. 设置 Menubutton 的宽度

2. 如果 Menubutton 显示的是文本,那么单位是文本单元

3. 如果 Menubutton 显示的是图像,那么单位是像素(或屏幕单元)

4. 如果设置为 0 或者干脆不设置,那么会自动根据 Menubutton 的内容计算出宽度
wraplength 1. 决定 Menubutton 的文本应该被分成多少行

2. 该选项指定每行的长度,单位是屏幕单元

3. 默认值是 0



OptionMenu 选择菜单

功能

OptionMenu(选择菜单)事实上是下拉菜单的改版,它的发明弥补了 Listbox 组件无法实现下拉列表框的遗憾。

用法

创建一个选择菜单非常简单,只需要它一个 Tkinter 变量(用于记录用户选择了什么)以及若干选项即可:

from tkinter import *

root = Tk()

variable = StringVar()
variable.set("one")

w = OptionMenu(root, variable, "one", "two", "three")
w.pack()

mainloop()

要获得用户选择的内容,使用 Tkinter 变量的 get() 方法即可:

def callback():
    print(variable.get())

Button(root, text="点我", command=callback).pack()

下边例子演示如何将很多选项添加到选择菜单中:

from tkinter import *

OPTIONS = [
    "California",
    "458",
    "FF",
    "ENZO",
    "LaFerrari"
    ]

root = Tk()

variable = StringVar()
variable.set(OPTIONS[0])

w = OptionMenu(root, variable, *OPTIONS)
w.pack()

def callback():
    print(variable.get())

Button(root, text="点我", command=callback).pack()

mainloop()

注意:星号(*)作为形参的时候是起到“打包”的作用,相反,作为实参的时候是起到“解包”的作用。

一、星号(*)作为形参,表示调用可变参数函数:

通过在形参前加一个星号(*)或两个星号(**)来指定函数可以接收任意数量的实参。

def fun1(*args):       
        print(type(args)) 
        print(args)
        
fun1(1, 2, 3, 4, 5)

# 输出:
# <class 'tuple'>
# (1, 2, 3, 4, 5)
def fun2(**args):
        print(type(args))
        print(args)
        
fun2(a=1, b=2, c=3, d=4, e=5)

# 输出:
# <class 'dict'>
# {'e': 5, 'a': 1, 'c': 3, 'd': 4, 'b': 2}
  • 从两个示例的输出可以看出:当参数形如 *args 时,传递给函数的任意个实参会按位置打包成一个元组(tuple);
  • 当参数形如 **args 时,传递给函数的任意个 key = value 实参会被包装进一个字典(dict)。

二、星号(*)作为实参时,表示通过解包参数调用函数

有打包就有解包,通过在实参前加一个星号(*)或两个星号(**)来对列表(list)、元组(tuple)或字典(dict)进行解包:

>>> a = [1, 2, 3, 4, 5]
>>> b = (1, 2, 3, 4, 5)
>>> fun1(*a)
(1, 2, 3, 4, 5)
>>> fun1(*b)
(1, 2, 3, 4, 5)
>>> c = {'one':1, 'two':2, 'three':3}
>>> fun2(**c)
{'two': 2, 'one': 1, 'three': 3}
>>> 

总结:一个星号(*)用来打包和解包序列,两个星号(**)用来打包和解包字典。

事件绑定

基本用法

正如我们此前提到的,一个 Tkinter 应用程序大部分时间花费在事件循环中(通过 mainloop() 方法进入)。事件可以有各种来源:包括用户触发的鼠标和键盘操作和窗口管理器触发的重绘事件(在多数情况下是由用户间接引起的)。

Tkinter 提供一个强大的机制可以让你自由地处理事件,对于每个组件来说,你可以通过 bind() 方法将函数或方法绑定到具体的事件上。

widget.bind(event, handler)

当被触发的事件满足该组件绑定的事件时,Tkinter 就会带着事件对象(Event)去调用 handler() 方法。

这儿有几个例子,大家请随意感受下:

## 捕获点击鼠标的位置
from tkinter import *

root = Tk()

def callback(event):
    print("点击位置:", event.x, event.y)

frame = Frame(root, width=200, height=200)
frame.bind("<Button-1>", callback)
frame.pack()

mainloop()

在上边这个例子中,我们使用 Frame 组件的 bind() 方法将鼠标点击事件(<Button-1>)和我们自定义的 callback() 方法绑定起来。那么运行后的结果是——当你在点击鼠标左键的时候,IDLE 会相应的将鼠标的位置显示出来(如上图)。

只有当组件获得焦点的时候才能接收键盘事件(Key),下边例子中我们用 focus_set() 获得焦点,当你你可以设置 Frame 的 takefocus 选项为 True,然后使用 Tab 将焦点转移上来。

## 捕获键盘事件
from tkinter import *

root = Tk()

def callback(event):
    print("敲击位置:", repr(event.char))

frame = Frame(root, width=200, height=200)
frame.bind("<Key>", callback)
frame.focus_set()
frame.pack()

mainloop()

最后我们再用一个例子展示捕获鼠标在组件上的运动轨迹,这里需要关注的是 <Motion> 事件:

from tkinter import *

root = Tk()

def callback(event):
    print("当前位置:", event.x, event.y)

frame = Frame(root, width=200, height=200)
frame.bind("<Motion>", callback)
frame.pack()

mainloop()

事件序列

Tkinter 使用一种称为事件序列的机制来允许用户定义事件,用户需使用 bind() 方法将具体的事件序列与自定义的方法相绑定。事件序列是以字符串的形式表示的,可以表示一个或多个相关联的事件(如果是多个事件,那么对应的方法只有在满足所有事件的前提下才会被调用)。

事件序列使用以下语法描述:<modifier-type-detail>

  • 事件序列是包含在尖括号(<...>)中
  • type 部分的内容是最重要的,它通常用于描述普通的事件类型,例如鼠标点击或键盘按键点击(详见下方)。
  • modifier 部分的内容是可选的,它通常用于描述组合键,例如 Ctrl + c,Shift + 鼠标左键点击(详见下方)。
  • detail 部分的内容是可选的,它通常用于描述具体的按键,例如 Button-1 表示鼠标左键。

举几个例子帮助大家消化:
























事件序列

含义
<Button-1> 用户点击鼠标左键
<KeyPress-H> 用户点击 H 按键
<Control-Shift-KeyPress-H> 用户同时点击 Ctrl + Shift + H







type






















































































type

含义
Activate 当组件的状态从“未激活”变为“激活”的时候触发该事件
Button 1. 当用户点击鼠标按键的时候触发该事件

2. detail 部分指定具体哪个按键:<Button-1>鼠标左键,<Button-2>鼠标中键,<Button-3>鼠标右键,<Button-4>滚轮上滚(Linux),<Button-5>滚轮下滚(Linux)
ButtonRelease 1. 当用户释放鼠标按键的时候触发该事

2. 在大多数情况下,比 Button 要更好用,因为如果当用户不小心按下鼠标,用户可以将鼠标移出组件再释放鼠标,从而避免不小心触发事件
Configure 当组件的尺寸发生改变的时候触发该事件
Deactivate 当组件的状态从“激活”变为“未激活”的时候触发该事件
Destroy 当组件被销毁的时候触发该事件
Enter 1. 当鼠标指针进入组件的时候触发该事件

2. 注意:不是指用户按下回车键
Expose 当窗口或组件的某部分不再被覆盖的时候触发该事件
FocusIn 1. 当组件获得焦点的时候触发该事件

2. 用户可以用 Tab 键将焦点转移到该组件上(需要该组件的 takefocus 选项为 True)

3. 你也可以调用 focus_set() 方法使该组件获得焦点(见上方例子)
FocusOut 当组件失去焦点的时候触发该事件
KeyPress 1. 当用户按下键盘按键的时候触发该事件

2. detail 可以指定具体的按键,例如 <KeyPress-H>表示当大写字母 H 被按下的时候触发该事件

3. KeyPress 可以简写为 Key
KeyRelease 当用户释放键盘按键的时候触发该事件
Leave 当鼠标指针离开组件的时候触发该事件
Map 1. 当组件被映射的时候触发该事件

2. 意思是在应用程序中显示该组件的时候,例如调用 grid() 方法
Motion 当鼠标在组件内移动的整个过程均触发该事件
MouseWheel 1. 当鼠标滚轮滚动的时候触发该事件

2. 目前该事件仅支持 Windows 和 Mac 系统,Linux 系统请参考 Button
Unmap 1. 当组件被取消映射的时候触发该事件

2. 意思是在应用程序中不再显示该组件的时候,例如调用 grid_remove() 方法
Visibility 当应用程序至少有一部分在屏幕中是可见的时候触发该事件







modifier






在事件序列中,modifier 部分的内容可以是以下这些:








































modifier

含义
Alt 当按下 Alt 按键的时候
Any 1. 表示任何类型的按键被按下的时候

2. 例如 <Any-KeyPress> 表示当用户按下任何按键时触发事件
Control 当按下 Ctrl 按键的时候
Double 1. 当后续两个事件被连续触发的时候

2. 例如 <Double-Button-1> 表示当用户双击鼠标左键时触发事件
Lock 当打开大写字母锁定键(CapsLock)的时候
Shift 当按下 Shift 按键的时候
Triple 跟 Double 类似,当后续三个事件被连续触发的时候







Event 对象






当 Tkinter 去回调你定义的函数的时候,都会带着 Event 对象(作为参数)去调用,Event 对象以下这些属性你可以使用:
















































属性

含义
widget 产生该事件的组件
x, y 当前的鼠标位置坐标(相对于窗口左上角,像素为单位)
x_root, y_root 当前的鼠标位置坐标(相对于屏幕左上角,像素为单位)
char 按键对应的字符(键盘事件专属)
keysym 按键名,见下方 Key names(键盘事件专属)
keycode 按键码,见下方 Key names(键盘事件专属)
num 按钮数字(鼠标事件专属)
width, height 组件的新尺寸(Configure 事件专属)
type 该事件类型







Key names






当事件为 <Key>,<KeyPress>,<KeyRelease> 的时候,detail 可以通过设定具体的按键名(keysym)来筛选。例如
<Key-H> 表示按下键盘上的大写字母 H 时候触发事件,<Key-Tab> 表示按下键盘上的 Tab 按键的时候触发事件。





下表列举了键盘所有特殊按键的 keysym 和 keycode:



(下边按键码是对应美国标准 101 键盘的“Latin-1”字符集,键盘标准不同对应的按键码不同,但按键名是一样的)





























































































































































































































































































































































按键名(keysym)

按键码(keycode)

代表的按键
Alt_L 64 左边的 Alt 按键
Alt_R 113 右边的 Alt 按键
BackSpace 22 Backspace(退格)按键
Cancel 110 break 按键
Caps_Lock 66 CapsLock(大写字母锁定)按键
Control_L 37 左边的 Ctrl 按键
Control_R 109 右边的 Ctrl 按键
Delete 107 Delete 按键
Down 104 ↓ 按键
End 103 End 按键
Escape 9 Esc 按键
Execute 111 SysReq 按键
F1 67 F1 按键
F2 68 F2 按键
F3 69 F3 按键
F4 70 F4 按键
F5 71 F5 按键
F6 72 F6 按键
F7 73 F7 按键
F8 74 F8 按键
F9 75 F9 按键
F10 76 F10 按键
F11 77 F11 按键
F12 96 F12 按键
Home 97 Home 按键
Insert 106 Insert 按键
Left 100 ← 按键
Linefeed 54 Linefeed(Ctrl + J)
KP_0 90 小键盘数字 0
KP_1 87 小键盘数字 1
KP_2 88 小键盘数字 2
KP_3 89 小键盘数字 3
KP_4 83 小键盘数字 4
KP_5 84 小键盘数字 5
KP_6 85 小键盘数字 6
KP_7 79 小键盘数字 7
KP_8 80 小键盘数字 8
KP_9 81 小键盘数字 9
KP_Add 86 小键盘的 + 按键
KP_Begin 84 小键盘的中间按键(5)
KP_Decimal 91 小键盘的点按键(.)
KP_Delete 91 小键盘的删除键
KP_Divide 112 小键盘的 / 按键
KP_Down 88 小键盘的 ↓ 按键
KP_End 87 小键盘的 End 按键
KP_Enter 108 小键盘的 Enter 按键
KP_Home 79 小键盘的 Home 按键
KP_Insert 90 小键盘的 Insert 按键
KP_Left 83 小键盘的 ← 按键
KP_Multiply 63 小键盘的 * 按键
KP_Next 89 小键盘的 PageDown 按键
KP_Prior 81 小键盘的 PageUp 按键
KP_Right 85 小键盘的 → 按键
KP_Subtract 82 小键盘的 - 按键
KP_Up 80 小键盘的 ↑ 按键
Next 105 PageDown 按键
Num_Lock 77 NumLock(数字锁定)按键
Pause 110 Pause(暂停)按键
Print 111 PrintScrn(打印屏幕)按键
Prior 99 PageUp 按键
Return 36 Enter(回车)按键
Right 102 → 按键
Scroll_Lock 78 ScrollLock 按键
Shift_L 50 左边的 Shift 按键
Shift_R 62 右边的 Shift 按键
Tab 23 Tab(制表)按键
Up 98 ↑ 按键





布局管理

pack、grid 和 place 均用于管理同在一个父组件下的所有组件的布局,其中:

  • pack 是按添加顺序排列组件
  • grid 是按行/列形式排列组件
  • place 则允许程序员指定组件的大小和位置

pack

功能

对比 grid 管理器,pack 更适用于少量组件的排列,但它在使用上更加简单(就像我们前边所有的例子中,展示一个组件我们一般都直接使用 .pack(),多简单~)。如果你需要创建相对复杂的布局结构,那么建议是使用多个框架(Frame)结构构成,或者使用 grid 管理器实现。

注意:不要在同一个父组件中混合使用 pack 和 grid,因为 Tkinter 会很认真地在那儿计算到底先使用那个布局管理器......以至于你等了半个小时,Tkinter 还在那儿纠结不出结果!

用法

我们常常会遇到的一个情况是将一个组件放到一个容器组件中,并填充整个父组件。这儿给大家举个例子,我们生成一个 Listbox 组件并将它填充到 root 窗口中:

from tkinter import *

root = Tk()

listbox = Listbox(root)
listbox.pack(fill=BOTH, expand=True)

for i in range(10):
    listbox.insert(END, str(i))

mainloop()

其中,fill 选项是告诉窗口管理器该组件将填充整个分配给它的空间,BOTH 表示同时横向和纵向扩展,X 表示横向,Y 表示纵向;expand 选项是告诉窗口管理器将父组件的额外空间也填满。

默认下,pack 是将添加的组件依次纵向排列:

from tkinter import *

root = Tk()

Label(root, text="Red", bg="red", fg="white").pack(fill=X)
Label(root, text="Green", bg="green", fg="black").pack(fill=X)
Label(root, text="Blue", bg="blue", fg="white").pack(fill=X)

mainloop()

如果想要组件横向挨个儿排放,你可以使用 side 选项:

from tkinter import *

root = Tk()

Label(root, text="Red", bg="red", fg="white").pack(side=LEFT)
Label(root, text="Green", bg="green", fg="black").pack(side=LEFT)
Label(root, text="Blue", bg="blue", fg="white").pack(side=LEFT)

mainloop()

方法说明

注:下边所有方法适用于所有组件
pack(options)
-- 下方表格详细列举了各个选项的具体含义和用法:













































选项

含义
anchor1. 控制组件在 pack 分配的空间中的位置

2. N, NE, E, SE, S, SW, W, NW, 或 CENTER 来定位(EWSN代表东西南北,上北下南左西右东)

3. 默认值是 CENTER
expand1. 指定是否填充父组件的额外空间

2. 默认值是 False
fill1. 指定填充 pack 分配的空间

2. 默认值是 NONE,表示保持子组件的原始尺寸

3. 还可以使用的值有:X(水平填充),Y(垂直填充)和 BOTH(水平和垂直填充)
in_1. 将该组件放到该选项指定的组件中

2. 指定的组件必须是该组件的父组件
ipadx指定水平方向上的内边距
ipady指定垂直方向上的内边距
padx指定水平方向上的外边距
pady指定垂直方向上的外边距
side1. 指定组件的放置位置

2. 默认值是 TOP

3. 还可以设置的值有:LEFT,BOTTOM,RIGHT





pack_configure(options)



-- 跟 pack() 一样




pack_forget()


-- 将组件从屏幕中“删除”


-- 并没有销毁该组件,只是看不到了


-- 可以通过 pack 或其他布局管理器显示已“删除”的组件




pack_info()


-- 以字典的形式返回当前 pack 的选项




pack_propagate(flag)


-- 如果开启,父组件会自动调节尺寸以容纳所有子组件


-- 默认值是开启(flag = True)


-- 该方法仅适用于父组件




pack_slaves()


-- 以列表的形式返回该组件的所有子组件


-- 该方法仅适用于父组件




Grid

功能

grid 管理器可以说是 Tkinter 这三个布局管理器中最灵活多变的。如果你只希望学习使用一个布局管理器,那么 grid 绝对是首选。当你在设计对话框的时候,使用 gird 尤其便捷。如果你此前一直在用 pack 构造窗口布局,那么学习完 grid 你会悔恨当初为啥不早学它。使用一个 grid 就可以简单的实现你用很多个框架和 pack 搭建起来的效果。

注意:不要在同一个父组件中混合使用 pack 和 grid,因为 Tkinter 会很认真地在那儿计算到底先使用那个布局管理器......以至于你等了半个小时,Tkinter 还在那儿纠结不出结果!

用法

使用 grid 排列组件,只需告诉它你想要将组件放置的位置(行/列,row 选项指定行,cloumn 选项指定列)。此外,你并不用提前指出网格(grid 分布给组件的位置称为网格)的尺寸,因为管理器会自动计算。

from tkinter import *

root = Tk()

## column 默认值是 0
Label(root, text="用户名").grid(row=0)
Label(root, text="密码").grid(row=1)

Entry(root).grid(row=0, column=1)
Entry(root, show="*").grid(row=1, column=1)

mainloop()

默认情况下组件会居中显示在对应的网格里,你可以使用 sticky 选项来修改这一特性。该选项可以使用的值有 E,W,S,N(EWSN分别表示东西南北,即上北下南左西右东)以及它们的组合。因此,我们可以通过 sticky = W 使得 Label 左对齐:

Label(root, text="用户名").grid(row=0, sticky=W)
Label(root, text="密码").grid(row=1, sticky=W)

有时候你可能需要用几个网格来放置一个组件,可以做到吗?当然可以,你只需要指定 rowspan 和 columnspan 就可以实现跨行和跨列的功能:

from tkinter import *

root = Tk()

Label(root, text="用户名").grid(row=0, sticky=W)
Label(root, text="密码").grid(row=1, sticky=W)

Entry(root).grid(row=0, column=1)
Entry(root, show="*").grid(row=1, column=1)

photo = PhotoImage(file="logo.gif")
Label(root, image=photo).grid(row=0, column=2, rowspan=2, padx=5, pady=5)

Button(text="提交", width=10).grid(row=2, columnspan=3, pady=5)

mainloop()

方法说明

注:下边所有方法适用于所有组件
grid(options)
-- 下方表格详细列举了各个选项的具体含义和用法:

















































选项

含义
column1. 指定组件插入的列(0 表示第 1 列)

2. 默认值是 0
columnspan指定用多少列(跨列)显示该组件
in_1. 将该组件放到该选项指定的组件中

2. 指定的组件必须是该组件的父组件
ipadx指定水平方向上的内边距
ipady指定垂直方向上的内边距
padx指定水平方向上的外边距
pady指定垂直方向上的外边距
row指定组件插入的行(0 表示第 1 行)


rowspan指定用多少行(跨行)显示该组件
sticky1. 控制组件在 grid 分配的空间中的位置

2. 可以使用 N, E, S, W 以及它们的组合来定位(EWSN代表东西南北,上北下南左西右东)

3. 使用加号(+)表示拉长填充,例如 N + S 表示将组件垂直拉长填充网格,N + S + W + E 表示填充整个网格

4. 不指定该值则居中显示





grid_bbox(column=None, row=None, col2=None, row2=None)


-- 返回一个 4 元组描述该组件所在的限定矩形-- 如果指定 column 和 cow 参数,则返回该位置(column, cow)的组件的限定矩形描述


-- 如果指定 4 个参数,则返回从(column, cow)到(col2, row2)所有组件的限定矩形描述


-- 例如 grid_bbox(0, 0, 1, 1) 返回的是 4 个组件所在的限定矩形




grid_columnconfigure(index, options)



-- 设置列的属性


-- 注意:设置的是该组件所拥有的 grid 的列


-- 可以设置的选项及含义如下:




















选项

含义
minsize 指定该列的最小宽度
pad 指定该列中最大网格的水平边距
weight 1. 指定列与列之间的相对距离

2. 默认值是 0

3. 这个你比较难理解,小甲鱼还是详细解说下:初创建窗口的时候,grid 会自动根据组件的尺寸分配窗口的尺寸,当你拉伸窗口的尺寸时就会有空白显示出来。这个选项正是指定列与列之间是否填充空白,默认是不填充的。另外,该选项的值是指定填充空白的倍数,例如
weight = 2 的列会比 weight = 1 的列填充多一倍的空白。所以需要平均填充的话,只需要所有的列都设置 weight = 1
即可。





grid_configure(options)


-- 跟 grid() 一样




grid_forget()


-- 将组件从屏幕中“删除”


-- 并没有销毁该组件,只是看不到了


-- 可以通过 grid 或其他布局管理器显示已“删除”的组件,但该组件所在网格的选项设置不会恢复




grid_info()


-- 以字典的形式返回当前 grid 的选项




grid_location(x, y)


-- 返回位于(或接近)给定坐标(x, y)的网格位置


-- 返回值是一个 2 元组表示网格对应的(列,行)




grid_propagate(flag)


-- 如果开启,父组件会自动调节尺寸以容纳所有子组件


-- 默认值是开启(flag = True)


-- 该方法仅适用于父组件




grid_remove()


-- 跟 grid_forget() 一样,但恢复的时候会记住该组件所在网格的选项设置




grid_rowconfigure(index, options)



-- 设置行的属性


-- 注意:设置的是该组件所拥有的 grid 的行


-- 可以设置的选项及含义如下:
























选项

含义
minsize 指定该行的最小高度
pad 指定该列中最大网格的垂直边距
weight 1. 指定行与行之间的相对距离

2. 默认值是 0

3. 这个你比较难理解,不懂可以参考上边 grid_columnconfigure() 的详细解释





grid_size()


-- 返回该组件所拥有的 grid 的尺寸


-- 返回值是一个 2 元组,表示(列, 行)分别的网格数




grid_slaves(row=None, column=None)


-- 以列表的形式返回该组件的所有子组件


-- 该方法仅适用于父组件


Place

功能

通常情况下不建议使用 place 布局管理器,因为对比起 pack 和 grid,place 要做更多的工作。不过纯在即合理,place 在一些特殊的情况下可以发挥妙用。请看下边例子。

用法

将子组件显示在父组件的正中间:

from tkinter import *

root = Tk()

def callback():
    print("正中靶心")

Button(root, text="点我", command=callback).place(relx=0.5, rely=0.5, anchor=CENTER)

mainloop()

在某种情况下,或许你希望一个组件可以覆盖另一个组件,那么 place 又可以派上用场了。下边例子我们演示用 Button 覆盖 Label 组件:

photo = PhotoImage(file="logo_big.gif")
Label(root, image=photo).pack()

Button(root, text="点我", command=callback).place(relx=0.5, rely=0.5, anchor=CENTER)

应该不难看出,relx 和 rely 选项指定的是相对于父组件的位置,范围是 00 ~ 1.0,因此 0.5 表示位于正中间。那么 relwidth 和 relheight 选项则是指定相对于父组件的尺寸:

Label(root, bg="red").place(relx=0.5, rely=0.5, relheight=0.75, relwidth=0.75, anchor=CENTER)
Label(root, bg="yellow").place(relx=0.5, rely=0.5, relheight=0.5, relwidth=0.5, anchor=CENTER)
Label(root, bg="green").place(relx=0.5, rely=0.5, relheight=0.25, relwidth=0.25, anchor=CENTER)


上图无论你如何拉伸改变窗口,三个 Label 的尺寸均会跟着改变(神同步~)。x 和 y 选项用于设置偏移(像素),如果同时设置 relx(rely)和 x(y),那 place 将优先计算 relx 和 rely,然后再实现 x 和 y 指定的偏移值。

方法说明

注:下边所有方法适用于所有组件
place(**options)
-- 下方表格详细列举了各个选项的具体含义和用法:





















































选项

含义
anchor 1. 控制组件在 place 分配的空间中的位置

2. N, NE, E, SE, S, SW, W, NW, 或 CENTER 来定位(EWSN代表东西南北,上北下南左西右东)

3. 默认值是 NW
bordermode 1. 指定边框模式(INSIDE 或 OUTSIDE)

2. 默认值是 INSIDE
height 指定该组件的高度(像素)
in_ 1. 将该组件放到该选项指定的组件中

2. 指定的组件必须是该组件的父组件
relheight 1. 指定该组件相对于父组件的高度

2. 取值范围 0.0 ~ 1.0
relwidth 1. 指定该组件相对于父组件的宽度

2. 取值范围 0.0 ~ 1.0
relx 1. 指定该组件相对于父组件的水平位置

2. 取值范围 0.0 ~ 1.0
rely 1. 指定该组件相对于父组件的垂直位置

2. 取值范围 0.0 ~ 1.0
width 指定该组件的宽度(像素)
x 1. 指定该组件的水平偏移位置(像素)

2. 如同时指定了 relx 选项,优先实现 relx 选项
y 1. 指定该组件的垂直偏移位置(像素)

2. 如同时指定了 rely 选项,优先实现 rely 选项


place_configure(**options)
-- 跟 place() 一样
place_forget()
-- 将组件从屏幕中“删除”
-- 并没有销毁该组件,只是看不到了
-- 可以通过 place 或其他布局管理器显示已“删除”的组件
place_info()
-- 以字典的形式返回当前 place 的选项
place_slaves()
-- 以列表的形式返回该组件的所有子组件
-- 该方法仅适用于父组件
slaves()
-- 跟 place_slaves() 一样

标准对话框

Tkinter 为了提供了三种标准对话框模块,它们分别是:

  • messagebox
  • filedialog
  • colorchooser

注:这三个模块原来是独立的,分别是 tkMessageBox、tkFileDialog 和 tkColorChooser,需要导入才能使用。在 Python3 之后,这些模块全部被收归到 tkinter 模块的麾下。下边的所有演示都是在 Python3 下实现,如果你用的是 Python2.x,请在文件头 import tkMessageBox,然后将 messagebox 替换为 tkMessageBox 即可。

messagebox消息对话框

用法

askokcancel(title, message, options)
askquestion(title, message, options)
askretrycancel(title, message, options)
askyesno(title, message, options)
showerror(title, message, options)
showinfo(title, message, options)
showwarning(title, message, options)

参数

所有的这些函数都有相同的参数:


  • title 参数毋庸置疑是设置标题栏的文本

  • message 参数是设置对话框的主要文本内容,你可以用 '\n' 来实现换行

  • options 参数可以设置的选项和含义如下表所示


























选项

含义
default 1. 设置默认的按钮(也就是按下回车响应的那个按钮)

2. 默认是第一个按钮(像“确定”,“是”或“重试”)

3. 可以设置的值根据对话框函数的不同可以选择:CANCEL,IGNORE,OK,NO,RETRY 或 YES
icon 1. 指定对话框显示的图标

2. 可以指定的值有:ERROR,INFO,QUESTION 或 WARNING

3. 注意:不能指定自己的图标
parent 1. 如果不指定该选项,那么对话框默认显示在根窗口上

2. 如果想要将对话框显示在子窗口 w 上,那么可以设置 parent=w







返回值






askokcancel(),askretrycancel() 和 askyesno() 返回布尔类型的值:

  • 返回 True 表示用户点击了“确定”或“是”按钮

  • 返回 False 表示用户点击了“取消”或“否”按钮






askquestion() 返回“yes”或“no”字符串表示用户点击了“是”或“否”按钮




showerror(),showinfo() 和 showwarning() 返回“ok”表示用户按下了“是”按钮

filedialog文件对话框

用法

当你的应用程序需要使用打开文件或保存文件的功能时,文件对话框显得尤为重要。
实现起来就是这样:

from tkinter import *

root = Tk()

def callback():
    fileName = filedialog.askopenfilename()
    print(fileName)

Button(root, text="打开文件", command=callback).pack()

mainloop()


filedialog 模块提供了两个函数:askopenfilename(**option) 和 asksaveasfilename(**option),分别用于打开文件和保存文件。

参数

两个函数可供设置的选项是一样的,下边列举了可用的选项及含义:





























选项

含义
defaultextension 1. 指定文件的后缀

2. 例如:defaultextension=".jpg",那么当用户输入一个文件名 "FishC" 的时候,文件名会自动添加后缀为 "FishC.jpg"

3. 注意:如果用户输入文件名包含后缀,那么该选项不生效
filetypes 1. 指定筛选文件类型的下拉菜单选项

2. 该选项的值是由 2 元祖构成的列表

3. 每个 2 元祖由(类型名,后缀)构成,例如:filetypes=[("PNG", ".png"), ("JPG", ".jpg"), ("GIF",
".gif")]
initialdir 1. 指定打开/保存文件的默认路径

2. 默认路径是当前文件夹
parent 1. 如果不指定该选项,那么对话框默认显示在根窗口上

2. 如果想要将对话框显示在子窗口 w 上,那么可以设置 parent=w
title 指定文件对话框的标题栏文本







返回值




1. 如果用户选择了一个文件,那么返回值是该文件的完整路径


2. 如果用户点击了取消按钮,那么返回值是空字符串




colorchooser颜色选择对话框

用法

颜色选择对话框提供一个友善的界面让用户选择需要的颜色,大家看下例子:

from tkinter import *

root = Tk()

def callback():
    fileName = colorchooser.askcolor()
    print(fileName)

Button(root, text="选择颜色", command=callback).pack()

mainloop()

参数

askcolor(color, **option) 函数的 color 参数用于指定初始化的颜色,默认是浅灰色;
option 参数可以指定的选项及含义如下:

















选项

含义
title 指定颜色对话框的标题栏文本
parent 1. 如果不指定该选项,那么对话框默认显示在根窗口上

2. 如果想要将对话框显示在子窗口 w 上,那么可以设置 parent=w







返回值






1. 如果用户选择一个颜色并按下“确定”按钮后,返回值是一个 2 元祖,第 1 个元素是选择的 RGB 颜色值,第 2 个元素是对应的 16 进制颜色值


2. 如果用户按下“取消”按钮,那么返回值是 (None, None)


原文地址:https://www.cnblogs.com/wbyixx/p/11987250.html