tkinter --- Tcl/Tk的Python接口?

源代碼: Lib/tkinter/__init__.py


The tkinter package ("Tk interface") is the standard Python interface to the Tk GUI toolkit. Both Tk and tkinter are available on most Unix platforms, as well as on Windows systems. (Tk itself is not part of Python; it is maintained at ActiveState.)

在命令行中運(yùn)行 python -m tkinter,應(yīng)該會(huì)彈出一個(gè)Tk界面的窗口,表明 tkinter 包已經(jīng)正確安裝,而且告訴你 Tcl/Tk 的版本號(hào),通過(guò)這個(gè)版本號(hào),你就可以參考對(duì)應(yīng)的 Tcl/Tk 文檔了。

參見(jiàn)

Tkinter文檔:

Python Tkinter 資源

The Python Tkinter Topic Guide 提供了在 Python 中使用 Tk 的很多信息, 同時(shí)包含了Tk其他信息的鏈接。

TKDocs

大量的教程,部分可視化組件的介紹說(shuō)明。

Tkinter 8.5 reference: a GUI for Python

在線參考資料。

Tkinter docs from effbot

effbot.org 提供的 tkinter 在線參考資料。

使用 Python 編程

由 Mark Lutz 所著的書(shū)籍,對(duì) Tkinter 進(jìn)行了完美的介紹。

為繁忙的 Python 開(kāi)發(fā)者所準(zhǔn)備的現(xiàn)代 Tkinter

由 Mark Rozerman 所著的關(guān)于如何使用 Python 和 Tkinter 來(lái)搭建有吸引力的和現(xiàn)代化的圖形用戶界面的書(shū)籍

Python 和 Tkinter 編程

作者: John Grayson (ISBN 1-884777-81-3).

Tcl/Tk 文檔:

Tk 命令

多數(shù)命令以 tkinter 或者 tkinter.ttk 類的形式存在。改變 '8.6' 以匹配所安裝的 Tcl/Tk 版本。

Tcl/Tk 最新手冊(cè)頁(yè)面

www.tcl.tk 上面最新的 Tcl/Tk 手冊(cè)。

ActiveState Tcl 主頁(yè)

Tk/Tcl 的多數(shù)開(kāi)發(fā)工作發(fā)生在 ActiveState 。

Tcl 及 Tk 工具集

由 Tcl 發(fā)明者 John Ousterhout 所著的書(shū)籍。

` Tcl 和 Tk 編程實(shí)戰(zhàn) <http://www.beedub.com/book/>`_

Brent Welch 所著的百科全局式書(shū)籍。

Tkinter 模塊?

在大多數(shù)時(shí)候你只需要 tkinter 就足夠了,但也有一些額外的模塊可供使用。Tk 接口位于一個(gè)名字 _tkinter 的二進(jìn)制模塊當(dāng)中。此模塊包含了低層級(jí)的 Tk 接口,它不應(yīng)該被應(yīng)用程序員所直接使用。它通常是一個(gè)共享庫(kù)(或 DLL),但在某些情況下也可能被靜態(tài)鏈接到 Python 解釋器。

除了Tk接口, tkinter 也包含了若干 Python 模塊,tkinter.constants 是其中最重要的。導(dǎo)入 tkinter 會(huì)自動(dòng)導(dǎo)入 tkinter.constants ,所以,要使用 Tkinter 通常你只需要一條簡(jiǎn)單的 import 語(yǔ)句:

import tkinter

或者更常用的:

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

Tk 類被初始化時(shí)無(wú)參數(shù)。此時(shí)會(huì)創(chuàng)建一個(gè) Tk 頂級(jí)控件,通常是應(yīng)用程序的主窗口。每個(gè)實(shí)例都有自己關(guān)聯(lián)的 Tcl 解釋器。

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

