tkinter ---到tcl/tk的python接口

源代码: Lib/tkinter/__init__.py


这个 tkinter 包(“tk interface”)是tk gui工具包的标准python接口。Tk和 tkinter 在大多数UNIX平台以及Windows系统上都可用。(tk本身不是python的一部分;它在activestate中维护。)

运行 python -m tkinter 从命令行应该打开一个演示简单tk接口的窗口,让您知道 tkinter 正确安装在您的系统上,并显示安装了什么版本的TCL/TK,因此您可以阅读特定于该版本的TCL/TK文档。

参见

t金特文件:

Python Tkinter Resources

python tkinter主题指南提供了大量关于从python使用tk的信息,并链接到tk上的其他信息源。

TKDocs

广泛的教程加上一些小部件更友好的小部件页面。

Tkinter 8.5 reference: a GUI for Python

在线参考资料。

Tkinter docs from effbot

Effbot.org支持的tkinter在线参考。

Programming Python

这本书由马克·卢茨所著,对tkinter有极好的报道。

Modern Tkinter for Busy Python Developers

MarkRoseman的书介绍了如何用Python和Tkinter构建吸引人的现代图形用户界面。

Python and Tkinter Programming

约翰·格雷森著(ISBN 1-884777-81-3)。

TCL/TK文件:

Tk commands

大多数命令可用为 tkintertkinter.ttk 类。更改“8.6”以匹配TCL/TK安装的版本。

Tcl/Tk recent man pages

www.tcl.tk上最新的tcl/tk手册。

ActiveState Tcl Home Page

TK/TCL的开发主要在Activestate进行。

Tcl and the Tk Toolkit

这本书作者是TCL的发明者约翰·奥斯特豪特。

Practical Programming in Tcl and Tk

布伦特·韦尔奇的百科全书。

TKTER模

大多数时候, tkinter 是您真正需要的,但也有一些附加模块可用。tk接口位于一个名为 _tkinter . 这个模块包含到tk的低级接口,应用程序程序员不应该直接使用它。它通常是一个共享库(或DLL),但在某些情况下可能与Python解释器静态链接。

除了tk接口模块外, tkinter 包括许多python模块, tkinter.constants 是最重要的一个。输入 tkinter 将自动导入 tkinter.constants ,因此,通常,要使用tkinter,您所需要的只是一个简单的import语句::

import tkinter

或者,更常见的是:

from tkinter import *
class tkinter.Tk(screenName=None, baseName=None, className='Tk', useTk=1)

这个 Tk 类在没有参数的情况下被实例化。这将创建一个顶层的tk小部件,它通常是应用程序的主窗口。每个实例都有自己的关联TCL解释器。

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

这个 Tcl() 函数是一个factory函数,它创建的对象与 Tk 类,但它不初始化tk子系统。在不想创建外部顶级窗口的环境中,或者在不想创建外部顶级窗口的环境中(例如没有X服务器的Unix/Linux系统),在驱动TCL解释器时,这通常非常有用。由创建的对象 Tcl() 对象可以通过调用其 loadtk() 方法。

提供TK支持的其他模块包括:

tkinter.colorchooser

对话框允许用户选择颜色。

tkinter.commondialog

此处列出的其他模块中定义的对话框的基类。

tkinter.filedialog

允许用户指定要打开或保存的文件的常用对话框。

tkinter.font

帮助处理字体的实用程序。

tkinter.messagebox

访问标准tk对话框。

tkinter.scrolledtext

内置垂直滚动条的文本小部件。

tkinter.simpledialog

基本对话框和方便功能。

tkinter.dnd

拖放支持 tkinter . 这是实验性的,当用tk dnd替换时应该被弃用。

turtle

tk窗口中的turtle图形。

t金特救生圈

本节的设计并不是关于tk或tkinter的详尽教程。相反,它的目的是作为一个止损,提供一些系统的介绍性方向。

