今天看啥  ›  专栏  ›  水之心

3.1 tkinter 的基础 widgets 介绍

水之心  · 简书  ·  · 2019-12-30 21:42

1 标签:Label

标签是显示文本或图像的小部件,用户通常只能查看文本或图像,但不会与之交互。标签用于识别控件或用户界面的其他部分、提供文本反馈或结果等。

label = ttk.Label(parent, text='')

1.1 显示文本

使用配置选项 'textvariable' 进行设置,可以监视变量,以便每当变量发生更改时,标签将显示变量的新值;:

from tkinter import ttk, Tk
from tkinter import StringVar
root = Tk() # 实例化顶层 widget
result_contents = StringVar()
label = ttk.Label(root, text='你的名字')
label['textvariable'] = result_contents

需要注意的是 result_contents 仅仅支持 StringVar() 。之后可以使用 set 方法修改文本信息,使用 get 方法获得文本信息:

result_contents.set('设置新的名字') # 修改文本信息
result_contents.get()  # 获得文本信息

显示结果为:

'设置新的名字'

1.2 显示图像

您还可以在标签中显示图像,而不是文本。假设您要显示位于磁盘上文件中的 GIF 图像。这是一个两步过程,首先创建一个图像"对象",然后告诉标签通过其 "image" 配置选项使用该对象:

image = PhotoImage(file='myimage.gif')
label['image'] = image

通过 "compound" 配置选项,您可以同时使用图像和文本,正如您在工具栏按钮中经常看到的那样,。默认值为 "none" ,即如果存在时仅显示图像,否则由 "text" 或者 "textvariable" 选项指定的文本。其他选项包括 "text" (仅文本)、 "image" (仅图像)、 "center" (图像中心的文本)、 "top" (图像上方文本)、 "left" "bottom" "right"

1.3 布局(layout)

虽然标签的整体布局(即标签位于用户界面中的位置和大小)由几何管理器确定,但几个特殊的选项可以帮助您更好地控制标签在几何管理器提供的框中的显示方式。

如果提供给标签的框大于标签对其内容的要求,则可以使用 "anchor" 选项指定标签应附加到哪个边或角,这将在相反的边缘或角中留下任何空白。可能的值被指定为指南针方向: "n" (北边或上边缘)、 "ne" (东北或右上角)、 "e" "s" "sw" "w" "nw" "center"

您还可以使用 "justify" 选项控制文本的对齐方式,该选项可以具有值 "left", "center" or "right"。如果只有一行文本,这与使用 "anchor" 选项几乎相同,但多行文本更有用。

1.4 字体、颜色等

带有 "style" 选项的小部件可用来修改字体、颜色等。您可以使用 "font" 配置选项指定用于显示标签文本的字体。

字体选项

前景(文本)和背景颜色也可以通过 "foreground" "background" 选项进行更改。

2 按钮:Button

按钮 非常适合用户交互,特别是按以执行某些操作。与标签一样,它们可以显示文本或图像,但也具有用于控制其行为的一系列新选项。

使用 ttk 创建按钮。按钮函数,通常它们的内容和命令回调是同时设置的:

button = ttk.Button(parent, text='Okay', command=submitForm)

2.1 文本或图像

按钮同样有的 "text", "textvariable"(很少使用),"image" 和 "compound" 配置选项作为标签,用于控制按钮是否显示文本或图像。

按钮有一个 "default" 选项,告诉 Tk 按钮是用户界面中的默认按钮(即,如果用户点击 Enter 或 Return 将调用的按钮)。某些平台和样式会使用不同的边框或高光绘制此参数。将选项设置为 "active" 以指定这是一个默认按钮;如果该选项是默认按钮,则为 "active" 选项。常规状态为 "normal"。请注意,设置此选项不会创建事件绑定,使返回或输入键激活按钮。

2.2 命令回调

"command" 选项用于在按钮的操作和应用程序之间提供接口。当用户单击该按钮时,解释器将评估该选项提供的脚本。

还可以要求按钮从应用程序调用(invoke)命令回调。这很有用,因此您不需要重复在程序中多次调用的命令;因此,在程序中,不需要重复该命令。