Tcl() 函數(shù)是一個(gè)工廠函數(shù),它創(chuàng)建的對(duì)象與 Tk 類創(chuàng)建的對(duì)象非常相似,只是它不初始化 Tk 子系統(tǒng)。 在不想創(chuàng)建或無(wú)法創(chuàng)建(如沒(méi)有 X Server 的 Unix/Linux 系統(tǒng))額外的頂層窗口的環(huán)境中驅(qū)動(dòng) Tcl 解釋器時(shí),這一點(diǎn)非常有用。 由 Tcl() 對(duì)象創(chuàng)建的對(duì)象可以通過(guò)調(diào)用其 loadtk() 方法來(lái)創(chuàng)建頂層窗口(并初始化 Tk 子系統(tǒng))。

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

tkinter.scrolledtext

內(nèi)置縱向滾動(dòng)條的文本組件。

tkinter.colorchooser

讓用戶選擇顏色的對(duì)話框。

tkinter.commondialog

在此處列出的其他模塊中定義的對(duì)話框的基類。

tkinter.filedialog

允許用戶指定文件的通用對(duì)話框,用于打開(kāi)或保存文件。

tkinter.font

幫助操作字體的工具。

tkinter.messagebox

訪問(wèn)標(biāo)準(zhǔn)的 Tk 對(duì)話框。

tkinter.simpledialog

基礎(chǔ)對(duì)話框和便捷功能。

tkinter.dnd

tkinter 提供拖放支持。這是實(shí)驗(yàn)性功能,當(dāng)被 Tk DND 取代時(shí)應(yīng)被廢棄。

turtle

Tk 窗口中的海龜繪圖庫(kù)。

Tkinter 拾遺?

本節(jié)不應(yīng)作為 Tk 或 Tkinter 的詳盡教程。而只是一個(gè)補(bǔ)充,提供一些系統(tǒng)指南。

致謝:

  • Tk 是 John Ousterhout 在伯克利大學(xué)時(shí)寫(xiě)的。

  • Tkinter 是由 Steen Lumholt 和 Guido van Rossum 編寫(xiě)的。

  • 本拾遺由弗吉尼亞大學(xué)的 Matt Conway 撰寫(xiě)。

  • HTML 渲染和一些自由編輯功能,是由 Ken Manheimer 根據(jù) FrameMaker 創(chuàng)建的。

  • Fredrik Lundh 認(rèn)真研究并修改了類的接口描述,使其與 Tk 4.2 保持一致。

  • Mike Clarkson 將文檔轉(zhuǎn)換為 LaTeX 格式,并編寫(xiě)了參考手冊(cè)的用戶界面章節(jié)。

本節(jié)內(nèi)容的用法?

本節(jié)分為兩部分:前半部分(大致)涵蓋了背景材料,后半部分可以作為手頭的參考手冊(cè)。

當(dāng)試圖回答“如何才能怎么怎么”這種問(wèn)題時(shí),通常最好是弄清楚如何直接在 Tk 中實(shí)現(xiàn),然后轉(zhuǎn)換回相應(yīng)的 tkinter 調(diào)用。Python 程序員通??刹榭?Tk 文檔來(lái)猜測(cè)正確的 Python 命令。這意味著要用好 Tkinter,必須對(duì) Tk 有一定的了解。本文無(wú)法完成這個(gè)任務(wù),所以最好的做法就是給出目前最好的文檔。下面給出一些小提示:

  • 作者強(qiáng)烈建議用戶先拿到一份 Tk 手冊(cè)。具體來(lái)說(shuō),manN 目錄下的 man 文檔是最有用的。man3 的 man 文檔描述了 Tk 庫(kù)的 C 接口,因此對(duì)腳本編寫(xiě)人員沒(méi)有什么特別的幫助。

  • Addison-Wesley 出版了一本名為《Tcl 和 Tk 工具包》的書(shū),作者是 John Ousterhout(ISBN 0-201-63337-X),對(duì)于新手來(lái)說(shuō),這是一本很好的 Tcl 和Tk 介紹書(shū)籍。該書(shū)不算詳盡,很多細(xì)節(jié)還是要看 man 手冊(cè)。

  • 對(duì)大多數(shù)人而言,tkinter/__init__.py 是最后一招,但其他手段都無(wú)效時(shí)也不失為一個(gè)好去處。

