Tkinter

Tkinter模块(“Tk接口”)是Tk GUI工具包的标准Python接口。Tk和Tkinter在大多数Unix平台以及Windows系统上均可用。(Tk本身不是Python的一部分;它保存在ActiveState中。)

注意

Tkinter已被重新命名为tkinterPython 3. 当将源代码转换为Python 3时,2to3工具将自动适应导入。

扩展内容

Python Tkinter资源 Python Tkinter主题指南提供了大量关于从Python使用Tk和链接到Tk上的其他信息源的信息。TKDocs广泛的教程和一些小部件的更友好的小部件页面。Tkinter参考:用于Python的GUI在线参考资料。来自effbot的Tkinter文档由effbot.org支持的tkinter的在线参考。Tcl / Tk手册最新tcl / tk版本的官方手册。由Mark Lutz 编写的Python书籍,对Tkinter有很好的报道。繁忙Python开发人员的现代Tkinter由Mark Rozerman撰写关于用Python和Tkinter构建具有吸引力和现代化图形用户界面的内容。Python和Tkinter编程 John Grayson的书(ISBN 1-884777-81-3)。

1. Tkinter模块

大多数情况下,Tkinter模块都是您真正需要的,但也有一些额外的模块可供选择。Tk接口位于名为的二进制模块中_tkinter。该模块包含Tk的底层接口,不应直接由应用程序员使用。它通常是共享库(或DLL),但在某些情况下可能会与Python解释器静态链接。

除了Tk接口模块外,Tkinter还包括许多Python模块。两个最重要的模块是Tkinter模块本身,还有一个模块叫做Tkconstants。前者自动导入后者,所以要使用Tkinter,你只需要导入一个模块:

import Tkinter

或者更经常地:

from Tkinter import *

class Tkinter.Tk(screenName=None, baseName=None, className='Tk', useTk=1)

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

在版本2.4中更改:添加了useTk参数。

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

Tcl()函数是一个工厂函数Tk,除了不初始化Tk子系统外,它创建的对象非常类似于该类创建的对象。在不希望创建无关的顶层窗口的环境中,或者在无法(如没有X服务器的Unix / Linux系统)环境中驱动Tcl解释器时,这通常很有用。由对象创建的Tcl()对象可以通过调用其loadtk()方法创建Toplevel窗口(并初始化Tk子系统)。

2.4版本中的新功能。

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

ScrolledTextText小部件,内置一个垂直滚动条in.tkColorChooserDialog,让用户选择一个color.tkCommonDialogBase类,用于在这里列出的其他模块中定义的对话框。tkFileDialogCommon对话框允许用户指定要打开的文件或save.tkFontUtilities以帮助 使用fonts.tkMessageBoxAccess来标准Tk对话框boxes.tkSimpleDialogBasic对话框和便捷函数.Tkdnd拖放支持Tkinter。 这是实验性的,当它在Tk窗口中用Tk DND.turtleTurtle图形取代时应该被弃用。

这些已经在Python 3中重新命名了; 他们都是新tkinter包装的子模块。

2. Tkinter救生员系统

本节不是为Tk或Tkinter的详尽教程而设计的。相反,它旨在作为一个制止差距,为系统提供一些入门指导。

Credits:

  • Tkinter由Steen Lumholt和Guido van Rossum撰写。
  • Tk由John Ousterhout在伯克利书写。
  • 这个Life Preserver 是由弗吉尼亚大学的马特康威编写的。
  • HTML渲染和一些自由编辑是由Ken Manheimer的FrameMaker版本生成的。
  • Fredrik Lundh详细阐述并修改了类接口描述,以使它们与Tk 4.2一致。
  • Mike Clarkson将文档转换为LaTeX,并编译了参考手册的用户界面章节。

2.1 如何使用本节

本部分分为两部分:前半部分(大致)包含背景材料,后半部分可作为便于参考的键盘。