button.invoke()

2.3 按钮状态

按钮和许多其他小部件可以处于正常状态,可以按下它们,也可以置于禁用状态,其中按钮灰显且无法按下。当按钮的命令在给定时间点不适用时,将执行此操作。

所有主题小部件都带有一个内部状态,这是一系列二进制标志。您可以设置或清除这些不同的标志,以及使用"状态"和"状态"方法检查当前设置。按钮使用"禁用"标志来控制用户是否可以按下该按钮。例如:

按钮状态

主题小部件可用的状态标志的列表有:"active", "disabled", "focus", "pressed", "selected", "background", "readonly", "alternate" 和 "invalid"。这些都在 主题小部件参考 中有描述。

3 复选按钮:Checkbutton

复选按钮类似于常规按钮,不同之处在于用户不仅可以按下它调用命令回调,而且还包含某种二进制值(如 toggle)。当要求用户在两个选项(例如,两个不同的值)之间进行选择时,便可使用复选按钮。

创建方法:

measureSystem = StringVar()
check = ttk.Checkbutton(parent, text='Use Metric',
                        command=metricChanged, 
                        variable=measureSystem, 
                        onvalue='metric', offvalue='imperial')

复选按钮使用的选项与常规按钮相同,但增加了一些其他选项。 "text", "textvariable","image" 和 "compound" 选项控制标签的显示(复选框本身旁边),并且 "state" 和 "instate" 方法允许您设置 " disabled" 状态标志以启用或禁用复选按钮。 同样, "command" 选项使您可以指定每次用户切换检查按钮时都要调用的脚本, "invoke" 方法也将执行相同的回调。

3.1 Widget Value

与按钮不同,复选按钮还包含一个值。 我们之前已经了解了如何使用 "textvariable" 选项将小部件的标签与程序中的变量相关联。 与之类似,复选按钮的 "variable" 选项用于读取或更改窗口小部件的当前值,并在切换窗口小部件时进行更新。 默认情况下,选中小部件时,复选按钮使用的值为 “1” ,未选中时使用的值为 “0” ,但是可以使用 "onvalue" 和 "offvalue" 选项将其更改为几乎所有值。

当链接的变量既不包含on值也不包含off值(甚至不存在)时,会发生什么? 在这种情况下,复选按钮将进入特殊的 "tristate" 或不确定模式; 您有时会在用户界面中看到此信息,其中的复选框仅包含一个破折号,而不是空白或带有复选标记。 在这种状态下,将设置状态标志 "alternate",因此可以使用 "instate" 方法进行检查:

check.instate(['alternate'])

由于复选按钮不会自动设置(或创建)链接变量,因此您的程序需要确保将变量设置为适当的起始值。

4 单选按钮:Radiobutton

单选按钮使您可以在多个互斥的选项之一之间进行选择;与选择按钮不同,它不仅限于两个选择。 单选按钮始终在一组中一起使用,当选择的数量相当少(例如3-5)时,它是一个不错的选择。

单选按钮是使用 ttk.Radiobutton 函数创建的,通常作为一个集合来创建:

phone = StringVar()
home = ttk.Radiobutton(parent, text='Home', variable=phone, value='home')
office = ttk.Radiobutton(parent, text='Office', variable=phone, value='office')
cell = ttk.Radiobutton(parent, text='Mobile', variable=phone, value='cell')

单选按钮与复选按钮共享大多数相同的配置选项。 一个例外是将 "onvalue" 和 "offvalue" 选项替换为单个 "value" 选项。 该集合中的每个单选按钮将具有相同的链接变量,但具有不同的值。 当变量具有给定值时,单选按钮将被选中,否则未选中。 当链接的变量不存在时,单选按钮还会显示 "tristate" 或不确定状态,可以通过 "alternate" 状态标志进行检查。

5 条目:Entry

Entry 为用户提供了一个单行文本字段,他们可以用来输入字符串值。 这些几乎可以是任何东西:它们的名称,城市,密码,社会保险号等等。