簡(jiǎn)單的 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 速覽?

類的層次結(jié)構(gòu)看起來(lái)很復(fù)雜,但在實(shí)際操作中,應(yīng)用程序編寫(xiě)人員幾乎總是查看最底層的類。

注釋:

  • 提供這些類,是為了能在同一個(gè)命名空間下將某些功能組織在一起。并不意味著可以獨(dú)立對(duì)其進(jìn)行實(shí)例化。

  • Tk 類在同一個(gè)應(yīng)用程序中僅需作一次實(shí)例化。應(yīng)用程序編程人員不需要顯式進(jìn)行實(shí)例化,只要有其他任何類被實(shí)例化,系統(tǒng)就會(huì)創(chuàng)建一個(gè)。

  • Widget 類不是用來(lái)實(shí)例化的,它僅用于繼承以便生成“真正”的部件( C++ 中稱為“抽象類”)。

若要充分利用這些參考資料,有時(shí)需要知道如何閱讀 Tk 的短文,以及如何識(shí)別 Tk 命令的各個(gè)部分。(參見(jiàn) 將簡(jiǎn)單的 Tk 映射到 Tkinter 一節(jié),了解以下內(nèi)容在 tkinter 中的對(duì)應(yīng)部分)。

Tk 腳本就是 Tcl 程序。像所有其他的 Tcl 程序一樣,Tk 腳本只是由空格分隔的單詞列表。一個(gè)Tk 部件只是它的 class,options 用于進(jìn)行配置,actions 讓它執(zhí)行有用的動(dòng)作。

要在 Tk 中制作一個(gè)部件,總是采用如下格式的命令:

classCommand newPathname options
classCommand

表示要制作何種部件(按鈕、標(biāo)簽、菜單......)。

newPathname

該組件的新名字。Tk 中的所有名字都必須唯一。為了幫助實(shí)現(xiàn)這一點(diǎn),Tk 中的部件都用 路徑 命名,就像文件系統(tǒng)中的文件一樣。頂層的部件,即 ,名為 .``(句點(diǎn)),而子部件則由更多的句點(diǎn)分隔。比如部件名可能會(huì)是 ``.myApp.controlPanel.okButton

options

配置部件的外觀,有時(shí)也能配置行為。這些選項(xiàng)以標(biāo)志和值的列表形式出現(xiàn)。標(biāo)志前帶一個(gè)“-”,就像 Unix shell 命令的標(biāo)志一樣,如果值超過(guò)一個(gè)單詞,就用引號(hào)括起來(lái)。

例如

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

一旦創(chuàng)建成功,部件的路徑名就成了一條新的命令。這個(gè)新的 部件命令 是程序員讓新部件執(zhí)行某些 action 的句柄。在 C 語(yǔ)言中可表示為someAction(fred, someOptions),在 C++ 中可表示為fred.someAction(someOptions),而在 Tk 中寫(xiě)作:

.fred someAction someOptions

請(qǐng)注意,對(duì)象名 .fred 是以句點(diǎn)開(kāi)頭的。

如您所料,someAction 的可用值取決于部件的類別。如果 fred 為按鈕,則 .fred disable 有效(fred 會(huì)變灰),而當(dāng) fred 為標(biāo)簽時(shí)則無(wú)效(Tk 不支持標(biāo)簽的禁用)。

someOptions 的合法值取決于動(dòng)作。有些動(dòng)作不需要參數(shù),比如 disable,其他動(dòng)作如文本輸入框的 delete 命令則需用參數(shù)指定要?jiǎng)h除的文本范圍。

將簡(jiǎn)單的 Tk 映射到 Tkinter?