当试图回答“我该怎么做”这个形式的问题时,通常最好找出如何在直接Tk中做“无用”,然后将其转换回相应的Tkinter呼叫。Python程序员通常可以通过查看Tk文档来猜测正确的Python命令。这意味着为了使用Tkinter,你必须知道一些关于Tk的知识。这个文件不能完成这个角色,所以我们能做的最好的事情就是向您提供最好的文档。以下是一些提示:

  • 作者强烈建议获取Tk手册页的副本。具体来说,mann目录中的手册页是最有用的。该man3手册页介绍了C接口Tk库,因此不为脚本编写者特别有用。
  • Addison-Wesley出版了一本名为Tcl的书和John Ousterhout的Tk Toolkit(ISBN 0-201-63337-X),这是对新手Tcl和Tk的一个很好的介绍。这本书并非详尽无遗,对于许多细节,它都遵循手册页。
  • Tkinter.py 对大多数人来说是最后的选择,但如果没有其他任何意义的话,它可能是一个很好的去处。

扩展内容

ActiveState Tcl主页 Tk / Tcl开发主要发生在ActiveState上。Tcl和Tk工具包 Tcl的发明人John Ousterhout的书。Tcl和Tk中的实用编程 Brent Welch的百科全书。

2.2 一个简单的Hello World程序

from Tkinter import *

class Application(Frame):
    def say_hi(self):
        print "hi there, everyone!"

    def createWidgets(self):
        self.QUIT = Button(self)
        self.QUIT["text"] = "QUIT"
        self.QUIT["fg"]   = "red"
        self.QUIT["command"] =  self.quit

        self.QUIT.pack({"side": "left"})

        self.hi_there = Button(self)
        self.hi_there["text"] = "Hello",
        self.hi_there["command"] = self.say_hi

        self.hi_there.pack({"side": "left"})

    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.pack()
        self.createWidgets()

root = Tk()
app = Application(master=root)
app.mainloop()
root.destroy()

3. (非常)快速浏览Tcl / Tk

类层次结构看起来很复杂,但实际上,应用程序员几乎总是引用层次结构底部的类。

注意:

  • 提供这些类是为了在一个命名空间下组织某些功能。它们不是要独立实例化的。
  • Tk类,就是要在应用程序中只有一次实例化。应用程序员不需要明确地实例化一个实例,只要有任何其他类实例化,系统就会创建一个。
  • 这个Widget类不意味着被实例化,它只是意味着子类化才能生成“真实”的小部件(在C ++中,这被称为“抽象类”)。

为了使用这个参考资料,有时候您需要知道如何阅读Tk的简短段落以及如何识别Tk命令的各个部分。(请参阅将Tk的基本Tk映射到Tkinter中,Tkinter以了解下面的内容。)

Tk脚本是Tcl程序。像所有的Tcl程序一样,Tk脚本只是由空格分隔的令牌列表。传统知识小部件就是它的选项,帮助配置,和行动,使人们做有用的事情。

要在Tk中创建一个小部件,该命令始终是以下形式:

classCommand newPathname options

classCommand_表示要制作哪种小部件(按钮,标签,菜单...)_ newPathname_是此小部件的新名称。 Tk中的所有名称都必须是唯一的。 为了帮助执行此操作,Tk中的窗口小部件以_pathnames命名,就像文件系统中的文件一样。 调用顶级小部件root。 (期间)和孩子被更多的时期划定界限。 例如,.myApp.controlPanel.okButton可能是一个窗口小部件的名称._options_configure窗口小部件的外观,在某些情况下,它的行为。 选项以标志和值列表的形式出现。 标志前面有一个' - ',就像Unix shell命令标志一样,并且如果值超过一个单词,则会将值放在引号中。

例如:

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

一旦创建,小部件的路径名变成新命令。这个新的Widget命令是程序员获取新Widget执行某些操作的句柄。在C语言中,你可以用C ++表示它为someAction(fred,someOptions),你可以将它表示为fred.someAction(someOptions),在Tk中,你会说:

.fred someAction someOptions

请注意,对象名称.fred以点开头。

正如你所期望的那样,someAction的合法值将取决于窗口部件的类:.fred禁用如果fred是一个按钮(fred变灰),但不起作用,但如果fred是标签,则不起作用(不支持禁用标签 在Tk)。

