Tkinter 的基本组件我们已经介绍得七七八八了,剩下的一些我们在这节课全部都会讲解完毕。
(一)Message组件
Message(消息)组件是 Label 组件的变体,用于显示多行文本消息。众所周知,我们的Label 组件只能显示单行消息。Message 组件能够自动换行,并调整文本的尺寸使其适应给定的尺寸。
我们来举个例子,大家就明白了:
-
import tkinter as tk
-
root = tk.Tk()
-
w1 = tk.Message(root, text = "这是一则短消息", width = 100)
-
w1.pack()
-
w2 = tk.Message(root, text = "这是一则骇人听闻的长长长长长长长长长长长消息", width = 100)
-
w2.pack()
-
root.mainloop()
(二)Spinbox组件
Spinbox 组件(Tk8.4 新增)是 Entry 组件的变体,用于从一些固定的值中选取一个。众所周知,我们的Entry组件是能够让用户随心所欲输入数据的组件,Spinbox 组件就进一步限制用户输入的数据。
我们还是举个例子:
-
import tkinter as tk
-
root = tk.Tk()
-
w= tk.Spinbox(root, from_ = 0, to = 10)
-
w.pack()
-
root.mainloop()
我们可以通过上下点,输入 0 -10,另外,我们还是可以任意输入数据,我们可以通过改变 increment 选项的值,来改变步进。
你还可以通过元组指定允许输入的值:
-
import tkinter as tk
-
root = tk.Tk()
-
w= tk.Spinbox(root, values = ("python", "C", "java", "C#"))
-
w.pack()
-
root.mainloop()
(三)PanedWindow组件
PanedWindow 组件(Tk8.4 新增)是一个空间管理组件。跟 Frame 组件类似,都是为组件提供一个框架,不过 PanedWindow 允许让用户调整应用程序的空间划分。
不明白的话,可以先看下面的两个例子,就会豁然开朗了。
我们的窗格有简单的,例如两个窗格:上和下,左和右。
-
import tkinter as tk
-
m = tk.PanedWindow(orient="vertical")
-
m.pack(fill="both", expand=1)
-
top = tk.Label(m, text="top pane")
-
m.add(top)
-
bottom = tk.Label(m, text="bottom pane")
-
m.add(bottom)
-
tk.mainloop()
创建一个 3 窗格的 PanedWindow 组件则需要一点小技巧:
-
import tkinter as tk
-
#先创建左右的窗格
-
m1 = tk.PanedWindow() #默认是左右分布的
-
m1.pack(fill="both", expand=1)
-
left = tk.Label(m1, text = "left pane")
-
m1.add(left)
-
m2 = tk.PanedWindow(orient = "vertical")
-
m1.add(m2)
-
top = tk.Label(m2, text = "top pane")
-
m2.add(top)
-
bottom = tk.Label(m2, text = "bottom pane")
-
m2.add(bottom)
-
tk.mainloop()
这里不同窗格事实上是有一条“分割线”(sash)隔开,虽然你看不到,但你却可以感受到它的存在。不信?不妨把鼠标缓慢移动到大概的位置,当鼠标指针改变的时候后拖拽鼠标......
但我们也可以把“分割线”给显式地显示出来,并且可以为它附上一个“手柄”(handle):
-
import tkinter as tk
-
#先创建左右的窗格
-
m1 = tk.PanedWindow(showhandle = True, sashrelief = "sunken") #默认是左右分布的
-
m1.pack(fill="both", expand=1)
-
left = tk.Label(m1, text = "left pane")
-
m1.add(left)
-
m2 = tk.PanedWindow(orient = "vertical", showhandle = True, sashrelief = "sunken")
-
m1.add(m2)
-
top = tk.Label(m2, text = "top pane")
-
m2.add(top)
-
bottom = tk.Label(m2, text = "bottom pane")
-
m2.add(bottom)
-
tk.mainloop()
图中的小方块就是 handle, 默认离边界为 8 个像素,可以通过 handlepad 选项来设置它的位置。
(四)Toplevel 组件
Toplevel 组件和 root 组件是一个级别的,Toplevel(顶级窗口)组件类似于 Frame 组件,但 Toplevel 组件是一个独立的顶级窗口,这种窗口通常拥有标题栏、边框等部件。
Toplevel 组件通常用在显示额外的窗口、对话框和其他弹出窗口上。
-
import tkinter as tk
-
root = tk.Tk()
-
def create():
-
top = tk.Toplevel()
-
top.title("Python tkinter")
-
msg = tk.Message(top, text = "I love Python!")
-
msg.pack()
-
tk.Button(root, text = "创建顶级窗口", command = create).pack()
-
root.mainloop()
想要几个就点几下。
得到的顶级窗口都是相互独立的,但是都是来自于 root 窗口,当 root 窗口关闭后,所有的顶级窗口都被关闭。