学习环境: Windows,python,PyCharm
使用tkinter模块,只需要简单地导入就可以了。可以使用以下三种方法。
import tkinter
from tkinter import *
import tkinter as tk
可以选择自己顺手的方式。
作为学习的传统,先来一个经典的hello world程序。
import tkinter as tk
root = tk.Tk() # 创建底层窗口,每个程序中只能存在一个,并应在其他组件前创建。
w = tk.Label(root, text='Hello world!') # 创建一个Label组件
w.pack() # 将组件可视化
root.mainloop() #
知识点: Label组件可以显示文本、图标或其他图像
当你试图写一个较大的程序时,将程序包装成不同的类或许是一个好方法。如下例:
from tkinter import *
class App:
def __init__(self, master):
frame = Frame(master)
frame.pack()
self.button = Button(frame, text='Quit', fg='red'
, command=frame.quit)
self.button.pack(side=LEFT)
self.hi_there = Button(frame, text='Hello',
command=self.say_hi)
self.hi_there.pack(side=LEFT)
def say_hi(self):
print('hi there, everyone!')
root = Tk()
app = App(root)
root.mainloop()
上例中,新建了一个App类。其构造函数__inti__通过一个父类组件(master)调用并生成一系列的子组件。该构造函数首先创建了一个Frame组件。一个Frame就是一个简单的容器,在上例中用来保存另外两个组件。
class App:
def __init__(self, master):
frame = Frame(master)
frame.pack()
将新建的Frame组件保存在变量frame中,并立即调用pack方法使其可视化。
之后又创建了两个Button组件,作为frame的子组件。
self.button = Button(frame, text='Quit', fg='red'
, command=frame.quit)
self.button.pack(side=LEFT)
self.hi_there = Button(frame, text='Hello',
command=self.say_hi)
self.hi_there.pack(side=LEFT)
在创建Button组件时,我们使用了一些参数:text命名Button,fg(foreground的简写)设置前景色,command指定调用函数(当点击Button时会调用该函数)。
它们的pack方法中使用了side=LEFT,意味着Button组件在frame中会尽量地向左排。默认为TOP。
然后编写‘hello’Button的调用函数:
def say_hi(self):
print('hi there, everyone!')
最后,创建底层界面,实例化App类:
root = Tk()
app = App(root)
root.mainloop()
注意!! 当你只需要创建一个组件,而在之后不再对其有所操作,那最好使用下面的写法:
Button(frame, text="Hello", command=self.hello).pack(side=LEFT)
来代替
w = Button(frame, text="Hello", command=self.hello)
w.pack(side=LEFT)
再来了解一下tkinter都支持哪些组件
组件名 | 功能介绍 |
---|---|
Button | 创建一个按钮,用于执行命令或其他操作 |
Canvas | 创建结构化图形。本组件可以用来绘制图形和图表,创建图形编辑器,并实现定制组件。 |
Checkbutton | 表示可以具有两个不同值的变量。单击按钮在值之间切换。 |
Entry | 创建一个简单的文本输入框 |
Frame | 创建一个容器组件。可以有边框和背景,用于在创建appllication或对话框布局时对其他组件进行分组。 |
Label | 显示文本或图像 |
Listbox | 显示备选项的列表。可以将listbox配置为单选或多选。 |
Menu | 一个菜单面板。用于实现下拉菜单和弹出菜单 |
Menubutton | 创建一个菜单按钮,用于实现下拉菜单。 |
Message | 显示一个文本。类似于label组件,但可以自动将文本包装成给定的宽度或宽高比。 |
Radiobutton | 表示变量的一个值,该变量可以具有多个值中的一个。单击按钮将变量设置为该值,并清除与同一变量关联的所有其他radiobutton。 |
Scale | 允许通过拖动“滑块”设置数值。 |
Scrollbar | 与Canvas、Entry、Listbox和Text组件一起使用的标准滚动条。 |
Text | 格式化的文本显示。允许您显示和编辑具有各种样式和属性的文本。还支持嵌入式图像和窗口。 |
Toplevel | 显示为一个单独的顶层窗口的容器组件。 |
LabelFrame | Frame组件的一个变体,可以同时绘制边框和标题。 |
PanedWindow | 一个容器组件,它在可调整大小的窗格中组织子组件。 |
Spinbox | Entry组件的一个变体,用于从范围或有序集合中选择值。 |
以上组件除了其各自特有定义的方法外,还均支持Misc、几何设计方法和配置管理方法
底层窗口(即Tk())和组件类将Misc当作一个mixin使用。而mixin表示一个被设计成使用多重继承与其他类相结合的类。
组件类将Misc类与geometry mixin混合,并通过cget和configure方法以及部分dictionary接口添加配置管理。后者可用于设置和查询单个选项。
为了控制组件的显示,通常更多使用options而不是调用方法。典型的options有text,color,size和command等。所有的核心组件都有相同的配置接口:
widgetclass可以是上面提到的任一组件类。在给定master(即基层窗口Tk())上,按照指定的options创建一个该组件类的实例。所有options都有默认值,所有创建最简单的组件时可以不指定options。
返回option的当前指定值。option名和返回值都是字符串。
设置一个或多个options
返回一个该组件可设置options的列表。
tkinter所有标准组件都有一系列式样options,允许用户自定义颜色,字体和其他组件可视化部分。
大多数组件都支持用户自定义组件和文本颜色,方法包括background和foreground。设置颜色时,可以直接使用颜色名如red,或使用RGB值。
组件设置字体通常使用font。设置方式主要有以下几种
import tkinter.font as tkFont
from tkinter import *
root = Tk()
my_font = tkFont.Font(family="Times", size=10, weight=tkFont.BOLD, slant=tkFont.ITALIC, underline=1)
button = Button(root, text='button', font=my_font)
button.pack()
root.mainloop()
文本默认居中。可通过justify设置为LEFT或RIGHT。可通过wraplength设置文本的宽度。
cursor:此选项控制当鼠标移动到组件上时要使用的鼠标光标。
将一个事件和函数或方法绑定。如widget.bind(event, handler)
捕捉鼠标点击:
from tkinter import *
root = Tk()
def callback(event):
print ("clicked at", event.x, event.y)
frame = Frame(root, width=100, height=100)
frame.bind("" , callback)
frame.pack()
root.mainloop()
捕捉键盘事件:
from tkinter import *
root = Tk()
def key(event):
print ("pressed", repr(event.char))
def callback(event):
frame.focus_set()
print ("clicked at", event.x, event.y)
frame = Frame(root, width=100, height=100)
frame.bind("" , key)
frame.bind("" , callback)
frame.pack()
root.mainloop()
事件通常写成字符串形式,具体语法:< modifier-type-detail >。
注意!本部分的事件语法中去掉空格后才能使用
最常见的事件:
事件名 | 事件描述 |
---|---|
< Button-1 > | 在组件上按下鼠标,1表示左键,2表示中键,3表示右键 |
< B1-Motion > | 在按下鼠标时,同时移动鼠标 |
< ButtonRelease-1 > | 松开鼠标 |
< Double-Button-1 > | 双击鼠标 |
< Enter > | 鼠标指针进入组件,而不是用户敲击Enter键 |
< Leave > | 鼠标指针离开组件 |
< FocusIn > | 键盘焦点被移动到这个组件,或者这个组件的子组件。 |
< FocusOut > | 键盘焦点从这个组件离开,到另一个组件 |
< Return > | 用户敲击Enter键 |
< Key > | 用户敲击任何键 |
a | 用户输入了一个“a”。大多数可打印字符可以按原样使用。例外情况是空格(< spac e>)和小于(< less >)。注意,1是键盘绑定,而< 1 >是按钮绑定。 |
< Shift-Up > | 用户按下向上箭头,同时按住Shift键。Alt, Shift, and Control都可使用 |
< Configure > | 组件大小改变。并返回新的width和height |
事件属性:
属性名 | 属性描述 |
---|---|
widget | 产生事件的组件 |
x,y | 鼠标的当前位置,以像素为单位。 |
x_root, y_root | 当前鼠标相对于屏幕左上角的位置,以像素为单位。 |
char | 字符代码字符串(仅限键盘事件)。 |
keysym | 键符号(仅限键盘事件)。 |
keycode | 键码(仅限键盘事件)。 |
num | 按钮编号(仅限鼠标按钮事件)。 |
width, height | 组件的新大小(以像素为单位)(仅Configure事件)。 |
type | 事件类型 |
from tkinter import *
root = Tk()
# 置于root窗口的组件在这里创建
root.mainloop()
from tkinter import *
root = Tk()
# 置于root窗口的组件在这里创建
top = Toplevel()
# 置于top窗口的组件在这里创建
root.mainloop()
tkinter中,通过Menu类创建菜单组件实例,用add方法添加条目:
from tkinter import *
def callback():
print("called the callback!")
root = Tk()
# create a menu
menu = Menu(root)
root.config(menu=menu)
filemenu = Menu(menu)
menu.add_cascade(label="File", menu=filemenu)
filemenu.add_command(label="New", command=callback)
filemenu.add_command(label="Open...", command=callback)
filemenu.add_separator()
filemenu.add_command(label="Exit", command=callback)
helpmenu = Menu(menu)
menu.add_cascade(label="Help", menu=helpmenu)
helpmenu.add_command(label="About...", command=callback)
mainloop()
from tkinter import *
root = Tk()
def callback():
print("called the callback!")
# create a toolbar
toolbar = Frame(root)
b = Button(toolbar, text="new", width=6, command=callback)
b.pack(side=LEFT, padx=2, pady=2)
b = Button(toolbar, text="open", width=6, command=callback)
b.pack(side=LEFT, padx=2, pady=2)
toolbar.pack(side=TOP, fill=X) # fill=X将调整toolbar的大小,以达到完全填满的状态。
mainloop()
最简单的方法就是创建一个Label组件
status = Label(master, text="", bd=1, relief=SUNKEN, anchor=W)
status.pack(side=BOTTOM, fill=X)
新建状态类
from tkinter import *
class StatusBar(Frame):
def __init__(self, master):
Frame.__init__(self, master)
self.label = Label(self, bd=1, relief=SUNKEN, anchor=W)
self.label.pack(fill=X)
def set(self, format, *args):
self.label.config(text=format % args)
self.label.update_idletasks()
def clear(self):
self.label.config(text="")
self.label.update_idletasks()
root = Tk()
status = StatusBar(root)
status.pack(side=BOTTOM, fill=X)
mainloop()
tkinter模块提供了消息框的接口。它含有7个函数:showinfo, showwarning, showerror, askquestion, askokcancel, askyesno,和askretrycancel,并且有相同的使用语法:tkinter.function(title, message [, options])
这些函数可分为两类,第一类是显示信息,用户需要点击OK。
from tkinter import *
from tkinter import messagebox
root = Tk()
messagebox.showwarning('warning','something unexpected')
messagebox.showinfo('information','something informative')
messagebox.showerror('error','something wrong')
root.mainloop()
第二类是询问,用户需要选择。
from tkinter import *
from tkinter import messagebox
root = Tk()
messagebox.askquestion()
messagebox.askokcancel()
messagebox.askretrycancel()
messagebox.askyesnocancel()
messagebox.askyesno()
root.mainloop()