someOptions的合法价值取决于行动。 某些操作(如disable)不需要参数,其他操作(如文本输入框的delete命令)需要参数来指定要删除的文本范围。

4.将Tk映射到Tkinter

Tk中的类命令对应于Tkinter中的类构造函数。

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

对象的主对象隐含在创建时给它的新名称中。在Tkinter中,明确指定了主人。

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

Tk中的配置选项在带有数值的紧跟标签列表中给出。在Tkinter中,选项在实例构造函数中被指定为关键字参数,在配置调用中被指定为keyword-args,或者在字典样式中被指定为已建立实例的实例索引。请参见设置选项中的设置选项部分。

button .fred -fg red        =====>  fred = Button(panel, fg = "red")
.fred configure -fg red     =====>  fred["fg"] = red
                            OR ==>  fred.config(fg = "red")

在Tk中,要在小部件上执行操作,请使用小部件名称作为命令,然后使用操作名称,可能带有参数(选项)。在Tkinter中,您可以调用类实例上的方法来调用窗口小部件上的操作。Tkinter.py模块中列出了给定小部件可以执行的动作(方法)。

.fred invoke                =====>  fred.invoke()

要给封装器(几何管理器)提供一个小部件,可以使用可选参数调用封装。在Tkinter中,Pack类拥有所有这些功能,并且各种形式的pack命令都作为方法实现。所有的小部件Tkinter都是从Packer中分类出来的,因此继承了所有的打包方法。有关Tix表格几何管理器的其他信息,请参阅模块文档。

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

5. Tk和Tkinter是如何相关的

从上到下:

你的应用程序在这里(Python)一个Python应用程序进行Tkinter调用.Tkinter(Python模块)这个调用(例如,创建一个按钮控件)在Tkinter模块中实现,该模块是用Python编写的。这个Python函数将解析命令和参数并将它们转换为一种形式,使它们看起来好像它们来自Tk脚本而不是Python脚本.tkinter(C)这些命令及其参数将传递给C在tkinter中的功能 - 注意小写 - 扩展模块.Tk Widgets(C和Tcl)这个C函数可以调用其他C模块,包括组成Tk库的C函数。Tk在C和一些Tcl中实现。Tk小部件的Tcl部分用于将某些默认行为绑定到小部件,并且在Tkinter导入Python 模块的位置执行一次。(用户从不会看到这个阶段).Tk(C)Tk Widgets的Tk部分实现了最终映射到... Xlib(C)Xlib库在屏幕上绘制图形。

6.方便的参考

6.1 设置选项

选项控制一些东西,比如一个小部件的颜色和边框宽度。选项可以通过三种方式设置:

在创建对象时,使用关键字参数

fred = Button(self, fg = "red", bg = "blue")

创建对象后,将选项名称视为字典索引

fred["fg"] = "red"
fred["bg"] = "blue"

使用config()方法更新对象创建后的多个attrs

fred.config(fg = "red", bg = "blue")

有关给定选项及其行为的完整说明,请参阅相关Widget的Tk手册页。

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

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

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

一些选项,如bg是长名称的常见选项的同义词(bg是“背景”的简写)。 传递config()方法的简写选项的名称将返回一个2元组,而不是5元组。 传回的2元组将包含同义词的名称和“真实”选项(例如('bg','background'))。

指数

含义

0

选项名称

'relief'

1

数据库查找的选项名称

'relief'

2

选项类用于数据库查找

'relief'

3

默认值

'raised'

4

当前值

'groove'

例:

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

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

6.2 包装工

封隔器是Tk的几何管理机制之一。几何管理器用于指定小部件在其容器中的定位的相对位置 - 它们是相互的主人。相较于较为繁琐placer(用于不常用,我们在这里不介绍),封隔器采用定性关系规范- above, to the left of, filling等等-和工作的一切,以确定确切位置坐标为你。