Tk 中的類命令對(duì)應(yīng)于 Tkinter 中的類構(gòu)造函數(shù):

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

父對(duì)象是隱含在創(chuàng)建時(shí)給定的新名字中的。在 Tkinter 中,父對(duì)象是顯式指定的:

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

Tk 中的配置項(xiàng)是以連字符標(biāo)簽列表的形式給出的,后跟著參數(shù)值。在 Tkinter 中,選項(xiàng)指定為實(shí)例構(gòu)造函數(shù)中的關(guān)鍵字參數(shù),在配置調(diào)用時(shí)指定為關(guān)鍵字 args,或在已有實(shí)例中指定為實(shí)例索引,以字典的形式。參見(jiàn) 可選配置項(xiàng) 一節(jié)的選項(xiàng)設(shè)置部分。

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

在 Tk 中, 要在某個(gè)部件上執(zhí)行動(dòng)作, 要用部件名作為命令, 并后面附上動(dòng)作名稱, 可能還會(huì)帶有參數(shù)(option)。在 Tkinter 中,則調(diào)用類實(shí)例的方法來(lái)執(zhí)行部件的動(dòng)作。部件能夠執(zhí)行的動(dòng)作(方法)列在 tkinter/__init__.py 中。

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

若要將部件交給打包器(geometry manager),需帶上可選參數(shù)去調(diào)用 pack。在 Tkinter 中,Pack 類擁有全部這些功能,pack 命令的各種形式都以方法的形式實(shí)現(xiàn)。 tkinter 中的所有部件都是從 Packer 繼承而來(lái)的,因此繼承了所有打包方法。關(guān)于Form geometry manager 的更多信息,請(qǐng)參見(jiàn) tkinter.tix 模塊的文檔。

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

Tk 和 Tkinter 如何關(guān)聯(lián)?

自上而下:

(Python)應(yīng)用程序位于這里

Python 應(yīng)用程序進(jìn)行了 tkinter 調(diào)用。

tkinter (Python 包)

此調(diào)用(比如創(chuàng)建一個(gè)按鈕部件)在 tkinter 包中實(shí)現(xiàn),它是用 Python 編寫(xiě)的。該 Python 函數(shù)將解析命令和參數(shù),并轉(zhuǎn)換為貌似 Tk 腳本的格式,而不像是 Python 腳本。

_tkinter(C 語(yǔ)言)

這些命令及參數(shù)將被傳給 _tkinter 擴(kuò)展模塊中的 C 函數(shù)——注意下劃線。

Tk 部件(C 和 Tcl)

該 C 函數(shù)能調(diào)用其他的 C 模塊,包括構(gòu)成 Tk 庫(kù)的 C 函數(shù)。Tk 是用 C 和一些 Tcl 實(shí)現(xiàn)的。Tk 部件的 Tcl 部分用于將某些默認(rèn)行為綁定到部件上,并在導(dǎo)入 Python tkinter 包時(shí)執(zhí)行一次。(該階段對(duì)用戶而言永不可見(jiàn))。

Tk(C 語(yǔ)言)

Tk 部件的 Tk 語(yǔ)言部分實(shí)現(xiàn)了最終的映射

Xlib(C 語(yǔ)言)

Xlib 庫(kù)在屏幕上繪制圖形。

快速參考?

可選配置項(xiàng)?

配置參數(shù)可以控制組件顏色和邊框?qū)挾鹊取?赏ㄟ^(guò)三種方式進(jìn)行設(shè)置:

在對(duì)象創(chuàng)建時(shí),使用關(guān)鍵字參數(shù)
fred = Button(self, fg="red", bg="blue")
在對(duì)象創(chuàng)建后,將參數(shù)名用作字典索引
fred["fg"] = "red"
fred["bg"] = "blue"
利用 config() 方法修改對(duì)象的屬性
fred.config(fg="red", bg="blue")

