– 使用Tk的Tcl / Tk-Graphical用户界面的Python接口(Python教程)(参考资料)
tkinter
– Tcl / Tk的Python接口
源代码: Lib / tkinter / __ init__.py
tkinter
包(“Tk接口”)是Tk GUI工具包的标准Python接口。Tk和tkinter
适用于大多数Unix平台以及Windows系统。(Tk本身不是Python的一部分;它是在ActiveState上维护的。)
运行python -m tkinter
从命令行应该打开一个窗口来演示一个简单的Tk界面,让你知道tkinter
已正确安装在您的系统上,并且还显示了安装了哪个版本的Tcl / Tk,因此您可以阅读特定于该版本的Tcl / Tk文档.
也可以看看
Tkinter文档:
- Python Tkinter资源
- Python Tkinter主题指南提供了大量有关使用Tk from Python和链接到其他信息源的信息.
- TKDocs
- 一些小部件的广泛教程和友好的小部件页面.
- Tninter参考:Python的GUI
- 在线参考资料.
- 来自effbot的技术文件
- 在线参考tbinter由effbot.org.
- 编程Python
- 由Mark Lutz撰写,对Tkinter有很好的报道.
- 适用于繁忙的Python开发人员的现代Tkinter
- 由Mark Rozerman撰写关于使用Python和Tkinter建立有吸引力的现代图形用户界面的书籍.
- Python和Tkinter编程
- John Grayson的书(ISBN 1-884777-81-3).
Tcl / Tk文档:
- Tk命令
- 大多数命令都可用作
tkinter
或tkinter.ttk
classes.Change’8.6’以匹配您的Tcl版本/ tk安装. - Tcl/Tk最近的手册
- 最近的Tcl / Tk手册在www.tcl.tk.
- ActiveState Tcl主页
- Tk / Tcl的开发主要发生在ActiveState.
- Tcl和Tk工具包
- 由Tcl.的发明者John Ousterhout预定
- Tcl和Tk的实用编程
- 布伦特韦尔奇的百科全书.
Tkinter模块
大多数时候, tkinter
是你真正需要的,但也可以使用许多其他模块。Tk界面位于名为_tkinter
。此模块包含Tk的低级接口,并且永远不应由应用程序员直接使用。它通常是共享库(或DLL),但在某些情况下可能与Python解释器静态链接.
除了Tk接口模块之外,tkinter
包含了许多Python模块,tkinter.constants
是最重要的模块之一。导入tkinter
会自动导入tkinter.constants
通常,使用Tkinter所需要的只是一个简单的导入语句:
import tkinter
或者,更经常:
from tkinter import *
- class
tkinter.
Tk
(screenName=None, baseName=None, className=”Tk“, useTk=1) -
Tk
class没有参数实例化。这将创建一个Tk的顶级窗口小部件,它通常是应用程序的主窗口。每个实例都有自己的相关Tcl解释器.
tkinter.
Tcl
(screenName=None, baseName=None, className=”Tk”, useTk=0)-
Tcl()
function是一个工厂函数,创建一个由Tk
class,除了它没有初始化Tksubsystem。当在环境中驱动Tcl解释器时,这通常是有用的,其中人们不想创建无关的顶层窗口,或者人们不想创建的窗口(例如没有X服务器的Unix / Linux系统)。由Tcl()
对象可以通过调用它loadtk()
方法。
其他提供Tk支持的模块包括:
tkinter.scrolledtext
- 内置垂直滚动条的文本小部件.
tkinter.colorchooser
- Dialog让用户选择颜色.
tkinter.commondialog
- 这里列出的其他模块中定义的对话框的基类.
tkinter.filedialog
- 常用对话框,允许用户指定要打开或保存的文件.
tkinter.font
- 用于帮助处理字体的实用工具
tkinter.messagebox
- 访问标准Tk对话框.
tkinter.simpledialog
- 基本对话和便利功能.
tkinter.dnd
- 拖放支持
tkinter
。这是实验性的,当它被替换为Tk DND时应该被弃用. turtle
- Tk窗口中的龟图形.
Tkinter救生圈
本节不是Tk orTkinter的详尽教程。相反,它是作为一个停止间隙,在系统上提供一些介绍性的方向.
信用卡
- Tk是约翰·奥斯特豪特在伯克利时写的
- Tkinter由Steen Lumholt和Guido van Rossum撰写.
- 这个救生圈是由弗吉尼亚大学的Matt Conway撰写的.
- HTML渲染和一些自由编辑是由Ken Manheimer的FrameMakerversion生成的.
- Fredrik Lundh详细阐述并修改了类接口描述,以便用Tk 4.2来获取它们.
- Mike Clarkson将文档转换为LaTeX,并编译了参考手册的UserInterface章节.
如何使用本节
本节设计分为两部分:前半部分(大致)覆盖背景材料,而后半部分可以作为方便参考键盘.
当试图回答“我该怎么做”这个形式的问题时,通常最好找出如何在直接Tk中做“blah”,然后将其转换回相应的tkinter
来电。Python程序员通常可以通过查看Tk文档来猜测正确的Python命令。这意味着为了使用Tkinter,你必须对Tk有所了解。此文档无法履行该角色,因此我们所能做的最好的事情就是指向存在的最佳文档。以下是一些提示:
- 作者强烈建议获取Tk手册页的副本。具体来说,
manN
目录中的手册页最有用.man3
man页面描述了Tk库的C接口,因此对脚本编写者没有特别的帮助. - Addison-Wesley出版了一本名为Tcl的书和由JohnOusterhout撰写的Tk Toolkit(ISBN 0-201-63337-X),对新手Tcl和Tk的一个很好的介绍。这本书并非详尽无遗,而且对于许多细节来说,这本书都是按照人们的要求推出的.
tkinter/__init__.py
对大多数人来说是最后的手段,但是当没有别的意义时,它可以成为一个好去处.
一个简单的Hello World程序
import tkinter as tkclass Application(tk.Frame): def __init__(self, master=None): super().__init__(master) self.master = master self.pack() self.create_widgets() def create_widgets(self): self.hi_there = tk.Button(self) self.hi_there["text"] = "Hello World\n(click me)" self.hi_there["command"] = self.say_hi self.hi_there.pack(side="top") self.quit = tk.Button(self, text="QUIT", fg="red", command=self.master.destroy) self.quit.pack(side="bottom") def say_hi(self): print("hi there, everyone!")root = tk.Tk()app = Application(master=root)app.mainloop()
(非常)快速查看Tcl / Tk
类层次结构看起来很复杂,但在实际应用中,应用程序员几乎总是引用层次结构最底层的类.
注意到
- 提供这些类是为了在一个命名空间下组织某些功能。它们不是要独立实例化的.
-
Tk
class应该只在应用程序中实例化一次。应用程序员不需要显式地实例化一个,系统会在任何其他类被实例化时创建. Widget
class不是要实例化的,它只是用于子类化来制作“真正的”小部件(在C ++中,这被称为’abstractclass’).
要使用此参考资料,有时您需要知道如何阅读Tk的短文以及如何识别Tk命令的各个部分。(参见将基本Tk映射到Tkinter 以获取tkinter
等同于下面的内容。)
Tk脚本是Tcl程序。像所有Tcl程序一样,Tk脚本只是由空格分隔的标记列表。一个Tk小部件只是它的class,options帮忙配置它,actions让它做有用的东西.
制作一个小部件在Tk中,命令总是以下形式:
classCommand newPathname options
- classCommand
- 表示要制作哪种小部件(按钮,标签,菜单……)
- newPathname
- 是此小部件的新名称。Tk中的所有名称都必须是唯一的。为了实现这一目标,Tk中的小部件以pathnames命名,就像文件系统中的文件一样。顶级窗口小部件root被称为
.
(句点),并且子节点被更多句点分隔。例如,.myApp.controlPanel.okButton
可能是小部件的名称. - options
- 配置小部件的外观,在某些情况下,配置其行为。选项以标志和值列表的形式出现。标志前面有一个’ – ‘,就像Unix shell命令标志一样,如果它们超过一个单词,则将值放在引号中.
例如:
button .fred -fg red -text "hi there" ^ ^ \______________________/ | | | class new optionscommand widget (-opt val -opt val ...)
一旦创建,它的路径名就是小部件成为新命令。这个新的小部件命令是程序员用来获取新小部件动作的句柄。在C中,你将它表示为someAction(fred,someOptions),在C ++中,你将它表示为fred.someAction(someOptions),而在Tk中,你说:
.fred someAction someOptions
注意对象名称,.fred
,以点开头
如你所料,someAction的合法值将取决于widget的类:.fred disable
如果有效fred是一个按钮(fred变灰),但如果fred是一个标签就不起作用(Tk不支持禁用标签).
someOptions的合法值取决于行动。有些动作,比如disable
,不需要参数,其他的,如文本输入框的delete
命令,需要参数来指定要删除的文本范围.
将基本Tk转换为Tkinter
button .fred =====> fred = Button()
对象的主体隐含在创建时赋予它的新名称中。在Tkinter中,明确指定了主人.
button .panel.fred =====> fred = Button(panel)
Tk中的配置选项在hyphened标签列表中给出,后跟值。在Tkinter中,options在instanceconstructor中指定为keyword-arguments,为configure调用指定keyword-args,对于已建立的实例指定为实例索引,indictionary样式。见第节设置选项设置选项.
button .fred -fg red =====> fred = Button(panel, fg="red").fred configure -fg red =====> fred["fg"] = red OR ==> fred.config(fg="red")
在Tk中,要对窗口小部件执行操作,请将窗口小部件名称用作命令,并使用操作名称跟随它,可能带有参数(选项)。在Tkinter中,您可以调用类实例上的方法来调用窗口小部件上的操作。给定小部件可以执行的动作(方法)列在tkinter/__init__.py
.
.fred invoke =====> fred.invoke()
要向打包程序(几何管理器)提供窗口小部件,请使用optionalarguments调用pack。在Tkinter中,Pack类保存所有这些功能,pack命令的各种形式作为方法实现。tkinter
从Packer中分类,因此继承了所有的包装方法。见tkinter.tix
有关Form几何管理器的其他信息的模块文档.
pack .fred -side left =====> fred.pack(side="left")
Handy Reference
设置选项
选项控制窗口小部件的颜色和边框宽度。选项可以用三种方式设置:
- 在对象创建时,使用关键字参数
-
fred = Button(self, fg="red", bg="blue")
- 创建对象后,将选项名称视为字典索引
-
fred["fg"] = "red"fred["bg"] = "blue"
- 使用config()在对象创建之后更新多个attrs的方法
-
fred.config(fg="red", bg="blue")
有关给定选项及其行为的完整说明,请参阅相关小部件的Tk联机帮助页.
注意手册页列表“每个小部件的标准选项“和”WIDGET SPECIFIC OPTIONS“。前者是许多小部件共有的选项列表,后者是与特定小部件特有的选项。标准选项记录在options(3)手册页上
在本文档中没有区分标准和小部件特定选项。某些选项不适用于某些类型的小部件。givenwidget是否响应特定选项取决于窗口小部件的类;按钮具有command
选项,标签没有.
给定窗口小部件支持的选项列在该窗口小部件的手册页中,或者可以在运行时通过调用config()
方法无需查询或通过调用keys()
该小部件上的方法。这些调用的返回值是一个字典,其键是astring的选项名称(例如,"relief"
),其值为5-tuples。
有些选项,比如bg
是具有长名称的常见选项的同义词(bg
是“背景”的简写)。通过config()
方法,速记选项的名称将返回2元组,而不是5元组。2元组的回传将包含同义词的名称和“真实”选项(例如("bg", "background")
).
索引 | 含义 | 示例 |
---|---|---|
0 | 选项名称 | "relief" |
1 | 数据库查找的选项名称 | "relief" |
2 | 选项类为databaselookup | "Relief" |
3 | 默认值 | "raised" |
4 | 当前值 | "groove" |
示例:
>>> print(fred.config()){"relief": ("relief", "relief", "Relief", "raised", "groove")}
当然,打印的字典将包括所有可用选项和它们的值。这仅仅是作为一个例子.
包装工
封隔器是Tk的几何管理机制之一。几何管理器用于指定小部件在其容器内的定位的相对位置 – 它们的相互关系master。与更麻烦的placer(这种情况不常用,我们在这里没有涉及)相比,包装商采用了定性关系规范 – above, to the left of,filling等等 – 并且一切都用来确定你的确切位置坐标.
任何尺寸masterwidget取决于里面“slave widgets”的大小。打包器用于控制从属小部件在其所包含的主控内部出现的位置。您可以将小部件打包到框架中,并将框架打包到其他框架中,以实现您想要的布局。此外,这种布置是动态调整的,以适应配置的一次性更改,一旦打包就可以了.
注意到小部件在使用几何管理器指定其几何图形之前不会显示。遗漏几何规格是一个常见的早期错误,然后在创建窗口小部件但没有出现时会感到惊讶。一个小部件只有在它应用了封隔器的pack()
方法之后才会出现.
可以使用关键字选项/值对调用pack()方法来控制其中窗口小部件将显示在其容器中,以及在调整主应用程序窗口大小时的行为方式。以下是一些例子:
fred.pack() # defaults to side = "top"fred.pack(side="left")fred.pack(expand=1)
Packer Options
有关打包器的更多信息及其可以选择的选项,请参阅John Ousterhout的书的手册页和第183页.
- anchor
- 锚型。表示包装工将每个奴隶放在其包裹中的地方.
- 扩大
- 布尔,
0
要么1
. - 填
- 法律价值:
"x"
,"y"
,"both"
,"none"
. - ipadx和ipady
- 距离 – 指定从属小部件两侧的内部填充.
- padx和pady
- 距离 – 指定从属小部件两侧的外部填充.
- side
- 合法值是:
"left"
,"right"
,"top"
,"bottom"
.
耦合小部件变量
某些小部件(如文本条目小部件)的当前值设置可以通过使用特殊选项直接连接到应用程序变量。这些选项是variable
, textvariable
, onvalue
, offvalue
和value
。这种连接有两种方式:如果变量因任何原因而改变,它所连接的小部件将被更新以反映新值.
不幸的是,在tkinter
通过variable
或textvariable
选项。唯一可行的变量是变量,这些变量是从一个名为Variable的类中继承的,在tkinter
.
已经定义了许多有用的Variable子类:StringVar
, IntVar
, DoubleVar
,和BooleanVar
。要读取这个变量的当前值,请在其上调用get()
方法,并更改其值,调用set()
方法。如果您遵循此协议,小部件将始终跟踪变量的值,而不需要进一步干预.
例如:
class App(Frame): def __init__(self, master=None): super().__init__(master) self.pack() self.entrythingy = Entry() self.entrythingy.pack() # here is the application variable self.contents = StringVar() # set it to some value self.contents.set("this is a variable") # tell the entry widget to watch this variable self.entrythingy["textvariable"] = self.contents # and here we get a callback when the user hits return. # we will have the program print out the value of the # application variable when the user hits return self.entrythingy.bind("<Key-Return>", self.print_contents) def print_contents(self, event): print("hi. contents of entry is now ---->", self.contents.get())
窗口管理器
在Tk中,有一个实用命令wm
,用于与windowmanager进行交互。wm
命令的选项允许您控制标题,位置,图标位图等内容。在tkinter
,这些命令已经作为Wm
类的方法实现。Toplevel小部件来自Wm
类,所以可以直接调用Wm
方法
要获得包含给定窗口小部件的顶层窗口,您通常只需要指向窗口小部件的主窗口。当然,如果小部件已经打包在框架内,则主控制器将不代表顶层窗口。要获取包含任意窗口小部件的toplevel窗口,可以调用_root()
方法。此方法以下划线开头,表示此函数是实现的一部分,而不是Tk功能的接口.
以下是典型用法的一些例子:
import tkinter as tkclass App(tk.Frame): def __init__(self, master=None): super().__init__(master) self.pack()# create the applicationmyapp = App()## here are method calls to the window manager class#myapp.master.title("My Do-Nothing Application")myapp.master.maxsize(1000, 400)# start the programmyapp.mainloop()
Tk选项数据类型
- 锚
- 合法值是指南针的点:
"n"
,"ne"
,"e"
,"se"
,"s"
,"sw"
,"w"
,"nw"
,还有"center"
. - 位图
- 有八个内置的命名位图:
"error"
,"gray25"
,"gray50"
,"hourglass"
,"info"
,"questhead"
,"question"
,"warning"
。要指定X位图文件名,请给出文件的完整路径,前面加上@
,如"@/usr/contrib/bitmap/gumby.bit"
. - boolean
- 您可以传递整数0或1或字符串
"yes"
或"no"
. - 回调
-
这是任何不带参数的Python函数。例如:
def print_it(): print("hi there")fred["command"] = print_it
- 颜色
- 颜色可以作为rgb.txt文件中X颜色的名称给出,或者作为以4位表示RGB值的字符串:
"#RGB"
,8位:"#RRGGBB"
,12位“"#RRRGGGBBB"
,或16位"#RRRRGGGGBBBB"
范围,其中R,G,B在此表示任何合法的十六进制数字。有关详细信息,请参阅Ousterhout的书的第160页. - cursor
- 可以使用
cursorfont.h
的标准X光标名称,不带XC_
前缀。例如,要获得一个手形光标(XC_hand2
),请使用字符串"hand2"
。你也可以指定你自己的位图和掩码文件。参见Ousterhout的书的第179页. - distance
- 屏幕距离可以用像素或绝对距离来指定。像素以数字的形式给出绝对距离为字符串,尾随字符表示单位:
c
表示厘米,i
表示英寸,m
formillimetres,p
表示打印机的点数。例如,3.5英寸表示为"3.5i"
. - 字体
- Tk使用列表字体名称格式,例如
{courier 10 bold}
。带有正数的字体大小以点为单位;带负数的大小以像素为单位测量. - geometry
- 这是一个形式为
widthxheight
的字符串,其中大多数小部件的宽度和高度都以像素为单位(小部件的字符数)显示文字)。例如:fred["geometry"] = "200x100"
. - 对齐
- 合法值是字符串:
"left"
,"center"
,"right"
,和"fill"
. - 区域
- 这是一个带有四个以空格分隔的元素的字符串,每个元素都是合法距离(见上文)。例如:
"2 3 4 5"
和"3i 2i 4.5i 2i"
和"3c 2c 4c 10.43c"
都是合法的区域. - relief
- 确定小部件的边框样式是。合法值是:
"raised"
,"sunken"
,"flat"
,"groove"
和"ridge"
. - scrollcommand
- 这几乎总是某些滚动条小部件的
set()
方法,但可以是任何一个小部件方法单个参数. - wrap:
- 必须是以下之一:
"none"
,"char"
,或"word"
.
绑定和事件
widget命令中的bind方法允许您监视某些事件,并在发生该事件类型时触发回调函数。bind方法的形式是:
def bind(self, sequence, func, add=""):
where:
- sequence
- 是一个字符串,表示目标类型的事件。(有关详细信息,请参阅绑定手册页和John Ousterhout的书的第201页).
- func
- 是一个Python函数,带有一个参数,在事件发生时被调用。一个事件实例将作为参数传递。(以这种方式部署的功能通常称为callbacks.)
- add
- 可选,
""
或"+"
。传递空字符串表示此绑定将替换与此事件关联的任何其他绑定。传递"+"
意味着将此函数添加到绑定到此事件类型的函数列表中.
例如:
def turn_red(self, event): event.widget["activeforeground"] = "red"self.button.bind("<Enter>", self.turn_red)
注意事件的widget字段是如何在turn_red()
打回来。该字段包含捕获Xevent的小部件。下表列出了您可以访问的其他事件字段,以及它们如何在Tk中表示,这在引用Tk手册页时很有用.
Tk | Tkinter事件字段 | Tk | Tkinter事件场 |
---|---|---|---|
%f | 焦点 | %A | char |
%ħ | 高度 | %E | send_event |
%K | 键码 | %K | 键符 |
%S | 状态 | %N | keysym_num |
%叔 | 时间 | %T | 型 |
%重量 | 宽度 | %的W | 插件 |
%X | X | %X | x_root |
%Y | ý | %Y | y_root |
索引参数
许多小部件需要传递“index”参数。它们在Text小部件中的特定位置使用topoint,或者在anEtry小部件中使用特定字符,或者在Menu小部件中使用特定菜单项.
- Entry小部件索引(索引,视图索引等)
- 条目小部件具有引用正在显示的文本中的字符位置的选项。您可以使用这些
tkinter
函数来访问文本小部件中的这些特殊点: - 文本小部件索引
- 文本小部件的索引表示法非常丰富,最好在Tkman中描述pages.
- Menu indexes(menu.invoke(),menu.entryconfig()等)
-
菜单的一些选项和方法操作特定的菜单项。无论何时选项或参数都需要amenu索引,您可以传入:
- 一个整数,它引用窗口小部件中条目的数字位置,从顶部开始计数,从0开始;
- 字符串
"active"
,表示当前光标下的菜单位置; - 字符串
"last"
表示最后一个菜单项; - 一个以
@
开头的整数,如@6
,其中整数被解释为菜单坐标系中的一个像素坐标; - 字符串
"none"
,表示根本没有菜单条目,最常用于menu.activate()以停用所有条目,最后, - 与菜单条目的标签模式匹配的文本字符串,从顶部进行扫描菜单到底部。请注意,这个索引类型在所有其他类型之后被考虑,这意味着标签
last
,active
或none
的菜单项的匹配可能被解释为aboveliterals,而不是
Images
对于XMM格式的图像,可以通过tkinter.Image
:
BitmapImage
的相应子类创建不同格式的图像.PhotoImage
用于PGM,PPM,GIF和PNG中的图像格式。从Tk 8.6开始支持后者.
通过file
或data
选项创建任何类型的图像(其他选项也可用).
然后可以在image
某些小部件支持选项(例如标签,按钮,菜单)。在这些情况下,Tk不会保持对图像的推断。当删除对图像对象的最后一个Python引用时,图像数据也会被删除,并且Tk将在使用图像的任何地方显示一个空框.
另见
Pillow软件包增加了对BMP,JPEG,TIFF和WebP等格式的支持.
文件处理程序
Tk允许您注册和取消注册回调函数,该函数在文件描述符上可以进行I / O时从Tk主循环中获取。每个文件描述符只能注册一个处理程序。示例代码:
import tkinterwidget = tkinter.Tk()mask = tkinter.READABLE | tkinter.WRITABLEwidget.tk.createfilehandler(file, mask, callback)...widget.tk.deletefilehandler(file)
Windows上没有此功能.
由于您不知道有多少字节可供阅读,您可能不想使用BufferedIOBase
或TextIOBase
read()
或readline()
方法,因为这些方法将坚持读取预定义数量的字节。对于套接字,recv()
或recvfrom()
方法可以正常工作;对于其他文件,使用原始读取或os.read(file.fileno(), maxbytecount)
.
Widget.tk.
createfilehandler
(file, mask, func)-
注册文件处理程序回调函数func。file参数可以是带有
fileno()
方法的对象(例如文件或套接字对象),也可以是整数文件描述符。mask参数是以下三个常量中的任何一个的ORed组合。回调调用如下:callback(file, mask)
Widget.tk.
deletefilehandler
(file)-
取消注册文件handler
tkinter.
READABLE
tkinter.
WRITABLE
tkinter.
EXCEPTION
-
// mask arguments
评论被关闭。