Tkinter 是 Python 的一个封装库,用于提供跨平台的 GUI 工具包。在 Windows 上,它与 Python 一起捆绑;在其他操作系统上,可以单独安装。Tkinter 提供的可用小部件比一些其他工具包少,但由于 Tkinter 小部件是可扩展的,因此可以通过扩展性创建许多缺失的复合小部件,如组合框和滚动窗格。

IDLE,Python 的集成开发和学习环境,使用 Tkinter 编写,通常与 Python 一起分发。您可以通过与 IDLE 的菜单和对话框互动来学习 Tkinter 的功能。例如,Options > Configure IDLE... 对话框展示了各种 GUI 元素,包括选项卡界面。通过研究 IDLE 源代码,您可以了解如何使用 Tkinter 编程,在 Windows 系统中,这些源代码可以在 C:\Program Files\Python27\Lib\idlelib 中找到。

Python 3:

本页上的示例适用于 Python 2。在 Python 3 中,之前的 Tkinter 模块已改为 tkinter,tkMessageBox 改为 messagebox 等。

最小示例

一个最小示例:

from Tkinter import *
root = Tk()
frame = Frame(root)
frame.pack()
label = Label(frame, text="Hey there.")
label.pack()
quitButton = Button(frame, text="Quit", command=frame.quit)
quitButton.pack()
root.mainloop()

使示例更紧凑的版本——不需要后续引用 GUI 项:

from Tkinter import *
root = Tk()
frame = Frame(root)
frame.pack()
Label(frame, text="Hey there.").pack()
Button(frame, text="Quit", command=frame.quit).pack()
root.mainloop()

创建继承自 Frame 的应用程序的最小示例:

from Tkinter import *

class App(Frame):
  def __init__(self, master):
    Frame.__init__(self)
    self.label = Label(master, text="Hey there.")
    self.label.pack()    
    self.quitButton = Button(master, text="Quit", command=self.quit)
    self.quitButton.pack()

if __name__ == '__main__':
  root = Tk()
  app = App(root)
  root.mainloop()

消息框

可以使用 tkMessageBox 创建简单的消息框,如下所示:

import Tkinter, tkMessageBox
Tkinter.Tk().withdraw() # Workaround: Hide the window
answer = tkMessageBox.askokcancel("Confirmation", "File not saved. Discard?")
answer = tkMessageBox.askyesno("Confirmation", "Do you really want to delete the file?")
# Above, "OK" and "Yes" yield True, and "Cancel" and "No" yield False
tkMessageBox.showwarning("Warning", "Timeout has elapsed.")
tkMessageBox.showwarning("Warning", "Timeout has elapsed.", icon=tkMessageBox.ERROR)
tkMessageBox.showerror("Warning", "Timeout has elapsed.")

文件对话框

可以创建文件对话框,如下所示:

import Tkinter, tkFileDialog
Tkinter.Tk().withdraw() # Workaround: Hide the window
filename1 = tkFileDialog.askopenfilename()
filename2 = tkFileDialog.askopenfilename(initialdir=r"C:\Users")
filename3 = tkFileDialog.asksaveasfilename()
filename4 = tkFileDialog.asksaveasfilename(initialdir=r"C:\Users")
if filename1 <> "":
  for line in open(filename1): # Dummy reading of the file
    dummy = line.rstrip()

单选按钮

单选按钮可以用来创建具有多个选项的简单选择对话框:

from Tkinter import *
master = Tk()  
choices = [("Apple", "a"), ("Orange", "o"), ("Pear", "p")]
defaultChoice = "a"
userchoice = StringVar()
userchoice.set(defaultChoice)
def cancelAction(): userchoice.set(""); master.quit()
Label(master, text="Choose a fruit:").pack()
for text, key in choices: 
    Radiobutton(master, text=text, variable=userchoice, value=key).pack(anchor=W)
Button(master, text="OK", command=master.quit).pack(side=LEFT, ipadx=10)
Button(master, text="Cancel", command=cancelAction).pack(side=RIGHT, ipadx=10)
mainloop()
if userchoice.get() <>"":
    print userchoice.get() # "a", or "o", or "p"
else:
    print "Choice canceled."

替代单选按钮(立即响应按钮按下):

