如果你想学习Python GUI编程,那么Tkinter是一个非常好的选择。Tkinter作为Python内置的GUI工具包,其简易性、可移植性和可扩展性都是极为出色的。
在这篇文章中,我们将介绍Python tkinterpack的基础知识。首先,我们将讲解如何安装Tkinter并编写你的第一个GUI应用程序。接着,我们将深入理解Tkinter的基础知识,例如Frame、Label、Button等。最后,我们将讨论如何构建更为复杂的GUI应用程序。
一、安装和第一个应用程序
安装
首先,让我们来安装Tkinter。在Python2.x中,Tkinter已经被默认安装。对于Python3.x,如果你没有安装Tkinter,你需要执行以下步骤:
sudo apt-get install python3-tk
或者
sudo yum install python3-tkinter
第一个应用程序
让我们快速地写一个程序,用它来了解Tkinter是如何工作的。这个程序将在屏幕中央显示一个按钮,点击它将会弹出一个问候对话框。
import tkinter as tk
from tkinter import messagebox
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.hello_button = tk.Button(self)
self.hello_button["text"] = "Click me!"
self.hello_button["command"] = self.say_hello
self.hello_button.pack(side="top")
def say_hello(self):
messagebox.showinfo("Hello!", "Hello World")
root = tk.Tk()
app = Application(master=root)
app.mainloop()
在上述代码中,我们首先导入Tkinter和messagebox模块。我们创建了一个Application类,它是一个Frame,用来容纳作为自己的子组件的所有小部件。在构造函数中,我们调用了Frame的构造函数,并将self.master设置为主Tkinter对象。然后我们调用了create_widgets()方法,该方法将创建我们唯一的小部件——一个Button。这个Button有一个命令(command)属性,将其设置为say_hello方法,这个方法将弹出一个messagebox,显示问候语。
最后一行创建了主Tkinter对象,并启动事件循环。
二、基本的Tkinter小部件
下面我们将介绍基本的Tkinter小部件,它们可用于创建GUI应用程序。这些小部件包括Frame、Label、Button、Entry、Checkbutton、Radiobutton、Listbox、Scrollbar、Menu和Canvas。
Frame
Frame通常被用作容器,来容纳其他的小部件。它本身不显示任何东西,但是可以调整其他小部件的位置和大小。
import tkinter as tk
root = tk.Tk()
frame1 = tk.Frame(root)
frame1.pack()
frame2 = tk.Frame(root)
frame2.pack(side="bottom")
tk.Button(frame1, text="Button1", fg="red").pack(side="left")
tk.Button(frame1, text="Button2", fg="blue").pack(side="left")
tk.Button(frame2, text="Button3", fg="green").pack(side="bottom")
root.mainloop()
上述代码中,我们创建了两个Frame,frame1位于顶部,frame2位于底部。我们在frame1中放置了两个Button,它们分别位于frame1左侧,button3位于frame2中,位于底部。
Label
Label用于在GUI中显示文本或图像。
import tkinter as tk
root = tk.Tk()
label = tk.Label(root, text="Hello World")
label.pack()
root.mainloop()
上述代码中,我们创建了一个Label,该Label包含一个文本"Hello World"。将Label添加到主Tkinter对象并运行程序。
Button
Button允许用户单击它来触发某些操作。
import tkinter as tk
root = tk.Tk()
def say_hello():
print("Hello World")
button = tk.Button(root, text="Click me!", command=say_hello)
button.pack()
root.mainloop()
上述代码中,我们定义了一个say_hello函数,当用户单击Button时,该函数将被调用。我们创建一个Button,并将其命令设置为say_hello函数。将Button添加到主Tkinter对象并运行程序。
Entry
Entry用于输入文本信息。
import tkinter as tk
root = tk.Tk()
entry = tk.Entry(root)
entry.pack()
root.mainloop()
上述代码中,我们创建了一个Entry,用于用户输入文本。将Entry添加到主Tkinter对象并运行程序。
Checkbutton
Checkbutton用于启用/禁用选项。
import tkinter as tk
root = tk.Tk()
var1 = tk.BooleanVar()
var2 = tk.BooleanVar()
checkbutton1 = tk.Checkbutton(root, text="Option1", variable=var1)
checkbutton2 = tk.Checkbutton(root, text="Option2", variable=var2)
checkbutton1.pack()
checkbutton2.pack()
root.mainloop()
上述代码中,我们创建了两个Checkbutton,用于启用/禁用选项。我们定义了两个BooleanVar变量来存储选项是否被选中。将Checkbutton添加到主Tkinter对象并运行程序。
Radiobutton
Radiobutton用于从多个选项中选择一个。
import tkinter as tk
root = tk.Tk()
var = tk.StringVar()
var.set("Option1")
radiobutton1 = tk.Radiobutton(root, text="Option1", variable=var, value="Option1")
radiobutton2 = tk.Radiobutton(root, text="Option2", variable=var, value="Option2")
radiobutton3 = tk.Radiobutton(root, text="Option3", variable=var, value="Option3")
radiobutton1.pack()
radiobutton2.pack()
radiobutton3.pack()
root.mainloop()
在上述代码中,我们创建了三个Radiobutton,用于从多个选项中选择一个。我们定义了一个StringVar变量来存储选项。将Radiobutton添加到主Tkinter对象并运行程序。
Listbox
Listbox用于显示多个可选项。
import tkinter as tk
root = tk.Tk()
listbox = tk.Listbox(root)
listbox.insert(1, "Option1")
listbox.insert(2, "Option2")
listbox.insert(3, "Option3")
listbox.pack()
root.mainloop()
上述代码中,我们创建了一个Listbox,用于显示多个可选项。我们使用insert()方法向Listbox中添加项目。将Listbox添加到主Tkinter对象并运行程序。
Scrollbar
Scrollbar用于支持滚动功能的小部件。
import tkinter as tk
root = tk.Tk()
listbox = tk.Listbox(root)
listbox.insert(1, "Option1")
listbox.insert(2, "Option2")
listbox.insert(3, "Option3")
scrollbar = tk.Scrollbar(root)
scrollbar.pack(side="right", fill="y")
listbox.pack(side="left", fill="both")
scrollbar.config(command=listbox.yview)
listbox.config(yscrollcommand=scrollbar.set)
root.mainloop()
在上述代码中,我们创建了一个Listbox和一个Scrollbar。将Scrollbar添加到主Tkinter对象,并为其设置command,以便滚动Listbox中的项。将Listbox添加到主Tkinter对象并使用yscrollcommand属性并设置其为Scrollbar的set方法。运行程序。
Menu
Menu用于创建菜单。
import tkinter as tk
root = tk.Tk()
menu = tk.Menu(root)
root.config(menu=menu)
file_menu = tk.Menu(menu)
menu.add_cascade(label="File", menu=file_menu)
file_menu.add_command(label="Open...", command=lambda: print("Open File"))
file_menu.add_command(label="Exit", command=root.quit)
root.mainloop()
上述代码中,我们创建了一个菜单及其子菜单。将菜单添加到主Tkinter对象,并运行程序。点击菜单中的项应该会执行相应的命令。
Canvas
Canvas用于绘制图形。
import tkinter as tk
root = tk.Tk()
canvas = tk.Canvas(root, width=200, height=200)
canvas.pack()
canvas.create_rectangle(50, 50, 150, 150, fill="blue")
canvas.create_line(0, 0, 200, 200)
root.mainloop()
在上述代码中,我们创建了一个Canvas,并在其上创建了一个矩形和一条线段。将Canvas添加到主Tkinter对象并运行程序。
三、构建复杂的GUI应用程序
在本节中,我们将介绍如何构建复杂的GUI应用程序。我们将使用上文介绍的所有小部件,并学习如何将它们组合成一个完整的应用程序。
样例
我们将构建一个简单的应用程序,其中包含一个文本框、一个按钮和一个标签。当用户单击按钮时,我们将获取文本框中的文本,并将其显示在标签中。
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.input_frame = tk.Frame(self)
self.input_frame.pack(side="top")
self.input_label = tk.Label(self.input_frame, text="Input:")
self.input_label.pack(side="left")
self.input_entry = tk.Entry(self.input_frame)
self.input_entry.pack(side="left")
self.button_frame = tk.Frame(self)
self.button_frame.pack(side="top")
self.submit_button = tk.Button(self.button_frame, text="Submit", command=self.submit)
self.submit_button.pack(side="left")
self.quit_button = tk.Button(self.button_frame, text="Quit", command=self.master.quit)
self.quit_button.pack(side="left")
self.output_frame = tk.Frame(self)
self.output_frame.pack(side="top")
self.output_label = tk.Label(self.output_frame, text="Output:")
self.output_label.pack(side="left")
self.output_text = tk.StringVar()
self.output_entry = tk.Entry(self.output_frame, textvariable=self.output_text)
self.output_entry.pack(side="left")
def submit(self):
text = self.input_entry.get()
self.output_text.set(text)
root = tk.Tk()
app = Application(master=root)
app.mainloop()
在上述代码中,我们创建了一个Application类,用作Frame的子组件容器。我们将其分为三个Frame,分别是:输入、按钮以及输出。我们在输入Frame中添加了一个Label和一个Entry,用于用户输入文本。我们在按钮Frame中添加了两个Button,一个提交用户输入,另一个退出程序。在输出Frame中添加了一个Label和一个Entry,用于显示提交的文本。
在submit()方法中,我们获取了用户输入的文本,并将其设置到输出Entry中。
运行程序,你将看到一个包含输入框、按钮和输出框的窗口。在输入框中输入文本并单击按钮,你将在输出框中看到相同的文本。