使用 ttk.Entry 函数创建条目:

username = StringVar()
name = ttk.Entry(parent, textvariable=username)

可以指定 "width" 配置选项,以提供条目的宽的字符数,例如,允许您为邮政编码提供一个较短的条目。

我们已经看到了 checkbutton 和 radiobutton 小部件如何与它们关联一个值。 条目也是如此,并且通常通过 "textvariable" 配置选项指定的链接变量来访问该值。 请注意,与各种按钮不同,条目旁边没有单独的文本或图像来标识它们。 为此使用单独的标签小部件。

您也可以直接获取或更改条目小部件的值,而无需通过链接变量。 "get" 方法返回当前值,"delete" 和 "insert" 方法可让您更改内容,例如

print('current value is %s' % name.get())
name.delete(0,'end')          # delete between two indices, 0-based
name.insert(0, 'your name')   # insert new text at a given index

请注意,条目小部件没有 "command" 选项,每当条目更改时,该选项都将调用回调。 要监视更改,您应该监视链接变量的更改。 另请参见下面的 "Validation"。

5.1 密码:Passwords

条目可用于密码,其中实际内容显示为项目符号或其他符号。 为此,将 "show" 配置选项设置为要显示的字符,例如 “*”。

5.2 小部件状态:Widget States

像各种按钮一样,也可以通过 "state" 命令将条目置于禁用状态(并使用 "instate" 查询)。 条目也可以使用状态标志 "readonly"; 如果设置,则用户无法更改条目,尽管他们仍然可以选择其中的文本(并将其复制到剪贴板)。 还有一个 "invalid" 状态,如果输入窗口小部件验证失败则设置。

Validation

6 组合框:Combobox

组合框将条目与用户可用的选项列表组合在一起。 这样一来,他们既可以从您提供的一组值中进行选择(例如,典型设置),又可以输入自己的值(例如,在不太常见的情况下,您不想包括在列表中)。

组合框 是使用 ttk.Combobox 函数创建的:

countryvar = StringVar()
country = ttk.Combobox(parent, textvariable=countryvar)

像条目一样, "textvariable" 选项将程序中的变量链接到组合框的当前值。 与其他小部件一样,您应该在自己的代码中初始化链接的变量。 您还可以使用 "get" 方法获取当前值,并使用 "set" 方法更改当前值(采用单个参数,即新值)。

组合框将生成一个 "<ComboboxSelected>" 虚拟事件,只要其值发生更改,便可以绑定到该虚拟事件。

country.bind('<<ComboboxSelected>>', function)

6.1 预定义值:Predefined Values

您可以使用 "values" 配置选项提供用户可以选择的值列表:

country['values'] = ('USA', 'Canada', 'Australia')

如果设置,则 "readonly" 状态标志将限制用户仅从预定义值的列表中进行选择,但不能输入自己的值(尽管如果组合框的当前值不在列表中,它将不会可以更改)。

注意:如果在 "readonly" 模式下使用组合框,则建议当值更改时(即,在 ComboboxSelected 事件上),请调用 "selection clear" 方法。