關(guān)于這些參數(shù)及其表現(xiàn)的完整解釋,請(qǐng)參閱 Tk 手冊(cè)中有關(guān)組件的 man 幫助頁(yè)。

請(qǐng)注意,man 手冊(cè)頁(yè)列出了每個(gè)部件的“標(biāo)準(zhǔn)選項(xiàng)”和“組件特有選項(xiàng)”。前者是很多組件通用的選項(xiàng)列表,后者是該組件特有的選項(xiàng)。標(biāo)準(zhǔn)選項(xiàng)在 options(3) man 手冊(cè)中有文檔。

本文沒(méi)有區(qū)分標(biāo)準(zhǔn)選項(xiàng)和部件特有選項(xiàng)。有些選項(xiàng)不適用于某類組件。組件是否對(duì)某選項(xiàng)做出響應(yīng),取決于組件的類別;按鈕組件有一個(gè) command 選項(xiàng),而標(biāo)簽組件就沒(méi)有。

組件支持的選項(xiàng)在其手冊(cè)中有列出,也可在運(yùn)行時(shí)調(diào)用 config() 方法(不帶參數(shù))查看,或者通過(guò)調(diào)用組件的 keys() 方法進(jìn)行查詢。這些調(diào)用的返回值為字典,字典的鍵是字符串格式的選項(xiàng)名(比如 'relief'),字典的值為五元組。

有些選項(xiàng),比如 bg 是全名通用選項(xiàng)的同義詞(bg 是 “background”的簡(jiǎn)寫(xiě))。向 config() 方法傳入選項(xiàng)的簡(jiǎn)稱將返回一個(gè)二元組,而不是五元組。傳回的二元組將包含同義詞的全名和“真正的”選項(xiàng)(比如 ('bg', 'background'))。

索引

含義

示例

0

選項(xiàng)名稱

'relief'

1

數(shù)據(jù)庫(kù)查找的選項(xiàng)名稱

'relief'

2

數(shù)據(jù)庫(kù)查找的選項(xiàng)類

'Relief'

3

默認(rèn)值

'raised'

4

當(dāng)前值

'groove'

示例:

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

當(dāng)然,輸出的字典將包含所有可用選項(xiàng)及其值。這里只是舉個(gè)例子。

包裝器?

The packer is one of Tk's geometry-management mechanisms. Geometry managers are used to specify the relative positioning of the positioning of widgets within their container - their mutual master. In contrast to the more cumbersome placer (which is used less commonly, and we do not cover here), the packer takes qualitative relationship specification - above, to the left of, filling, etc - and works everything out to determine the exact placement coordinates for you.

部件的大小都由其內(nèi)部的 “從屬部件” 的大小決定。包裝器用于控制從屬部件在主部件中出現(xiàn)的位置。可以把部件包入框架,再把框架包入其他框架中,搭建出所需的布局。此外,只要完成了包裝,組件的布局就會(huì)進(jìn)行動(dòng)態(tài)調(diào)整,以適應(yīng)布局參數(shù)的變化。

請(qǐng)注意,只有用形狀管理器指定幾何形狀后,部件才會(huì)顯示出來(lái)。忘記設(shè)置形狀參數(shù)是新手常犯的錯(cuò)誤,驚訝于創(chuàng)建完部件卻啥都沒(méi)出現(xiàn)。部件只有在應(yīng)用了類似于打包器的 pack() 方法之后才會(huì)顯示在屏幕上。

調(diào)用 pack() 方法時(shí)可以給出由關(guān)鍵字/參數(shù)值組成的鍵值對(duì),以便控制組件在其容器中出現(xiàn)的位置,以及主程序窗口大小變動(dòng)時(shí)的行為。下面是一些例子:

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

包裝器的參數(shù)?

關(guān)于包裝器及其可接受的參數(shù),更多信息請(qǐng)參閱 man 手冊(cè)和 John Ousterhout 書(shū)中的第 183 頁(yè)。