信用:

  • TK是约翰·奥斯特胡特在伯克利写的。

  • tkinter是由斯汀·鲁姆霍尔特和吉多·范·罗森写的。

  • 这个救生器是由弗吉尼亚大学的马特·康威写的。

  • HTML呈现和一些自由编辑是由KenManheimer的一个框架制作版本生成的。

  • Fredrik Lundh详细描述并修改了类接口描述,以使它们与tk 4.2保持一致。

  • Mike Clarkson将文档转换为LaTex,并编译了参考手册的用户界面章节。

如何使用此部分

本节分为两部分设计:前半部分(大致)包含背景材料,后半部分可以作为一个方便的键盘参考。

当试图回答“我该怎么做blah”形式的问题时,通常最好找出如何在直tk中做“blah”,然后将其转换回相应的 tkinter 调用。python程序员通常可以通过查看tk文档来猜测正确的python命令。这意味着,为了使用tkinter,您必须了解一点tk。这个文档不能完成这个角色,所以我们能做的最好的就是向您指出现有的最佳文档。以下是一些提示:

  • 作者强烈建议获得tk手册的副本。具体来说,在 manN 目录是最有用的。这个 man3 手册页描述了到tk库的C接口,因此对脚本编写者没有特别的帮助。

  • Addison-Wesley出版了John Ousterhout(ISBN 0-201-63337-X)的一本书《TCL和TK工具包》,这本书对新手来说是TCL和TK的一个很好的介绍。这本书并不详尽,而且在许多细节上,它都遵循手册。

  • tkinter/__init__.py 对大多数人来说,这是最后的选择,但在没有其他意义的情况下,这是一个很好的去处。

简单的Hello World程序

import tkinter as tk

class 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 类只在应用程序中实例化一次。应用程序程序员不需要显式地实例化一个类,只要实例化任何其他类,系统就会创建一个类。

  • 这个 Widget 类不是实例化的,它只用于子类生成“实际”小部件(C++中,这称为“抽象类”)。

为了使用该参考资料,有时您需要知道如何阅读tk的短文以及如何识别tk命令的各个部分。(见章节) 将基本tk映射到tkinter 对于 tkinter 相当于下面的内容。)

tk脚本是tcl程序。像所有TCL程序一样,tk脚本只是由空格分隔的令牌列表。tk小部件只是它的 classes , the option 帮助配置它,以及 行动 这使得它可以做一些有用的事情。

要在tk中生成小部件,命令的格式始终为:

classCommand newPathname options
类命令

指示要制作哪种小部件(按钮、标签、菜单…)

新路径名

是此小部件的新名称。tk中的所有名称都必须是唯一的。为了帮助实现这一点,tk中的小部件命名为 路径名 就像文件系统中的文件一样。顶级小部件, root 被称为 . (句点)和子级之间用更多的句点分隔。例如, .myApp.controlPanel.okButton 可能是小部件的名称。

option

配置小部件的外观,在某些情况下还配置其行为。选项以标记和值列表的形式出现。标记前面是一个“-”,类似于unix shell命令标记,如果值不止一个单词,则将其放在引号中。

例如::

button   .fred   -fg red -text "hi there"
   ^       ^     \______________________/
   |       |                |
 class    new            options
command  widget  (-opt val -opt val ...)

创建后,小部件的路径名将成为一个新命令。这个新的 控件命令 是程序员用来让新的小部件执行一些 行动 . 在C中,你可以把它表示为某个动作(弗莱德,某些选项),在C++中,你会把它表示为弗莱德。

.fred someAction someOptions

注意对象名, .fred ,从一个点开始。

如你所料,法律价值 某行动 取决于小部件的类: .fred disable 如果fred是一个按钮(fred变灰),则工作,但如果fred是一个标签,则不工作(在tk中不支持禁用标签)。

法律价值 一些选择 是否依赖于操作。一些动作,比如 disable ,不需要参数,其他参数,如文本输入框 delete 命令,需要参数来指定要删除的文本范围。

将基本tk映射到tkinter

tk中的类命令对应于tkinter中的类构造函数。::

button .fred                =====>  fred = Button()

对象的主对象隐式地出现在创建时赋予它的新名称中。在Tkinter中,显式地指定了主控形状。::

button .panel.fred          =====>  fred = Button(panel)