作为对 "get" 和 "set" 方法的补充,您还可以使用 "current" 方法来确定在预定义值列表中选择了哪个项目(调用 "current",不带参数,它将返回从0开始的索引到列表中;如果当前值不在列表中,则为 -1;或者选择列表中的一项(使用基于0的单个索引参数调用"current")。

7 Frame:框架

框架是显示为简单矩形的小部件。框架主要用作其他小部件的容器,这些小部件在诸如网格等几何图形管理器的控制下。

框架是使用ttk.Frame函数创建的

frame = ttk.Frame(parent)

框架可以采用几种不同的配置选项,可以改变它们的显示方式。

7.1 要求的尺寸

像任何其他小部件一样,创建后,它通过(父)几何管理器添加到用户界面。 通常,框架将向几何管理器请求的大小将由其中包含的任何小部件的大小和布局确定(这些小部件在管理框架本身内容的几何管理器的控制下)。

如果出于某种原因,您想要一个不包含其他小部件的空框架,则应该使用 "width" 或者 "height" 配置选项显式设置框架从其父几何管理器请求的尺寸(否则,最终会得到一个很小的框架)。

一般地,几何管理器的尺寸(Size)使用 "width" 或者 "height" 的配置选项进行设定,其单位默认是 pixel(像素)。比如 "350","350c","350i","350p" 分别表示“350像素”,“350厘米”,“350英寸”,“350打印机点(1/72 英寸)”。

7.2 Padding:填充

"padding" 配置选项用于在窗口小部件内部请求额外的空间。这样,如果您要在框架中放置其他小部件,则始终会有一些余量。 单个数字始终指定相同的填充,两个数字的列表可让您指定水平和垂直填充,而四个数字的列表可让您依次指定左侧,顶部,右侧和底部的填充。

frame['padding'] = (5,10)

7.3 边框:Borders

为此,您需要设置 "borderwidth" 配置选项(默认为0,因此没有边框),以及 "relief" 选项,该选项指定边框的视觉外观: "flat" (默认),"raised", "sunken" ,"solid","ridge" 或 "groove"。

frame['borderwidth'] = 2
frame['relief'] = 'sunken'

7.4 改变风格

还有一个 "style" 配置选项,这对于所有主题小部件都是通用的,它可以让您控制其外观或行为的几乎任何方面。

8 Listbox:列表框

列表框显示单行文本项的列表(通常很长),并允许用户浏览列表,选择一个或多个。

列表框是使用 Listbox 函数创建的:

L = Listbox(parent, height=10)

8.1 填充列表框项目(Populating the Listbox Items)

每个列表框都有一个 "listvariable" 配置选项,该选项允许您将变量(必须包含一个列表)链接到列表框。此列表的每个元素都是一个字符串,表示列表框中的一项。 因此,要添加,删除或重新排列列表框中的项目,您可以像处理任何其他列表( list )一样简单地操作此变量。 同样,要找出哪个项目位于列表框的第三行,只需查看 list 变量的第三个元素即可。

8.2 选择项目(Items)

您需要决定的第一件事是用户是否可以一次只选择一个项目,还是可以同时选择多个项目。这是由 "selectmode" 选项控制的:默认值是只能选择一个项("browse"),而 selectmode 为 "extended" 则允许用户选择多个项目。

要找出用户当前在列表框中选择的项目,请使用 "curselection" 方法,该方法将返回当前选择的所有项目的索引列表。这可能是一个空列表,对于选择模式为 "browse" 的列表,其长度不得超过一个项(Item)。您还可以使用 "selection includes index " 方法来检查当前是否已选择具有给定索引的项目。

要以编程方式更改选择,可以使用 "selection clear first ?last? " 方法取消选择单个项目或取消指定索引范围内的任何项目。要选择一个项目或一个范围内的所有项目,请使用 "selection set first ?last? " 方法。这两项都不会触及超出指定范围的任何项目的选择。

当用户更改选择时,将生成 "<ListboxSelect>" 虚拟事件。您可以绑定到此以执行所需的任何操作。根据您的应用程序,您可能还想绑定到双击 "Double-1" 事件,并使用它来调用当前选定项的操作。

8.3 风格化列表

像大多数“经典” Tk小部件一样,您在修改列表框外观方面具有极大的灵活性。您可以修改显示列表框项目的字体,处于正常状态,被选中,禁用小部件时项目的前景色(文本)和背景色。还有一个 "itemconfigure" 方法,使您可以更改单个项目的前景色和背景色。

8.4 保留额外的项目数据

"listvariable" 则包含将在列表框中显示的字符串。 通常,程序中的每个字符串都与其他一些数据项相关联,而您真正真正感兴趣的不是列表框中显示的字符串而是相关联的数据项。 例如,包含名称的列表框可能是呈现给用户的内容,但是您的程序确实对所选的用户对象(或ID号)感兴趣,而不是特定的名称。

我们如何将此值与显示的名称相关联? 不幸的是,列表框窗口小部件本身不提供任何功能,因此我们必须对其进行单独管理。 有两种显而易见的方法。 首先,如果保证显示的字符串是唯一的,则可以使用哈希表将名称映射到关联的对象。 因此,给定名称,您可以轻松获取关联的对象。 例如,这可能不适用于命名,但可以用于选择国家。

第二种方法是保持第二个列表与列表框中显示的字符串列表平行,该列表将保存关联的对象。 因此,字符串列表中的第一项对应于对象列表中的第一项,第二项与第二项相对应,依此类推。 您需要在另一个列表中进行的任何更改(插入,删除,重新排序)。 然后,您可以根据它们在列表中的位置,轻松地从列表项映射到基础对象。

下面看一个例子:

from tkinter import *
from tkinter import ttk
root = Tk()

# Initialize our country "databases":
#  - the list of country codes (a subset anyway)
#  - a parallel list of country names, in the same order as the country codes
#  - a hash table mapping country code to population<
countrycodes = ('ar', 'au', 'be', 'br', 'ca', 'cn', 'dk', 'fi', 'fr', 'gr', 'in', 'it', 'jp', 'mx', 'nl', 'no', 'es', 'se', 'ch')
countrynames = ('Argentina', 'Australia', 'Belgium', 'Brazil', 'Canada', 'China', 'Denmark', \
        'Finland', 'France', 'Greece', 'India', 'Italy', 'Japan', 'Mexico', 'Netherlands', 'Norway', 'Spain', \
        'Sweden', 'Switzerland')
cnames = StringVar(value=countrynames)
populations = {'ar':41000000, 'au':21179211, 'be':10584534, 'br':185971537, \
        'ca':33148682, 'cn':1323128240, 'dk':5457415, 'fi':5302000, 'fr':64102140, 'gr':11147000, \
        'in':1131043000, 'it':59206382, 'jp':127718000, 'mx':106535000, 'nl':16402414, \
        'no':4738085, 'es':45116894, 'se':9174082, 'ch':7508700}

# Names of the gifts we can send
gifts = { 'card':'Greeting card', 'flowers':'Flowers', 'nastygram':'Nastygram'}

# State variables
gift = StringVar()
sentmsg = StringVar()
statusmsg = StringVar()

# Called when the selection in the listbox changes; figure out
# which country is currently selected, and then lookup its country
# code, and from that, its population.  Update the status message
# with the new population.  As well, clear the message about the
# gift being sent, so it doesn't stick around after we start doing
# other things.
def showPopulation(*args):
    idxs = lbox.curselection()
    if len(idxs)==1:
        idx = int(idxs[0])
        code = countrycodes[idx]
        name = countrynames[idx]
        popn = populations[code]
        statusmsg.set("The population of %s (%s) is %d" % (name, code, popn))
    sentmsg.set('')

# Called when the user double clicks an item in the listbox, presses
# the "Send Gift" button, or presses the Return key.  In case the selected
# item is scrolled out of view, make sure it is visible.
#
# Figure out which country is selected, which gift is selected with the 
# radiobuttons, "send the gift", and provide feedback that it was sent.
def sendGift(*args):
    idxs = lbox.curselection()
    if len(idxs)==1:
        idx = int(idxs[0])
        lbox.see(idx)
        name = countrynames[idx]
        # Gift sending left as an exercise to the reader
        sentmsg.set("Sent %s to leader of %s" % (gifts[gift.get()], name))

# Create and grid the outer content frame
c = ttk.Frame(root, padding=(5, 5, 12, 0))
c.grid(column=0, row=0, sticky=(N,W,E,S))
root.grid_columnconfigure(0, weight=1)
root.grid_rowconfigure(0,weight=1)

# Create the different widgets; note the variables that many
# of them are bound to, as well as the button callback.
# Note we're using the StringVar() 'cnames', constructed from 'countrynames'
lbox = Listbox(c, listvariable=cnames, height=5)
lbl = ttk.Label(c, text="Send to country's leader:")
g1 = ttk.Radiobutton(c, text=gifts['card'], variable=gift, value='card')
g2 = ttk.Radiobutton(c, text=gifts['flowers'], variable=gift, value='flowers')
g3 = ttk.Radiobutton(c, text=gifts['nastygram'], variable=gift, value='nastygram')
send = ttk.Button(c, text='Send Gift', command=sendGift, default='active')
sentlbl = ttk.Label(c, textvariable=sentmsg, anchor='center')
status = ttk.Label(c, textvariable=statusmsg, anchor=W)

# Grid all the widgets
lbox.grid(column=0, row=0, rowspan=6, sticky=(N,S,E,W))
lbl.grid(column=1, row=0, padx=10, pady=5)
g1.grid(column=1, row=1, sticky=W, padx=20)
g2.grid(column=1, row=2, sticky=W, padx=20)
g3.grid(column=1, row=3, sticky=W, padx=20)
send.grid(column=2, row=4, sticky=E)
sentlbl.grid(column=1, row=5, columnspan=2, sticky=N, pady=5, padx=5)
status.grid(column=0, row=6, columnspan=2, sticky=(W,E))
c.grid_columnconfigure(0, weight=1)
c.grid_rowconfigure(5, weight=1)

# Set event bindings for when the selection in the listbox changes,
# when the user double clicks the list, and when they hit the Return key
lbox.bind('<<ListboxSelect>>', showPopulation)
lbox.bind('<Double-1>', sendGift)
root.bind('<Return>', sendGift)

# Colorize alternating lines of the listbox
for i in range(0,len(countrynames),2):
    lbox.itemconfigure(i, background='#f0f0ff')

# Set the starting state of the interface, including selecting the
# default gift to send, and clearing the messages.  Select the first
# country in the list; because the <<ListboxSelect>> event is only
# generated when the user makes a change, we explicitly call showPopulation.
gift.set('card')
sentmsg.set('')
statusmsg.set('')
lbox.selection_set(0)
showPopulation()

root.mainloop()

此示例中缺少的一个明显的事情是,尽管国家/地区列表可能很长,但其中的一部分只能同时显示在屏幕上。 要在列表中向下显示国家,您必须用鼠标拖动或使用向下箭头键。 滚动条会很好。 让我们修复它。

9 Scrollbar:滚动条

滚动条可帮助用户查看另一个窗口小部件的所有部分,其内容通常比可用屏幕空间中可以显示的内容大得多。

滚动条是使用 ttk.Scrollbar 命令创建的:

s = ttk.Scrollbar( parent, orient=VERTICAL, command=listbox.yview)
listbox.configure(yscrollcommand=s.set)

与某些工具包不同,滚动条不是另一个小部件(例如,列表框)的一部分,而是完全独立的小部件。 相反,滚动条通过调用滚动小部件上的方法与滚动小部件通信。 事实证明,滚动的小部件还需要调用滚动条上的方法。

滚动条的 "orient" 配置选项确定将其用于“水平”(horizontal)还是“垂直”(vertical)滚动。然后,您需要设置 "command" 配置选项以与滚动的窗口小部件通信。

每个可以垂直滚动的窗口小部件都包含一个名为 "yview" 的方法(那些可以水平滚动的窗口部件具有一个名为 "xview" 的方法)。

只要存在此方法,滚动条就不需要了解有关滚动小部件的任何其他信息。 操纵滚动条时,它将在方法调用上附加一些参数,指示其如何滚动以及到达什么位置等。

滚动的小部件还需要返回到滚动条,告诉它现在可见整个内容区域的百分比。除了yview和/或xview方法外,每个可滚动小部件还具有 "yscrollcommand" 和/或 "xscrollcommand" 配置选项。这用于指定方法调用,它必须是滚动条的 "set" 方法。同样,其他参数将自动添加到方法调用中。

如果出于某种原因要将滚动条从程序中移至特定位置,则可以自己调用 "set first last " 方法。向其传递介于0和1之间的两个值,指示可见内容区域的开始和结束百分比。

下面看一个例子:

from tkinter import *
from tkinter import ttk

root = Tk()
l = Listbox(root, height=5)
l.grid(column=0, row=0, sticky=(N,W,E,S))
s = ttk.Scrollbar(root, orient=VERTICAL, command=l.yview)
s.grid(column=1, row=0, sticky=(N,S))
l['yscrollcommand'] = s.set
ttk.Label(root, text="Status message here", anchor=(W)).grid(column=0, row=1, sticky=(W,E))
ttk.Sizegrip(root).grid(column=1, row=1, sticky=(S,E))
root.grid_columnconfigure(0, weight=1)
root.grid_rowconfigure(0, weight=1)
for i in range(1,101):
    l.insert('end', 'Line %d of 100' % i)
root.mainloop()

10 SizeGrip:尺寸抓取

实际上,在最后一个示例中,我们使用了一个新的小部件sizegrip。这是窗口右下角的小方框,您可以调整它的大小。

使用 ttk.Sizegrip 函数创建SizeGrips:

ttk.Sizegrip(parent).grid(column=999, row=999, sticky=(S,E))

11 Text:文本

一个文本控件(widget)为用户提供了一个区域,使用户能够进入多行文本。文本小部件是经典Tk小部件的一部分,而不是主题Tk小部件。

文本小部件是使用 Text 函数创建的:

t = Text(parent, width=40, height=10)

"width" 和 "height" 选项分别指定文本窗口小部件的请求的屏幕尺寸。文本的内容可以任意大。您可以使用 "wrap" 配置选项来控制如何处理换行:值是 "none"(无换行,文本可以水平滚动),"char"(任意字符换行)和 "word"(仅换行)出现在单词边界处)。