任何控件的大小由内部“从控件”的大小决定。打包器用于控制从站窗口小部件在其打包的主站内出现的位置。您可以将窗口小部件封装到框架中,并将框架封装到其他框架中,以实现您所需的布局。此外,这种安排是动态调整的,以适应配置的增量变化,一旦打包完成。

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

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

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

6.3 封装选项

有关打包机的更多信息及其可以选择的选项,请参阅John Ousterhout书中的手册页和第183页。

anchorAnchor类型。 表示封装器将每个从器件放置在parcel.expandBoolean,0或1.fillLegal值中的位置:'x','y','both','none'.ipadx和ipadyA distance - 指定每个从器件的内部填充 从属widget.padx和padyA距离 - 指定从属widget的每边的外部填充。sideLegal值为:'left','right','top','bottom'。

6.4 耦合小部件变量

某些小部件(如文本输入小部件)的当前值设置可以通过使用特殊选项直接连接到应用程序变量。 这些选项是可变的,文本变量,onvalue,offvalue和值。 这种连接可以两种方式工作:如果变量因任何原因而变化,它所连接的小部件将被更新以反映新值。

不幸的是,在Tkinter的当前实现中,不可能通过变量或文本变量选项将任意Python变量移交给小部件。 这个变量的唯一类型是从Tkinter模块中定义的类变量中分类的变量。

已经定义了许多有用的变量的子类:StringVar,IntVar,DoubleVar和BooleanVar。 要读取此变量的当前值,请调用get()方法,并更改其值,您可以调用set()方法。 如果你遵循这个协议,那么这个小部件将总是跟踪这个变量的值,而不需要你做进一步的干预。

例如:

class App(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, 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()

6.5 窗口管理器

在Tk中,有一个实用程序命令wm用于与窗口管理器交互。 wm命令的选项允许您控制标题,位置,图标位图等。 在Tkinter中,这些命令已经作为Wm类的方法实现。 Toplevel小部件从Wm类中继承,因此可以直接调用Wm方法。

要查看包含给定窗口小部件的顶层窗口,通常可以引用窗口小部件的主窗口。当然,如果这个小部件已经被封装在一个框架内,那么这个主框架将不会代表一个顶层窗口。要访问包含任意小部件的顶级窗口,可以调用该_root()方法。该方法以下划线开头,表示这个函数是实现的一部分,而不是Tk功能的接口。

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

from Tkinter import *
class App(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, 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()

6.6 Tk选项数据类型

anchorLegal值是指南针的点:“n”,“ne”,“e”,“se”,“s”,“sw”,“w”,“nw”以及“center”.bitmap有八个 -in,命名位图:'error', 'gray25', 'gray50', 'hourglass', 'info', 'questhead', 'question', 'warning'。 要指定一个X位图文件名,给出该文件的完整路径,前面带@,如“@ / usr / contrib / bitmap / gumby.bit”.boolean您可以传递整数0或1或字符串“yes”或“不”.callback

这是任何不带参数的Python函数。例如:

def print_it():
        print "hi there"
fred["command"] = print_it

colorColors可以作为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页。距离可以在像素或绝对距离中指定屏幕距离。像素以数字和绝对距离作为字符串给出,尾部字符表示单位:c表示厘米,i表示英寸,m表示毫米,p表示打印机的点数。例如,3.5英寸表示为“3.5i”.fontTk使用列表字体名称格式,例如{courier 10 bold}。正数的字体大小以点为单位;尺寸为负数的尺寸以pixels.geometry度量。这是一个widthxheight形式的字符串,其中宽度和高度以像素为单位测量大多数小部件(显示文本的小部件的字符数)。例如:fred [“geometry”] =“200x100”.justifyLegal 值是字符串:“left”,“center”,“right”和“fill”.region这是一个带有四个空格分隔元素的字符串,这是一个合法的距离(见上文)。例如:“2 3 4 5”和“3i 2i 4.5i 2i”和“3c 2c 4c 10.4c”都是合法的区域.relief确定小部件的边框样式。合法值是:"raised", "sunken", "flat", "groove""ridge".scrollcommand这几乎总是某个滚动条小部件的set()方法,但可以是任何只有一个参数的小部件方法。例如,请参阅Python源代码分发中的Demo / tkinter / matt / canvas-with-scrollbars.py文件.wrap:必须是“none”,“char”或“word”中的一个。

6.7 绑定和事件

通过widget命令的绑定方法,您可以监视某些事件并在发生该事件类型时触发回调函数。绑定方法的形式是:

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

如下:

sequence是一个表示事件目标类型的字符串。 (有关详细信息,请参阅John Ousterhout书中的绑定手册页和第201页)。当事件发生时,调用一个带有一个参数的Python函数。 一个Event实例将作为参数传递。 (以这种方式部署的函数通常称为回调。)addis可选,可以是''或'+'。 传递一个空字符串表示这个绑定是要替换这个事件关联的任何其他绑定。 传递'+'意味着此函数将被添加到绑定到此事件类型的函数列表中。

例如:

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

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

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

Tk      Tkinter Event Field             Tk      Tkinter Event Field
--      -------------------             --      -------------------
%f      focus                           %A      char
%h      height                          %E      send_event
%k      keycode                         %K      keysym
%s      state                           %N      keysym_num
%t      time                            %T      type
%w      width                           %W      widget
%x      x                               %X      x_root
%y      y                               %Y      y_root

6.8 索引参数

许多小部件需要传递“索引”参数。它们用于指向Text小部件中的特定位置,或指向Entry小部件中的特定字符或指向Menu小部件中的特定菜单项。

Entry widget indexes (index, view index, etc.)

条目窗口小部件具有涉及正在显示的文本中的字符位置的选项。您可以使用这些Tkinter函数来访问文本小部件中的这些特殊点:

AtEnd()指的是textAtInsert()中的最后一个位置,指的是文本光标isAtSelFirst()指示选定文本的开始点的点.AtSelLast()表示所选文本的最后一个点,finallyAt(x,y)指向到像素位置xy处的字符(对于包含单行文本的文本输入小部件,y不使用y)。文本小部件索引文本小部件的索引符号非常丰富,最好在Tk中进行描述man pages.Menu索引(menu.invoke(),menu.entryconfig()等)

一些菜单选项和方法可以操作特定的菜单条目。无论何时,对于选项或参数都需要菜单索引,您可以通过:

  • 一个整数,它指向窗口小部件中的条目的数字位置,从顶部开始计数,从0开始;
  • 字符串'active',它是指当前在光标下的菜单位置;
  • "last"引用最后一个菜单项的字符串;
  • 通过前面的整数@,如在@6,其中整数被解释为y像素菜单的坐标系统中的坐标;
  • 该字符串"none"表示根本没有菜单条目,通常与menu.activate()一起使用来停用所有条目,最后,
  • 一个与菜单条目标签相匹配的文本字符串,从菜单顶部扫描到底部。 请注意,此索引类型在所有其他索引类型之后被考虑,这意味着标记为last,active或none的菜单项的匹配可能会被解释为上述文字。

6.9 图片

位图/像素图像可以通过以下子类创建Tkinter.Image

  • BitmapImage 可用于X11位图数据。
  • PhotoImage 可用于GIF和PPM / PGM颜色位图。

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

这个图像对象可以用于任何一个image小部件支持的选项(例如标签,按钮,菜单)。在这些情况下,Tk将不会保留对图像的引用。当删除对图像对象的最后一个Python引用时,图像数据也会被删除,并且无论图像在哪里使用,Tk都会显示一个空框。

7.文件处理程序

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上不可用。

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

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

注册文件处理程序回调函数func。该文件的参数可以是与一个对象fileno()的方法(例如,文件或套接字对象),或一个整数文件描述符。的掩模参数是任何以下三个常量的或运算组合。回调被调用如下:

callback(file, mask)

Widget.tk.deletefilehandler(file)

取消注册文件处理程序。

Tkinter.READABLETkinter.WRITABLETkinter.EXCEPTION

掩码参数中使用的常量。

扫码关注云+社区

领取腾讯云代金券