Widgets
基本组件
本章介绍了几乎可以在任何用户界面中找到的基本 Tk 组件:框架、标签、按钮、复选按钮、单选按钮、输入框和组合框。最后,您将知道如何使用典型的表单类型绘制用户界面所需的所有组件。
您会发现按顺序阅读本章(以及后面讨论更多组件的章节)是最容易的。因为许多组件之间有很多共性,所以在描述一个组件时,我们将介绍某些概念,这些组件也适用于我们稍后描述的组件。与其在同一领域多次讨论,我们将回顾一下这个概念最初是什么时候被引入的。
在介绍每个组件时,我们将参考特定组件的组件综述页面,以及 Tk 参考手册页。作为提醒,本教程重点介绍了Tk最有用的部分以及如何使用它们来构建有效的现代用户界面。参考文档详细说明了可以在 Tk 中完成的所有内容,其目的非常不同。
框架
- 组件综述
- 参考手册
框架是一个显示为简单的矩形的组件。框架有助于在视觉和编码级别组织您的用户界面。框架通常充当几何管理器的主窗口组件grid,例如管理框架中包含的从属窗口组件。
框架组件。
框架是使用**ttk.Frame**
类创建的:
frame = ttk.Frame(parent)
框架可以采用几种不同的配置选项,这可以改变它们的显示方式。
尺寸
通常,框架的大小由其中的所有组件的大小和布局决定。反过来,这由管理框架本身内容的几何管理器控制。
如果出于某种原因,您想要一个不包含其他组件的空框架,您可以改为使用width
和/或height
配置选项显式设置其大小 (否则,您最终会得到一个非常小的框架)。
屏幕距离(例如宽度和高度)通常指定为屏幕像素数。您还可以通过几个后缀之一指定它们。例如,350
表示 350 像素,350c
表示 350 厘米,350m
表示 350 毫米,350i
表示 350 英寸,350p
表示 350 个打印机点(1/72 英寸)。
请记住,如果您要求框架(或任何组件)具有给定的大小,则几何管理器拥有最终决定权。如果事情没有按照您想要的方式显示,请确保也检查一下。
填充
该padding
配置选项用于在组件内部的周围请求额外的空间。如果您将其他组件放在框架内,则始终会有一点边距。您可以为所有边指定相同的内边距、不同的水平和垂直内边距或分别为每边指定内边距。
f['padding'] = 5 # 5 pixels on all sides
f['padding'] = (5,10) # 5 on left and right, 10 on top and bottom
f['padding'] = (5,7,10,12) # left: 5, top: 7, right: 10, bottom: 12
边框
您可以在框架组件周围显示边框,以在视觉上将其与其周围环境分开。您会看到这通常使用户界面的一部分看起来凹陷或凸起。为此,您需要设置borderwidth
配置选项(默认为 0,即无边框),以及relief
指定边框视觉外观的选项。这可以是以下之一:( flat
默认)raised
、sunken
、solid
、ridge
、 或groove
。
frame['borderwidth'] = 2
frame['relief'] = 'sunken'
改变风格
Frames 有一个style
配置选项,这对所有主题组件都是通用的。这使您可以控制其外观或行为的许多其他方面。这有点高级,所以我们现在不会详细介绍它。但这里有一个快速示例,用于创建带有红色背景和凸起边框命名为“Danger”框架。
s = ttk.Style()
s.configure('Danger.TFrame', background='red', borderwidth=5, relief='raised')
ttk.Frame(root, width=200, height=200, style='Danger.TFrame').grid()
样式标志与“经典”Tk 组件更改外观的方式截然不同。在经典 Tk 中,您可以提供广泛的选项来精细地控制单个组件行为的各个方面,例如,前景色、背景色、字体、突出显示粗细、选定的前景色和填充。使用新的主题组件时,这些更改是通过修改样式来实现的,而不是为每个组件添加选项。
因此,您在某些经典组件中可能熟悉的许多选项在新的主题版本中不存在。但是,过度使用此类选项是破坏 Tk 应用程序外观的关键因素,尤其是在跨不同平台使用时。从经典组件过渡到主题组件提供了一个适当的时间来审查和改进如何(以及是否!)进行此类外观更改。
标签
一个标签是一个组件,显示文本或图像,通常用户只会查看但不能用其他方式进行交互。标签用于识别用户界面的控件或其他部分,提供文本反馈或结果等。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I6JqXXym-1628473307100)(https://tkdocs.com/images/w_label_all.png)]
标签组件。
标签是使用**ttk.Label**
类创建的。通常,标签将显示的文本或图像同时通过配置选项指定:
label = ttk.Label(parent, text='Full name:')
与框架一样,标签可以采用多种不同的配置选项,这可以改变它们的显示方式。
显示文本
text
配置选项(创建标签时如上所示)是最常用的,尤其是当该标记是纯粹的装饰或说明。您可以通过修改此配置选项来更改显示的文本。这可以随时完成,而不仅仅是在第一次创建标签时。
您还可以让组件监视脚本中的变量。任何时候变量发生变化,标签都会显示变量的新值。这是通过以下textvariable
选项完成的:
resultsContents = StringVar()
label['textvariable'] = resultsContents
resultsContents.set('New value to display')
Tkinter 只允许您将组件附加到StringVar
类的实例,而不是任意的 Python 变量。这个类包含所有的逻辑来观察变化并在变量和 Tk 之间来回传递它们。使用get
和set
方法读取或写入变量的当前值。
显示图像
标签还可以显示图像而不只是文本。如果您只想在您的用户界面中显示图像,通常是这样做的:我们将在后面的章节中更详细地介绍图像,但现在,让我们假设您要显示存储在磁盘文件中的 GIF。这是一个两步过程。首先,您将创建一个图像“对象”。然后,您可以通过其image
配置选项告诉标签使用该对象:
image = PhotoImage(file='myimage.gif')
label['image'] = image
标签还可以同时显示图像和文本。您会经常在工具栏按钮中看到这一点。为此,请使用 compound
配置选项。默认值为none
,表示仅显示图像(如果存在);如果没有图像,则显示由text
或 textvariable
选项指定的文本。该compound
选项的其他可能值包括:(text
仅文本)、image
(仅图像)、center
(文本在图像中心)、 top
(图像在文本上方)left
、bottom
、 和right
。
label['compound'] = 'right'
字体、颜色等
与框架一样,您通常不想直接更改字体和颜色等内容。如果您需要更改它们(例如,创建特殊类型的标签),首选方法是创建一个新样式,然后由带有style
选项的组件使用。
与大多数主题组件不同,标签组件还提供明确的特定配置选项。同样,当使用样式不一定有意义时,您应该仅在特殊的一次性情况下使用这些配置选项。
您可以使用font
配置选项指定标签文本的字体。我们将在后面的章节中更详细地介绍字体,这里是一些您可以使用的预定义字体的名称:
TkDefaultFont
:
未另行指定的所有 GUI 项目的默认值。TkTextFont
:
用于输入框组件、列表框等。TkFixedFont
:
一种标准的固定宽度字体。TkMenuFont
:
用于菜单项的字体。TkHeadingFont
:
列表和表格中列标题的字体。TkCaptionFont
:
窗口和对话框标题栏的字体。TkSmallCaptionFont
:
子窗口或工具对话框的较小标题。TkIconFont
:
图标标题的字体。TkTooltipFont
:
工具提示字体。
因为字体选择是特定于平台的,所以要小心硬编码细节(字体系列、大小等)。您会在许多较旧的 Tk 程序中会看到的这些,它们会使它们看起来很丑陋。
label['font'] = "TkDefaultFont"
标签的前景(文本)和背景颜色也可以通过foreground
和 background
配置选项进行更改。稍后会详细介绍颜色,但您可以将它们指定为颜色名称(例如red
)或十六进制 RGB 代码(例如#ff340a
)。
标签也接受框架的配置选项relief
,使它们看起来凹陷或凸起。
布局
虽然标签的整体布局(即它在用户界面中的位置和大小)由几何管理器确定,但有几个选项可以帮助您控制标签在几何管理器的矩形内的显示方式给它。
如果提供给标签的框大于标签对其内容的要求,您可以使用该anchor
选项指定标签应附加到哪个边缘或角落,这将在相对的边缘或角落留下一些空白空间。可能的值被指定为罗盘方向:n
(北或上边缘)、ne
(东北或右上角) e
、se
、s
、sw
、w
、nw
或center
。
如果没有出现在您认为应该出现的地方?可能是几何管理器没有将标签放在您认为的位置。例如,如果您使用的是grid
,则可能需要调整sticky
选项。调试时,它可以帮助更改每个组件的背景颜色,以便您准确了解每个组件的位置。这是我们刚刚提到的那些“一次性”案例的一个很好的例子,您可以使用配置选项而不是样式来修改外观。
多行标签
标签可以显示多于一行的文本。为此,请在text
(or textvariable
) 字符串中嵌入回车符 (\n
) 。标签还可以通过wraplength
选项自动将您的文本换行成多行,该选项指定行的最大长度(以像素、厘米等为单位)。
多行标签是经典 Tk 中旧组件message
的替代品。
您还可以通过justify
选项控制文本的对齐方式。它可以具有值left
, center
, 或right
。如果您只有一行文本,您可能需要指定anchor
选项。
按钮
按钮不同于框架或标签,经常与之交互, 用户按下按钮以执行操作。与标签一样,它们可以显示文本或图像,但接受其他选项来更改其行为。
按钮组件。
按钮是使用**ttk.Button**
类创建的:
button = ttk.Button(parent, text='Okay', command=submitForm)
通常,它们的内容和命令回调是同时指定的。与其他组件一样,按钮可以采用多种不同的配置选项,包括可以改变其外观和行为的标准选项style
。
文字或图片
按钮采用与标签相同的text
、textvariable
(很少使用)、image
和compound
配置选项。这些控制按钮是否显示文本和/或图像。
按钮有一个default
配置选项。如果指定为active
,这会告诉 Tk 该按钮是用户界面中的默认按钮;否则就是normal
。如果用户按下 Enter 键,则会调用默认按钮)。某些平台和样式会使用不同的边框或突出显示来绘制此默认按钮。请注意,设置此选项不会创建使 Enter 键激活按钮的事件绑定;你必须自己做。
命令回调
command
选项将按钮的操作关联到您的应用程序。当用户按下按钮时,由解释器运行选项提供的脚本。
您还可以要求按钮从您的应用程序调用回调命令。这样,您就不需要在程序中重复多次调用的命令。如果您更改附加到按钮的命令,您也不需要在其他地方更改它。听起来像是在我们的默认按钮上添加事件绑定的方法,不是吗?
action = ttk.Button(root, text="Action", default="active", command=myaction)
root.bind('<Return>', lambda e: action.invoke())
大多数平台上对话框和许多其他窗口的标准行为是在窗口上设置一个绑定,以便返回键(<Return>
或<Key-Return>
)调用活动按钮(如果存在),正如我们在此处所做的那样。如果有“关闭”或“取消”按钮,则创建到 Escape 键 ( <Key-Escape>
)的绑定。
按钮状态
按钮和许多其他组件以正常状态开始。按钮将响应鼠标移动,可以被按下,并将调用其命令回调。按钮也可以进入禁用状态,即按钮变灰、不响应鼠标移动且无法按下。当其命令在给定时间点不适用时,您的程序将禁用该按钮。
所有主题组件都保持一个内部状态,表示为一系列二进制标志。每个标志都可以设置(打开)或清除(关闭)。您可以设置或清除这些不同的标志,并使用state
和instate
方法检查当前设置。按钮使用disabled
标志来控制用户是否可以按下按钮。例如:
b.state(['disabled']) # set the disabled flag
b.state(['!disabled']) # clear the disabled flag
b.instate(['disabled']) # true if disabled, else false
b.instate(['!disabled']) # true if not disabled, else false
b.instate(['!disabled'], cmd) # execute 'cmd' if not disabled
请注意,这些命令接受一组状态标志作为它们的参数。
主题组件的状态标志的完整列表是:active,disabled,focus,pressed,selected, background,readonly,alternate,和invalid。这些在主题组件参考中进行了描述 。虽然所有组件都具有相同的一组状态标志,但并非所有状态对所有组件都有意义。也可以在state和instate方法中花哨并同时指定多个状态标志。
该state和instate方法取代老式的state配置选项(值normal或 disabled)。
该配置选项实际上仍然可用于 Tk 8.5 中的主题组件,但“只写”,这意味着更改选项会调用适当的state命令。它主要是为了方便起见,因此您可以指定在首次创建组件时应禁用它。但是,使用新state 命令所做的任何更改都不会更新配置选项。为避免混淆,您应该更新代码以对所有主题组件使用新的状态标志。
复选按钮
- 组件综述
- 参考手册
一个checkbutton widget是像一个普通的按钮,还拥有某种类型的(即,切换)的二进制值。按下时,复选按钮会翻转开关,然后调用其回调。Checkbutton 组件经常用于允许用户打开或关闭选项。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dVZY3bNV-1628473307110)(https://tkdocs.com/images/w_checkbutton_all.png)] 复选按钮组件。
复选按钮是使用**ttk.Checkbutton**该类创建的。通常,它们的内容和行为是同时指定的:
measureSystem = StringVar()
check = ttk.Checkbutton(parent, text='Use Metric',
command=metricChanged, variable=measureSystem,
onvalue='metric', offvalue='imperial')
Checkbuttons 使用许多与常规按钮相同的选项,但增加了text,textvariable, image,和compound配置选项控制标签(复选框旁本身)的显示。同样,该command选项允许您指定每次用户切换复选按钮时要调用的命令;并且该 invoke方法也将执行相同的命令。该state和instate方法允许你操作disabled状态标志来启用或禁用checkbutton。
组件值
与普通按钮不同,复选按钮也持有一个值。我们之前已经看到该textvariable选项如何将组件的标签链接到程序中的变量。variable用于checkbuttons选项的行为类似,除了其链接到该窗口组件的当前值的变量。每当切换组件时,该变量就会更新。默认情况下,复选按钮使用1表示组件被选中和0表示未选中时的值。可以使用onvalue和offvalue选项将这些更改为其他内容。
复选按钮不会自动设置(或创建)链接变量。因此,您的程序需要将其初始化为适当的起始值。
当复选按钮不包含 onvalue或 offvalue(甚至不存在)时会发生什么?在这种情况下,复选按钮被置于特殊的“三态”或不确定模式。在此模式下,复选框可能会显示单个破折号,而不是空的或保留复选标记。在内部,状态标志alternate已设置,您可以通过以下instate
方法检查:
check.instate(['alternate'])
虽然我们一直在使用StringVar
该类的实例,但Tkinter 可以保存为布尔值、整数或浮点数的变量类。但如果将其存储在其它的数据类型,则可以选择其他 API。都是基类Variable
的子类。
我们在英尺到米的示例中看到,您可以调用Variable
的get
方法来检索其值或set
方法提供新值。您还可以在实例化它时提供一个初始值。
s = StringVar(value="abc") # default value is ''
b = BooleanVar(value=True) # default is False
i = IntVar(value=10) # default is 0
d = DoubleVar(value=10.5) # default is 0.0
单选按钮
一个单选按钮控件可以让你的几个互相排斥的选项中任选一种。与复选按钮不同,它们不仅限于两个选项。单选按钮总是在一组中一起使用,其中多个单选按钮组件绑定到一个选择或首选项。它们适合在选项数量相对较少时使用,例如 3-5。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WmTDnnBh-1628473307113)(https://tkdocs.com/images/w_radiobutton_all.png)]
单选按钮组件。
单选按钮是使用**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
选项。集合中的每个单选按钮将具有相同的链接变量,但具有不同的值。当变量保存匹配值时,该单选按钮将在视觉上表明它已被选中。如果不匹配,单选按钮将被取消选中。如果链接变量不存在,或者您没有指定variable
选项,单选按钮也会显示为“三态”或不确定。这可以通过alternate
状态标志来检查。
输入框
输入框组件给用户提供了单行文本字段。这些可以是任何东西:姓名、城市、密码、社会安全号码等。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DuTipo2H-1628473307119)(https://tkdocs.com/images/w_entry_all.png)]
入口组件。
输入框是使用**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
。要监视更改,您应该监视链接变量的更改。另请参阅下面的“验证”。
def it_has_been_written(*args):
...
username.trace_add("write", it_has_been_written)
如果您坚持使用如上所示的简单用法trace_add
,您会没事的。您可能想知道这是一个更复杂的系统的一小部分,用于观察变量并在读取、写入或删除时调用回调。您可以触发多个回调、添加或删除它们 ( trace_remove
) 以及内省它们 ( trace_info
)。
这些方法也取代现在不推荐不应该使用的一套旧方法(trace
,trace_variable
,trace_vdelete
和trace_vinfo
)。
Tkinter 允许您观察 a StringVar
(或 任何子类Variable
)的变化。旧的和新的跟踪工具都是 Tcltrace命令的一个非常薄(而且不是非常 Pythonic)的前端。
密码
输入框可用于密码,其中实际内容显示为项目符号或其他符号。为此,请将show
配置选项设置为您要显示的字符。
passwd = ttk.Entry(parent, textvariable=password, show="*")
组件状态
与各种按钮一样,输入框也可以通过state
命令进入禁用状态(并使用 查询instate
)。输入框也可以使用状态标志readonly
;如果设置,用户无法更改输入框,但他们仍然可以选择其中的文本(并将其复制到剪贴板)。还有一个invalid
状态,如果输入框组件未通过验证,则设置,这导致我们…
验证
用户可以在输入框组件中键入他们喜欢的任何文本。但是,如果您想限制他们可以在输入框中输入的内容,您可以使用验证来实现。例如,一个输入框可能只接受一个整数或一个有效的邮政编码。
您的程序可以指定什么使输入框有效或无效,以及何时检查其有效性。我们很快就会看到,两者是相关的。我们将从一个简单的例子开始,一个最多只能容纳五位数的整数的输入框。
验证标准是通过输入框的validatecommand
配置选项指定的。您提供一段代码,其工作是验证输入框。它的功能类似于组件回调或事件绑定,不同之处在于它返回一个值(无论输入框是否有效)。我们将安排验证任何击键的输入框,这是通过向配置选项提供值key
来指定的validate
。
import re
def check_num(newval):
return re.match('^[0-9]*$', newval) is not None and len(newval) <= 5
check_num_wrapper = (root.register(check_num), '%P')
num = StringVar()
e = ttk.Entry(root, textvariable=num, validate='key', validatecommand=check_num_wrapper)
e.grid(column=0, row=0, sticky='we')
有几件事值得注意。首先,与事件绑定一样,我们可以通过百分比替换访问有关触发验证的条件的更多信息*。*我们在这里使用了其中之一: 如果验证通过%P
,则是输入框的新值。我们将使用一个简单的正则表达式和长度检查来确定更改是否有效。为了拒绝更改,我们的验证命令可以返回一个假值,并且输入框将保持不变。
利用这些百分比替换需要一些体操。您会记得 Tkinter 抽象出事件绑定回调中的百分比替换。在那里,所有事件参数都被包装到一个事件对象中,该对象始终传递给回调。验证回调没有等效的抽象。相反,我们必须选择我们感兴趣的替代百分比。该register
方法(可以在任何组件上调用,而不仅仅是 root
)创建一个 Tcl 过程,它将调用我们的 Python 函数。我们选择的替换百分比将作为参数传递给它。
让我们扩展我们的示例,以便输入框接受美国邮政编码,格式为“#####”或“#####-####”(“#”可以是任何数字)。我们仍然会对每次击键进行一些验证(只允许输入数字或连字符)。但是,我们不能再在每次击键时完全验证输入;如果他们刚刚输入了第一个数字,则它还无效。所以完全验证只会在输入框失去焦点时发生(例如,用户离开它)。Tk 将此称为revalidation,与预**验证(接受每次击键时的更改)相反。
我们应该如何应对错误?让我们添加一条消息,提醒用户注意格式。如果他们在没有有效邮政编码的情况下在远离输入框的地方键入了错误的键或选项卡,则会出现它。当他们返回输入框或键入有效密钥时,我们将删除该消息。我们还将添加一个(虚拟)按钮来“处理”邮政编码,除非邮政编码有效,否则该按钮将被禁用。最后,我们还将添加一个“名称”输入框,以便您可以远离 zip 输入框。
import re
errmsg = StringVar()
formatmsg = "Zip should be ##### or #####-####"
def check_zip(newval, op):
errmsg.set('')
valid = re.match('^[0-9]{5}(\-[0-9]{4})?$', newval) is not None
btn.state(['!disabled'] if valid else ['disabled'])
if op=='key':
ok_so_far = re.match('^[0-9\-]*$', newval) is not None and len(newval) <= 10
if not ok_so_far:
errmsg.set(formatmsg)
return ok_so_far
elif op=='focusout':
if not valid:
errmsg.set(formatmsg)
return valid
check_zip_wrapper = (root.register(check_zip), '%P', '%V')
zip = StringVar()
f = ttk.Frame(root)
f.grid(column=0, row=0)
ttk.Label(f, text='Name:').grid(column=0, row=0, padx=5, pady=5)
ttk.Entry(f).grid(column=1, row=0, padx=5, pady=5)
ttk.Label(f, text='Zip:').grid(column=0, row=1, padx=5, pady=5)
e = ttk.Entry(f, textvariable=zip, validate='all', validatecommand=check_zip_wrapper)
e.grid(column=1, row=1, padx=5, pady=5)
btn = ttk.Button(f, text="Process")
btn.grid(column=2, row=1, padx=5, pady=5)
btn.state(['disabled'])
msg = ttk.Label(f, font='TkSmallCaptionFont', foreground='red', textvariable=errmsg)
msg.grid(column=1, row=2, padx=5, pady=5, sticky='w')
请注意,validate
配置选项已从 更改key
为all
。这样validatecommand
不仅可以在击键时调用回调,还可以在其他触发器上调用回调。触发器使用%V
百分比替换传递给回调。回调区分key
和focusout
触发器(您也可以检查focusin
)。
关于验证,还有一些事情需要了解。首先,如果您validatecommand
生成错误(或不返回布尔值),则该组件的验证将被禁用。您的回调可以修改输入框,例如,更改其文本变量。您可以随时通过调用组件的validate
方法来要求组件进行验证,如果验证通过则返回 true(%V
替换设置为forced
)。
有一个invalidcommand
配置选项(其工作方式类似于validatecommand
),每当验证失败时都会调用该选项。您可以使用它来完成令人讨厌的事情,例如强制将焦点重新放在未验证的组件上。在实践中,它很少使用。如前所述,输入框的invalid
状态标志(可以通过该instate invalid
方法检查)会在验证成功或失败时自动更新。
其他百分比替换允许您在编辑之前获取输入框的内容 ( %s
)、区分插入和删除 ( %d
)、插入或删除发生的位置 ( %i)、插入或删除的内容 ( %S)、validate选项的当前设置( %v)和组件的名称 ( %W)。
组合框
- 组件综述
- 参考手册
一个组合框控件结合选项列表中的输入框。这让用户既可以从您提供的一组值中进行选择(例如,典型设置),也可以输入他们自己的值(例如,对于不太常见的情况)。
组合框组件。
组合框是使用**ttk.Combobox**
类创建的:
countryvar = StringVar()
country = ttk.Combobox(parent, textvariable=countryvar)
与输入框一样,该textvariable
选项将程序中的变量链接到组合框的当前值。与其他组件一样,您应该在自己的代码中初始化链接变量。
组合框将生成一个<<ComboboxSelected>>
虚拟事件,您可以在其值更改时绑定到该事件。(您还可以跟踪 上的更改textvariable
,正如我们在前面介绍的几个组件中看到的那样。绑定到事件更直接,因此往往是我们的首选。)
country.bind('<<ComboboxSelected>>', function)
预定义值
您可以提供用户可以使用values
配置选项选择的值列表:
country['values'] = ('USA', 'Canada', 'Australia')
如果设置,readonly
状态标志将限制用户只能从预定义值列表中进行选择,但不能输入自己的值(尽管如果组合框的当前值不在列表中,则不会更改) .
country.state(["readonly"])
如果您在readonly
模式下使用组合框,我建议您在值更改时(即在<<ComboboxSelected>>
事件中)调用该selection_clear
方法。如果不这样做,它在视觉上看起来有点奇怪。
您还可以使用该get
方法获取当前值,并使用该方法更改当前值set
(该方法接受一个参数,即新值)。
作为get
和set
方法的补充,您还可以使用该current
方法来确定选择了预定义值列表中的哪个项目。调用current
不带参数; 它将返回一个从 0 开始的索引到列表中,如果当前值不在列表中,则返回 -1。您可以通过调用current
一个基于 0 的索引参数来选择列表中的一个项目。