可以禁用文本窗口小部件,以便无法进行任何编辑。因为文本不是主题小部件,所以通常的 "state" 和"instate" 方法不可用。而是使用配置选项 "state",将其设置为 "disabled" 或 "normal"。

滚动的工作方式与列表框相同。“xscrollcommand”和“yscrollcommand”的配置选项可用于文本组件附加到水平方向和/或垂直滚动条,并且“xview”和“yview”方法可用来从滚动条调用。为了确保给定的行是可见的(即,不会滚动到视图之外),可以使用“ see index”方法,其中 index 的格式为“line number.character number”,例如,第一个为“5.0”(0 -based)第5行的字符(1-based)。

Contents:内容

文本小部件没有与之关联的链接变量,例如输入(entry)小部件。要检索整个小部件的文本内容,请调用方法 "get 1.0 end";“1.0”是一个索引到文本的 index,以及第一行的第一个字符,和“end”为最后一个字符的索引,最后一行的快捷方式。如果需要,可以传递其他索引来检索较小范围的文本。

可以使用 "insert index string" 方法将文本添加到窗口小部件;“index” 的形式再次为“ line.char”,并标记了插入文本之前的字符;使用“end”将文本添加到小部件的末尾。您可以使用 "delete start end" 方法删除一定范围的文本,其中start和end均为已描述的文本索引。