tk中的配置选项在连字符标签列表中给出,后面跟着值。在Tkinter中,选项在实例构造函数中被指定为关键字参数,在字典样式中,对于已建立的实例,用于配置调用或作为实例索引的关键字参数被指定为关键字参数。见节 设置选项 设置选项时。::

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()

要将小部件提供给打包机(几何管理器),可以使用可选参数调用pack。在Tkinter中,pack类拥有所有这些功能,pack命令的各种形式都作为方法实现。所有小部件 tkinter 是打包机的子类,因此继承所有打包方法。见 tkinter.tix 有关表单几何管理器的其他信息的模块文档。::

pack .fred -side left       =====>  fred.pack(side="left")

方便参考

设置选项

选项控制小部件的颜色和边框宽度。可通过三种方式设置选项:

在对象创建时,使用关键字参数
fred = Button(self, fg="red", bg="blue")
创建对象后,将选项名视为字典索引
fred["fg"] = "red"
fred["bg"] = "blue"
使用config()方法在创建对象之后更新多个attr
fred.config(fg="red", bg="blue")

有关给定选项及其行为的完整解释,请参阅相关小部件的tk手册页。

注意,手册页列出了每个小部件的“标准选项”和“特定于小部件的选项”。前者是许多小部件通用的选项列表,后者是特定小部件特有的选项。标准选项记录在 options(3) 人页。

本文档不区分标准选项和特定于小部件的选项。有些选项不适用于某些类型的小部件。给定的小部件是否响应特定选项取决于小部件的类别;按钮具有 command 选项,标签不。

给定小部件支持的选项列在该小部件的手册页中,或者可以在运行时通过调用 config() 方法没有参数,或通过调用 keys() 方法。这些调用的返回值是一个字典,其键是作为字符串的选项名称(例如, 'relief' )其值为5个元组。