anchor

錨點(diǎn)類型。 表示包裝器要放置的每個(gè)從屬組件的位置。

expand

布爾型,01

fill

合法值為:'x' 、'y''both' 、'none'

ipadx 和 ipady

距離值,指定從屬部件每一側(cè)的內(nèi)邊距。

padx 和 pady

距離值,指定從屬部件的外邊距。

side

合法值為:'left''right' 、 'top'、 'bottom'。

部件與變量的關(guān)聯(lián)?

通過(guò)一些特定參數(shù),某些組件(如文本輸入組件)的當(dāng)前設(shè)置可直接與應(yīng)用程序的變量關(guān)聯(lián)。這些參數(shù)包括 variable 、 textvariableonvalue 、 offvalue 、 value。這種關(guān)聯(lián)是雙向的:只要這些變量因任何原因發(fā)生變化,其關(guān)聯(lián)的部件就會(huì)更新以反映新的參數(shù)值。

不幸的是,在目前 tkinter 的實(shí)現(xiàn)代碼中,不可能通過(guò) variabletextvariable 參數(shù)將任意 Python 變量移交給組件。變量只有是 tkinter 中定義的 Variable 類的子類,才能生效。

已經(jīng)定義了很多有用的 Variable 子類: StringVarIntVar 、DoubleVarBooleanVar。調(diào)用 get() 方法可以讀取這些變量的當(dāng)前值;調(diào)用 set() 方法則可改變變量值。只要遵循這種用法,組件就會(huì)保持跟蹤變量的值,而不需要更多的干預(yù)。

例如

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 有個(gè)實(shí)用命令 wm,用于與窗口管理器進(jìn)行交互。wm 命令的參數(shù)可用于控制標(biāo)題、位置、圖標(biāo)之類的東西。在 tkinter 中,這些命令已被實(shí)現(xiàn)為 Wm 類的方法。頂層部件是 Wm 類的子類,所以可以直接調(diào)用 Wm 的這些方法。

要獲得指定部件所在的頂層窗口,通常只要引用該部件的主窗口即可。當(dāng)然,如果該部件是包裝在框架內(nèi)的,那么主窗口不代表就是頂層窗口。為了獲得任意組件所在的頂層窗口,可以調(diào)用 _root() 方法。該方法以下劃線開(kāi)頭,表明其為 Python 實(shí)現(xiàn)的代碼,而非 Tk 提供的某個(gè)接口。

以下是一些典型用法:

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 參數(shù)的數(shù)據(jù)類型?

anchor

合法值是羅盤的方位點(diǎn):"n" 、"ne" 、"e""se" 、"s""sw" 、"w" 、"nw""center"

位圖

內(nèi)置已命名的位圖有八個(gè):'error''gray25' 、'gray50' 、'hourglass'、 'info' 、'questhead' 、'question''warning' 。若要指定位圖的文件名,請(qǐng)給出完整路徑,前面加一個(gè) @,比如 "@/usr/contrib/bitmap/gumby.bit"

布爾值

可以傳入整數(shù) 0 或 1,或是字符串 "yes""no"

callback -- 回調(diào)

指任何無(wú)需調(diào)用參數(shù)的 Python 函數(shù)。 例如:

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

可在 rgb.txt 文件中以顏色名的形式給出,或是 RGB 字符串的形式,4 位 :"#RGB" ,8 位 :"#RRGGBB",12 位:"#RRRGGGBBB",16 位:"#RRRRGGGGBBBB",其中R、G、B 為合法的十六進(jìn)制數(shù)值。 詳見(jiàn) Ousterhout 書(shū)中的第 160 頁(yè)。

cursor

可采用 cursorfont.h 中的標(biāo)準(zhǔn)光標(biāo)名稱,去掉 XC_ 前綴。 比如要獲取一個(gè)手形光標(biāo)(XC_hand2),可以用字符串 "hand2"。也可以指定自己的位圖和掩碼文件作為光標(biāo)。參見(jiàn) Ousterhout 書(shū)中的第 179 頁(yè)。