12 Progressbar:进度条

一个进度条控件提供了一种反馈给有关冗长的操作进度的用户。这可以作为可以估计的操作完成百分比显示,也可以更改为指示操作正在继续但不估计完成的显示。

使用 ttk.Progressbar 类创建 Progressbar 小部件:

p = ttk.Progressbar(parent, orient=HORIZONTAL, length=200, mode='determinate')

"orient" 选项可以是 "horizontal" 或者 "vertical"。代表水平或垂直进度条的较长轴的 "length" 选项以屏幕单位(例如像素)指定。可以将 "mode" 配置选项设置为 "determinate"(进度条将指示完成的相对进度),或者设置为 "indeterminate"(其无法知道程序在任务中的执行情况,但是我们仍然可以)希望提供反馈,说明事情仍在继续。

12.1 Determinate Progress:确定的进度

在确定模式下,您可以或多或少地向用户提供有关操作进度的准确反馈。为此,您首先需要告诉进度条该操作将执行多少 "steps",然后在进行时告诉进度条该操作进行了多远。

您可以使用 "maximum" 配置选项将总步骤数提供给进度条。这是一个默认为100的浮点数(即每步为1%)。要告诉进度条操作的距离,您将反复更改 "value" 配置选项。因此,它将从0开始,然后向上计数到您设置的最大值。这有两个细微的变化。首先,您只需将进度条的当前值存储在由进度条的 "variable" 配置选项链接到的变量中即可;这样,当您更改变量时,进度条将更新。另一种选择是将进度条的"step ?amount?" 将值增加给定 "amount" 的方法(默认为1.0)。