一些选择,比如 bg 是具有长名称的常用选项的同义词 (bg 是“background”的简写。通过 config() 方法速记选项的名称将返回2元组,而不是5元组。返回的2元组将包含同义词的名称和“real”选项(例如 ('bg', 'background')

索引

意义

例子

0

选项名称

'relief'

1

用于数据库查找的选项名

'relief'

2

用于数据库查找的选项类

'Relief'

3

默认值

'raised'

4

现值

'groove'

例子::

>>> print(fred.config())
{'relief': ('relief', 'relief', 'Relief', 'raised', 'groove')}

当然,打印的字典将包括所有可用选项及其值。这只是一个例子。

封隔器

封隔器是Tk的几何管理机制之一。几何管理器用于指定控件在其容器中的相对位置-它们的相互 主人 . 与更笨重的 砂矿 (这是不常用的,我们这里不介绍),打包机采用定性关系规范。- 在上面向左填满 等等,然后计算出所有的东西来为你确定准确的位置坐标。

任何尺寸 owner 小部件由内部“从属小部件”的大小决定。打包机用于控制从部件出现在主部件中的位置,主部件被打包到主部件中。您可以将小部件打包到框架中,并将框架打包到其他框架中,以实现所需的布局。此外,一旦打包后,将动态调整排列以适应配置的增量更改。

请注意,小部件只有在使用几何管理器指定几何图形后才会显示。忽略几何规范是一个常见的早期错误,然后在创建小部件时感到惊讶,但没有显示任何内容。一个小部件只有在它拥有例如打包机的 pack() 方法。

可以使用关键字选项/值对调用pack()方法,这些关键字选项/值对控制小部件在其容器中的显示位置,以及在调整主应用程序窗口大小时它的行为方式。以下是一些例子:

fred.pack()                     # defaults to side = "top"
fred.pack(side="left")
fred.pack(expand=1)

封隔器选项

有关打包机和它可以选择的选项的更多信息,请参见手册页和约翰·奥斯特豪特的书第183页。

锚类型。指示打包机将每个从机放置在其包中的位置。

扩大

布尔, 01 .

填满

法律价值观: 'x''y''both''none' .

IPADX与IPADY

表示从部件每侧内部填充的距离。

PADX与PADY

表示从部件每侧外部填充的距离。

法律价值包括: 'left''right''top''bottom' .

耦合小部件变量

一些小部件(如文本输入小部件)的当前值设置可以通过使用特殊选项直接连接到应用程序变量。这些选项是 variabletextvariableonvalueoffvaluevalue . 这个连接双向工作:如果变量因任何原因发生变化,它所连接的小部件将被更新以反映新的值。

不幸的是,在目前的实施中 tkinter 不可能通过 variabletextvariable 选项。这项工作的唯一变量类型是从名为variable的类(在中定义)中子类化的变量。 tkinter .

已经定义了许多有用的变量子类: StringVarIntVarDoubleVarBooleanVar .要读取此类变量的当前值,请调用 get() 方法,若要更改其值,请调用 set() 方法。如果您遵循这个协议,小部件将始终跟踪变量的值,而您不需要进一步干预。

例如::

import tkinter as tk

class App(tk.Frame):
    def __init__(self, master):
        super().__init__(master)
        self.pack()

        self.entrythingy = tk.Entry()
        self.entrythingy.pack()

        # Create the application variable.
        self.contents = tk.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

        # Define a callback for when the user hits return.
        # It prints the current value of the variable.
        self.entrythingy.bind('<Key-Return>',
                             self.print_contents)

    def print_contents(self, event):
        print("Hi. The current entry content is:",
              self.contents.get())

root = tk.Tk()
myapp = App(root)
myapp.mainloop()

窗口管理器

在tk中,有一个实用程序命令, wm ,用于与窗口管理器交互。选项到 wm 命令允许您控制标题、位置、图标位图等内容。在 tkinter ,这些命令已作为 Wm 类。顶层小部件是从 Wm 类,因此可以调用 Wm 方法直接。

要进入包含给定小部件的顶级窗口,您通常可以参考小部件的主窗口。当然,如果小部件被打包在一个框架内,那么主程序就不会表示一个顶级窗口。要进入包含任意小部件的顶级窗口,可以调用 _root() 方法。此方法以下划线开头,表示此函数是实现的一部分,而不是到tk功能的接口。

以下是一些典型用法的示例:

import tkinter as tk

class App(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.pack()

# create the application
myapp = App()

#
# here are method calls to the window manager class
#
myapp.master.title("My Do-Nothing Application")
myapp.master.maxsize(1000, 400)

# start the program
myapp.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" .

布尔

可以传递整数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页。

光标

标准x光标名称来自 cursorfont.h 可以使用,没有 XC_ 前缀。例如获取手形光标 (XC_hand2 )使用字符串 "hand2" . 还可以指定自己的位图和遮罩文件。见奥斯特豪特的书第179页。

距离

屏幕距离可以用像素或绝对距离来指定。像素以数字表示,绝对距离以字符串表示,尾随字符表示单位: c 对于厘米, i 英寸, m 对于毫米, p 打印点。例如,3.5英寸表示为 "3.5i" .

字体

tk使用列表字体名称格式,例如 {{courier 10 bold}} . 带正数的字体大小以点为单位度量;带负数的大小以像素为单位度量。

几何学

这是表单的字符串 widthxheight ,其中大多数小部件的宽度和高度以像素为单位(小部件显示文本的字符为单位)。例如: fred["geometry"] = "200x100" .

证明正当

法律价值是字符串: "left""center""right""fill" .

区域

这是一个由四个空格分隔的元素组成的字符串,每个元素都是合法的距离(见上文)。例如: "2 3 4 5""3i 2i 4.5i 2i""3c 2c 4c 10.43c" 都是法定区域。

救济

确定小部件的边框样式。法律价值包括: "raised""sunken""flat""groove""ridge" .

滚动命令

这几乎总是 set() 一些滚动条小部件的方法,但可以是采用单个参数的任何小部件方法。

必须是: "none""char""word" .

绑定和事件

widget命令中的bind方法允许您监视某些事件,并在该事件类型发生时具有回调函数触发器。bind方法的形式为:

def bind(self, sequence, func, add=''):

在哪里?

序列

表示目标事件类型的字符串。(详情请参见装订手册第页和约翰·奥斯特豪特的书第201页)。

芬克

是一个python函数,采用一个参数,在事件发生时调用。事件实例将作为参数传递。(以这种方式部署的函数通常称为 回调

添加

是可选的,或者 '''+' . 传递空字符串表示此绑定将替换与此事件关联的任何其他绑定。通过A '+' 表示要将此函数添加到绑定到此事件类型的函数列表中。

例如::

def turn_red(self, event):
    event.widget["activeforeground"] = "red"

self.button.bind("<Enter>", self.turn_red)

注意事件的小部件字段在 turn_red() 回调。此字段包含捕获X事件的小部件。下表列出了您可以访问的其他事件字段,以及它们在tk中的表示方式,这在引用tk手册页时非常有用。

TK

Tkinter事件字段

TK

Tkinter事件字段

%F

集中

%A

烧焦

%H

高度

%E

send_event

%K

键码

%K

符号码

%S

状态

%N

keysym_num

%T

时间

%T

类型

%W

宽度

%W

小装置

%x

X

%x

x_root

%Y

Y

%Y

y_root

索引参数

许多小部件需要传递“index”参数。它们用于指向文本小部件中的特定位置,或指向条目小部件中的特定字符,或指向菜单小部件中的特定菜单项。

入口小部件索引(索引、视图索引等)

条目小部件具有引用所显示文本中字符位置的选项。你可以用这些 tkinter 在文本小部件中访问这些特殊点的函数:

文本小部件索引

文本小部件的索引符号非常丰富,最好在tk手册页中描述。

菜单索引(menu.invoke()、menu.entryconfig()等)

菜单的一些选项和方法操作特定的菜单项。每当选项或参数需要菜单索引时,您可以输入:

  • 一个整数,表示小部件中条目的数字位置,从顶部开始计数,从0开始;

  • "active" ,表示当前光标下的菜单位置;

  • "last" 指最后一个菜单项;

  • 前面有一个整数 @ ,如 @6 ,其中整数被解释为菜单坐标系中的Y像素坐标;

  • "none" ,表示根本没有菜单项,最常用于menu.activate()来停用所有项,最后,

  • 一个文本字符串,其模式与菜单项的标签相匹配,从菜单的顶部到底部进行扫描。请注意,此索引类型是在所有其他索引类型之后考虑的,这意味着与标记为 lastactivenone 可以解释为上述文字,而不是。

图像

不同格式的图像可以通过 tkinter.Image

  • BitmapImage 对于XBM格式的图像。

  • PhotoImage 对于PGM、PPM、GIF和PNG格式的图像。后者支持从tk 8.6开始。

任何类型的图像都是通过 filedata 选项(其他选项也可用)。

然后,图像对象可用于 image 某些小部件(如标签、按钮、菜单)支持选项。在这些情况下,tk不会保留对图像的引用。当最后一个对图像对象的python引用被删除时,图像数据也会被删除,并且在使用图像的地方,tk将显示一个空框。

参见

这个 Pillow 软件包增加了对格式的支持,如BMP、JPEG、TIFF和WebP等。

文件处理程序

tk允许您注册和注销回调函数,当文件描述符上可能存在I/O时,将从tk mainloop调用回调函数。每个文件描述符只能注册一个处理程序。示例代码:

import tkinter
widget = tkinter.Tk()
mask = tkinter.READABLE | tkinter.WRITABLE
widget.tk.createfilehandler(file, mask, callback)
...
widget.tk.deletefilehandler(file)

此功能在Windows上不可用。

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

Widget.tk.createfilehandler(file, mask, func)

注册文件处理程序回调函数 func . 这个 file 参数可以是具有 fileno() 方法(如文件或套接字对象)或整数文件描述符。这个 mask 参数是下面三个常量中任意一个的ORD组合。回调调用如下:

callback(file, mask)
Widget.tk.deletefilehandler(file)

注销文件处理程序。

tkinter.READABLE
tkinter.WRITABLE
tkinter.EXCEPTION

中使用的常量 mask 参数。