distance

屏幕距離可以用像素或絕對(duì)距離來(lái)指定。像素是數(shù)字,絕對(duì)距離是字符串,后面的字符表示單位:c 是厘米,i 是英寸,m 是毫米,p 則表示打印機(jī)的點(diǎn)數(shù)。例如,3.5 英寸可表示為 "3.5i"。

font

Tk 采用一串名稱的格式表示字體,例如 {courier 10 bold}。正數(shù)的字體大小以點(diǎn)為單位,負(fù)數(shù)的大小以像素為單位。

geometry

這是一個(gè) widthxheight 形式的字符串,其中寬度和高度對(duì)于大多數(shù)部件來(lái)說(shuō)是以像素為單位的(對(duì)于顯示文本的部件來(lái)說(shuō)是以字符為單位的)。例如:fred["geometry"] = "200x100"。

justify

合法的值為字符串: "left" 、 "center""right""fill" 。

region

這是包含四個(gè)元素的字符串,以空格分隔,每個(gè)元素是表示一個(gè)合法的距離值(見(jiàn)上文)。例如:"2 3 4 5""3i 2i 4.5i 2i""3c 2c 4c 10.43c" 都是合法的區(qū)域值。

relief

決定了組件的邊框樣式。 合法值包括:"raised"、 "sunken""flat" 、"groove""ridge" 。

scrollcommand

這幾乎就是帶滾動(dòng)條部件的 set() 方法,但也可是任一只有一個(gè)參數(shù)的部件方法。

wrap:

只能是以下值之一:"none" 、 "char""word"。

綁定和事件?

部件命令中的 bind 方法可覺(jué)察某些事件,并在事件發(fā)生時(shí)觸發(fā)一個(gè)回調(diào)函數(shù)。bind 方法的形式是:

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

這里:

sequence -- 序列

是一個(gè)表示事件的目標(biāo)種類的字符串。(詳情請(qǐng)看 bind 的手冊(cè)頁(yè)和 John Outsterhout 的書(shū)的第 201 頁(yè)。)

func

是帶有一個(gè)參數(shù)的 Python 函數(shù),發(fā)生事件時(shí)將會(huì)調(diào)用。傳入的參數(shù)為一個(gè) Event 實(shí)例。(以這種方式部署的函數(shù)通常稱為 回調(diào)函數(shù)。)

add

