tkinterTcl / 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命令
大多数命令都可用作tkintertkinter.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.TkscreenName=None, baseName=None, className=”Tk, useTk=1

Tkclass没有参数实例化。这将创建一个Tk的顶级窗口小部件,它通常是应用程序的主窗口。每个实例都有自己的相关Tcl解释器.

tkinter.Tcl (screenName=None, baseName=None, className=”Tk”, useTk=0)

Tcl()function是一个工厂函数,创建一个由Tkclass,除了它没有初始化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

类层次结构看起来很复杂,但在实际应用中,应用程序员几乎总是引用层次结构最底层的类.

注意到

  • 提供这些类是为了在一个命名空间下组织某些功能。它们不是要独立实例化的.
  • Tkclass应该只在应用程序中实例化一次。应用程序员不需要显式地实例化一个,系统会在任何其他类被实例化时创建.
  • Widgetclass不是要实例化的,它只是用于子类化来制作“真正的”小部件(在C ++中,这被称为’abstractclass’).

要使用此参考资料,有时您需要知道如何阅读Tk的短文以及如何识别Tk命令的各个部分。(参见将基本Tk映射到Tkinter 以获取tkinter等同于下面的内容。)

Tk脚本是Tcl程序。像所有Tcl程序一样,Tk脚本只是由空格分隔的标记列表。一个Tk小部件只是它的classoptions帮忙配置它,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

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命令的各种形式作为方法实现。tkinterPacker中分类,因此继承了所有的包装方法。见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, offvaluevalue。这种连接有两种方式:如果变量因任何原因而改变,它所连接的小部件将被更新以反映新值.

不幸的是,在tkinter通过variabletextvariable选项。唯一可行的变量是变量,这些变量是从一个名为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, activenone的菜单项的匹配可能被解释为aboveliterals,而不是

Images

对于XMM格式的图像,可以通过tkinter.Image

  • BitmapImage的相应子类创建不同格式的图像.
  • PhotoImage用于PGM,PPM,GIF和PNG中的图像格式。从Tk 8.6开始支持后者.

通过filedata选项创建任何类型的图像(其他选项也可用).

然后可以在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上没有此功能.

由于您不知道有多少字节可供阅读,您可能不想使用BufferedIOBaseTextIOBaseread()readline()方法,因为这些方法将坚持读取预定义数量的字节。对于套接字,recv()recvfrom()方法可以正常工作;对于其他文件,使用原始读取或os.read(file.fileno(), maxbytecount).

Widget.tk.createfilehandlerfile, mask, func

注册文件处理程序回调函数funcfile参数可以是带有fileno()方法的对象(例如文件或套接字对象),也可以是整数文件描述符。mask参数是以下三个常量中的任何一个的ORed组合。回调调用如下:

callback(file, mask)
Widget.tk.deletefilehandlerfile

取消注册文件handler

tkinter.READABLE
tkinter.WRITABLE
tkinter.EXCEPTION

// mask arguments

评论被关闭。