12.3 不确定的进度

不确定模式适用于当您无法轻松知道(或估计)长时间运行的任务的实际距离,但仍想向用户提供该操作仍在运行(或程序尚未运行)的反馈时没有崩溃)。在操作开始时,您只需要调用进度条的 "start" 方法,而在操作结束时,就可以调用其 "stop" 方法,而不是提供具体的值来指示过程中的进度。进度条将负责其余的工作。

13 Scale:刻度

一个 scale 小部件为用户提供了选择通过直接操作数值的方式。刻度小部件是使用 ttk.Scale 函数创建的:

s = ttk.Scale(parent, orient=HORIZONTAL, length=200, from_=1.0, to=100.0)

在某些方面,刻度(或称为比例尺)小部件类似于进度条,只是它们是供用户操纵的。与进度条一样,应使用“orient”配置选项和一个可选的“length”为它们指定一个方向(水平或垂直)。您还应该定义比例尺允许用户选择的数字范围。为此,请为“from”和“to”配置选项中的每一个设置一个浮点数。

您可以通过几种不同的方式来设置标尺的当前值(该值必须是“ from”和“ to”值之间的浮点值)。您可以设置(或读取以获取当前值)比例尺的 "value" 配置选项。您可以使用 "variable" 选项将比例尺链接到变量。或者,您可以调用比例尺的 "set value" 方法来更改值,或者调用 "get" 方法来读取当前值。