from Tkinter import *
import os
buttons = [("Users", r"C:\Users"),
           ("Windows", r"C:\Windows"),
           ("Program Files", r"C:\Program Files")]
master = Tk()
def open(filePath):
  def openInner():
    os.chdir(filePath) # Cross platform
    #os.system('start "" "'+filePath+'') # Windows
    master.quit()
  return openInner
Label(master, text="Choose a fruit:").pack()
for buttonLabel, filePath in buttons:
  Button(master, text=buttonLabel, command=open(filePath)).pack(anchor=W)
mainloop()

参考链接:

列表框

列表框可以用于创建一个简单的多选对话框:

from Tkinter import *
master = Tk()  
choices = ["Apple", "Orange", "Pear"]
canceled = BooleanVar()

def cancelAction(): 
    canceled.set(True); 
    master.quit()

Label(master, text="Choose a fruit:").pack()
listbox = Listbox(master, selectmode=EXTENDED)  # 可以选择多个选项
for text in choices: 
    listbox.insert(END, text)
listbox.pack()    

Button(master, text="OK", command=master.quit).pack(side=LEFT, ipadx=10)
Button(master, text="Cancel", command=cancelAction).pack(side=RIGHT, ipadx=10)

mainloop()

if not canceled.get():
    print listbox.curselection()  # 返回选中的索引元组,从0开始
    if "0" in listbox.curselection(): print "Apple chosen."
    if "1" in listbox.curselection(): print "Orange chosen."
    if "2" in listbox.curselection(): print "Pear chosen."
else:
    print "Choice canceled."

复选框

复选框或勾选按钮可以按如下方式创建:

from Tkinter import *
root = Tk()
checkbuttonState = IntVar()
Checkbutton(root, text="Recursive", variable=checkbuttonState).pack()
mainloop()
print checkbuttonState.get()  # 1 = checked; 0 = unchecked

输入框

输入框小部件是一个单行文本输入框,可以按如下方式使用:

from Tkinter import *
root = Tk()
Label(text="Enter your first name:").pack()
entryContent = StringVar()
Entry(root, textvariable=entryContent).pack()
mainloop()
print entryContent.get()

菜单

可以按如下方式创建菜单:

from Tkinter import *
root = Tk()

def mycommand(): 
    print "Chosen."

menubar = Menu(root)

menu1 = Menu(menubar, tearoff=0)
menu1.add_command(label="New", command=mycommand)
menu1.add_command(label="Clone", command=mycommand)
menu1.add_separator()
menu1.add_command(label="Exit", command=root.quit)
menubar.add_cascade(label="Project", menu=menu1)

menu2 = Menu(menubar, tearoff=0)
menu2.add_command(label="Oval", command=mycommand)
menu2.add_command(label="Rectangle", command=mycommand)
menubar.add_cascade(label="Shapes", menu=menu2)

root.config(menu=menubar)
mainloop()

LabelFrame

LabelFrame 小部件可以用于创建一个包含其他元素的框架:

from Tkinter import *
root = Tk()
Label(text="Bus").pack()
frame = LabelFrame(root, text="Fruits")  # text 是可选的
frame.pack()
Label(frame, text="Apple").pack()
Label(frame, text="Orange").pack()
mainloop()

消息框

消息框似于标签,但可以自动换行显示多行文本:

from Tkinter import *
root = Tk()
Message(text="Lazy brown fox jumped. " * 5, width=100).pack()  # width 是可选的
mainloop()

选项菜单

在 Tkinter 中,可以按如下方式创建下拉列表:

from Tkinter import *
root = Tk()
options = ["Apple", "Orange", "Pear"]
selectedOption = StringVar()
selectedOption.set("Apple")  # 默认值
OptionMenu(root, selectedOption, *options).pack()  
mainloop()
print selectedOption.get()  # 获取选中的选项文本

文本框

文本框小部件是一个更复杂的小部件,允许编辑纯文本和格式化文本,包括多种字体。

Tcl/Tk 版本

Python 2.3 的 Windows 安装包捆绑了 Tcl/Tk 8.4.3。你可以通过以下方式查看版本:

import Tkinter
print Tkinter.TclVersion  # 直到 8.5
print Tkinter.TkVersion  # 直到 8.5
最后修改: 2025年01月31日 星期五 01:31