可選項(xiàng), '''+' 。傳入空字符串表示本次綁定將替換與此事件關(guān)聯(lián)的其他所有綁定。傳遞 '+' 則意味著加入此事件類型已綁定函數(shù)的列表中。

例如

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

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

請(qǐng)注意,在 turn_red() 回調(diào)函數(shù)中如何訪問(wèn)事件的 widget 字段。該字段包含了捕獲 X 事件的控件。下表列出了事件可供訪問(wèn)的其他字段,及其在 Tk 中的表示方式,這在查看 Tk 手冊(cè)時(shí)很有用處。

Tk

Tkinter 事件字段

Tk

Tkinter 事件字段

%f

焦點(diǎn)

%A

字符

%h

height

%E

send_event

%k

keycode

%K

keysym

%s

狀況

%N

keysym_num

%t

time

%T

type -- 類型

%w

寬度

%W

widget

%x

x

%X

x_root

%y

y

%Y

y_root

index 參數(shù)?

很多控件都需要傳入 index 參數(shù)。該參數(shù)用于指明 Text 控件中的位置,或指明 Entry 控件中的字符,或指明 Menu 控件中的菜單項(xiàng)。

Entry 控件的索引(index、view index 等)

Entry 控件帶有 index 屬性,指向顯示文本中的字符位置。這些 tkinter 函數(shù)可用于訪問(wèn)文本控件中的這些特定位置:

Text 控件的索引

Text 控件的索引語(yǔ)法非常復(fù)雜,最好還是在 Tk 手冊(cè)中查看。

Menu 索引(menu.invoke()、menu.entryconfig() 等)

菜單的某些屬性和方法可以操縱特定的菜單項(xiàng)。只要屬性或參數(shù)需要用到菜單索引,就可用以下方式傳入:

  • 一個(gè)整數(shù),指的是控件項(xiàng)的數(shù)字位置,從頂部開(kāi)始計(jì)數(shù),從 0 開(kāi)始;

  • 字符串 "active",指的是當(dāng)前光標(biāo)所在的菜單;

  • 字符串 "last",指的是上一個(gè)菜單項(xiàng);

  • 帶有 @ 前綴的整數(shù),比如 @6,這里的整數(shù)解釋為菜單坐標(biāo)系中的 y 像素坐標(biāo)。

  • 表示沒(méi)有任何菜單條目的字符串 "none" 經(jīng)常與 menu.activate() 一同被用來(lái)停用所有條目,以及

  • 與菜單項(xiàng)的文本標(biāo)簽進(jìn)行模式匹配的文本串,從菜單頂部掃描到底部。請(qǐng)注意,此索引類型是在其他所有索引類型之后才會(huì)考慮的,這意味著文本標(biāo)簽為 last、activenone 的菜單項(xiàng)匹配成功后,可能會(huì)視為這些單詞文字本身。

圖片?

通過(guò) tkinter.Image 的各種子類可以創(chuàng)建相應(yīng)格式的圖片:

  • BitmapImage 對(duì)應(yīng) XBM 格式的圖片。

  • PhotoImage 對(duì)應(yīng) PGM、PPM、GIF 和 PNG 格式的圖片。后者自 Tk 8.6 開(kāi)始支持。

這兩種圖片可通過(guò) filedata 屬性創(chuàng)建的(也可能由其他屬性創(chuàng)建)。

然后可在某些支持 image 屬性的控件中(如標(biāo)簽、按鈕、菜單)使用圖片對(duì)象。這時(shí),Tk 不會(huì)保留對(duì)圖片對(duì)象的引用。當(dāng)圖片對(duì)象的最后一個(gè) Python 引用被刪除時(shí),圖片數(shù)據(jù)也會(huì)刪除,并且 Tk 會(huì)在用到圖片對(duì)象的地方顯示一個(gè)空白框。

參見(jiàn)

Pillow 包增加了對(duì) BMP、JPEG、TIFF 和 WebP 等格式的支持。

文件句柄?

Tk 允許為文件操作注冊(cè)和注銷一個(gè)回調(diào)函數(shù),當(dāng)對(duì)文件描述符進(jìn)行 I/O 時(shí),Tk 的主循環(huán)會(huì)調(diào)用該回調(diào)函數(shù)。每個(gè)文件描述符只能注冊(cè)一個(gè)處理程序。示例代碼如下:

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

在 Windows 系統(tǒng)中不可用。

由于不知道可讀取多少字節(jié),你可能不希望使用 BufferedIOBaseTextIOBaseread()readline() 方法,因?yàn)檫@些方法必須讀取預(yù)定數(shù)量的字節(jié)。 對(duì)于套接字,可使用 recv()recvfrom() 方法;對(duì)于其他文件,可使用原始讀取方法或 os.read(file.fileno(), maxbytecount)。

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

注冊(cè)文件處理程序的回調(diào)函數(shù) func。 file 參數(shù)可以是具備 fileno() 方法的對(duì)象(例如文件或套接字對(duì)象),也可以是整數(shù)文件描述符。 mask 參數(shù)是下述三個(gè)常量的邏輯“或”組合。回調(diào)函數(shù)將用以下格式調(diào)用:

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

注銷文件處理函數(shù)。

tkinter.READABLE?
tkinter.WRITABLE?
tkinter.EXCEPTION?

Constants used in the mask arguments.