"command" 配置选项可以指定在更改比例时要调用的脚本。Tk每次调用此脚本时,都会自动将 scale 的当前值附加为参数(我们看到了类似的事情,在滚动条回调及其滚动的小部件上添加了额外的参数)。

与其他主题小部件一样,如果希望防止用户修改比例,则可以使用 "state disabled", "state !disabled" 和 "instate disabled" 方法。

14 Spinbox:旋钮

一个旋钮控件允许用户(从任意列表或项目)选择数字。它通过将显示当前值的类似条目的小部件与一对小的向上/向下箭头组合在一起来实现此目的,这些箭头可用于逐步浏览可能的选择范围。

Spinbox 小部件是使用 Spinbox 函数创建的:

spinval = StringVar()
s = Spinbox(parent, from_=1.0, to=100.0, textvariable=spinval)

与 scale 小部件一样,spinbox 通常用于允许用户在一定范围(使用 "from" 和 "to" 配置选项指定)之间选择一个数字,尽管它通过非常不同的用户界面。您还可以指定一个"increment",该增量控制每次单击向上或向下按钮时值更改的幅度。

像列表框或组合框一样,旋钮框也可以用于让用户从任意字符串列表中选择一个项目。可以使用 "values" 组态选项指定这些值。这与组合框的工作方式相同。指定值列表将覆盖 "from" 和 "to" 设置。

对于数字范围和任意范围,都有一个 "wrap" 选项,该选项接受一个布尔值并确定该值在超出起始值或结束值时是否应该环绕。您还可以为包含旋转框当前值的条目指定 "width"。

同样,还有关于如何在Spinbox中设置或获取当前值的选择。通常,您可以使用 "textvariable" 配置选项指定一个链接变量;像往常一样,对变量的任何更改都将反映在旋转框内,而对旋转框的任何更改都将反映在链接变量中。同样,"set value" 和 "get" 方法允许您直接设置或获取值。

使用 "command" 配置选项,您可以安排每次 Spinbox 发生变化时都被调用。

由于Spinbox不是主题的窗口小部件,因此 "state" 和 "instate" 方法不可用。相反,您可以使用 "state" 配置选项更改其状态。这可以是 "normal" 或者 "disabled" 以防止发生任何更改。




原文地址:访问原文地址
快照地址: 访问文章快照