python tkinter
基本使用
基于tkinter创建 GUI基本四步:窗口->组件->布局->事件
1.创建窗口对象
from tkinter import *
root = Tk() # 创建窗口
root.mainloop() # 进入事件循环
2.创建组件
按钮文本等组件
btn = Button(root) # 创建Button组件,使组件在root窗口展示
btn['text'] = '我是按钮' # 组件属性参数
3.布局管理
管理组件的大小位置样式
btn.pack() # 布局管理器,组件的大小位置样式
4.事件
通过与组件绑定,获取组件所触发的事件
def btn_event(obj): # obj 即事件对象
print('控制台输出:'+'触发了事件') # 输出到控制台
btn.bind('<Button-1>', btn_event) # 事件和组件进行绑定
案例:
from tkinter import *
from tkinter import messagebox
root = Tk() # 创建窗口
btn = Button(root) # 创建Button组件,使组件在root窗口展示
btn['text'] = '我是按钮'
btn.pack() # 布局管理器,配置组件的样式
def btn_event(obj): # obj 即事件对象
messagebox.showinfo("Message","触发了事件") # 弹出新的窗口,并展示内容
print('控制台输出:'+'触发了事件') # 输出到控制台
btn.bind('<Button-1>', btn_event) # 事件绑定,事件和组件进行绑定 <Button-1> :鼠标左键点击一次 <Button-2>:鼠标右键点击一次
if __name__ == '__main__':
root.mainloop() # 进入事件循环
主窗口
title('窗口标题')
geometry('wxh ± x, ±y')
- w:宽度
- h:高度
- +x:距屏幕左边的距离,-x:距屏幕右边的距离
- +y:距屏幕上边的距离,-y:距;屏幕下边的距离
root.geometry('500x300+100+200') # 宽度500,高度300,距左边100,距上边200
组件
Toplevel | 顶层 | 容器类,可为其他组件提供单独的容器,类似窗口 |
Button | 按钮 | 按钮点击组件 |
Ganvas | 画布 | 提供绘图功能 |
CheckButton | 复选框 | 可勾选的复选框 |
Entry | 单行输入框 | 可输入内容 |
Frame | 容器 | 用于装载其他组件 |
LabelFrame | 容器 | 类似Frame,但可以添加标题 |
label | 标签 | 显示不可编辑的文本或图标 |
Listbox | 列表框 | 可列出多个选项 |
Menu | 菜单 | 菜单组件 |
MenuButton | 菜单按钮 | 包含菜单的按钮,包括下拉层叠式等 |
OptionMenuu | 菜单按钮 | MenuButton的子类,可通过按钮打开一个菜单 |
Message | 消息框 | 可以显示多行文档 |
Frame容器
GUI编程就是编写一个个组件,界面由组件组成,组件内又可以创建组件,这种组件即为容器
import tkinter as tk
from tkinter import Frame
root = tk.Tk()
root.title('包含容器的GUI')
root.geometry('500x300+200+200')
frame = Frame(master=root) # 在root中创建容器
frame.pack()
root.mainloop()
经典的面向对象的GUI
import tkinter as tk
from tkinter import *
from tkinter import messagebox
root = tk.Tk()
root.title('经典的面向对象的GUI')
root.geometry('500x300+200+200')
class Application(Frame):
def __init__(self, master):
super().__init__(master)
self.master = master
self.pack()
self.create_widget()
def create_widget(self):
'''创建各种组件'''
self.btn01 = Button(self, text='容器的按钮01', command=self.btn01_event) # 创建button组件,在Frame中显示,这里的self是Frame
self.btn01.pack()
self.btn02 = Button(self, text='退出', command=root.destroy)
self.btn02.pack()
def btn01_event(self):
messagebox.showinfo('Message', '触发了事件')
print('控制台输出:' + '触发了事件') # 输出到控制台
def main():
app = Application(root)
root.mainloop()
if __name__ == '__main__':
main()
Label
- font:字体和大小,1个中文宽度两个字符,高度一个字符
- image:图片,目前支持gif
- fg:前景色,bg:背景色
- justigy:对齐方式,left、center、right
- width:宽度,heigth:高度
import tkinter as tk
from tkinter import *
from tkinter import messagebox
root = tk.Tk()
root.title('我是窗口')
root.geometry('500x300+200+200')
class Application(Frame):
def __init__(self, master):
super().__init__(master)
self.master = master
self.pack()
self.create_widget()
def create_widget(self):
'''创建各种组件'''
# 文件标签
self.text_label = Label(self, text='label组件',
width=10, height=2, bg='black', fg='white', font=('黑体', 15), justify='left', borderwidth=1)
self.text_label.pack()
self.text_label2 = Label(self, text='label组件\nlabel组件内容不能修改\n哈哈',
bg='black', fg='white', font=('黑体', 15), justify='left', borderwidth=1)
self.text_label2.pack()
# 图片标签
global PHOTO
PHOTO = PhotoImage(file='img.gif') # 注意:图片最好是全局变量
self.photo_label = Label(root, image=PHOTO)
self.photo_label.pack()
def main():
app = Application(root)
root.mainloop()
if __name__ == '__main__':
main()
Button
import tkinter as tk
from tkinter import *
from tkinter import messagebox
root = tk.Tk()
root.title('我是窗口')
root.geometry('500x300+200+200')
PHOTO = PhotoImage(file='img.gif') # 注意:图片最好是全局变量
class Application(Frame):
def __init__(self, master):
super().__init__(master)
self.master = master
self.pack()
self.create_widget()
def create_widget(self):
'''创建各种组件'''
self.login_btn = Button(self, text='登录', command=self.login_event) # 创建button组件,在Frame中显示,这里的self是Frame
self.login_btn.pack()
self.image_btn = Button(self, image=PHOTO, command=self.image_event)
self.image_btn.pack()
self.image_btn['state'] = 'disable' # 按钮禁止点击
def image_event(self):
messagebox.showinfo('Message', '点击了图片')
def login_event(self):
messagebox.showinfo('Message', '登录成功')
# print('控制台输出:' + '触发了事件') # 输出到控制台
def main():
app = Application(root)
root.mainloop()
if __name__ == '__main__':
main()
Entry
import tkinter as tk
from tkinter import *
from tkinter import messagebox
root = tk.Tk()
root.title('我是窗口')
root.geometry('500x300+200+200')
class Application(Frame):
def __init__(self, master):
super().__init__(master)
self.master = master
self.pack()
self.create_widget()
def create_widget(self):
'''创建各种组件'''
self.user_label = Label(self, text='用户')
self.user_label.pack()
user_value = StringVar() # 定义变量,要用来接收Entry输入的值
user_value.set('admin') # StringVar 的默认值
self.user_entry = Entry(self, textvariable=user_value) # StringVar变量绑定到Entry组件
self.user_entry.pack()
print(user_value.get())
print(self.user_entry.get())
self.pwd_label = Label(self, text='密码')
self.pwd_label.pack()
pwd_value = StringVar()
self.pwd_entry = Entry(self, textvariable=pwd_value, show="*") # 用户输入的内容展示成 *
self.pwd_entry.pack()
self.user_btn = Button(self, text='提交', command=self.login)
self.user_btn.pack()
def login(self):
print('用户名: ' + self.user_entry.get()) # 获取输入框的值
print('用户密码: ' + self.pwd_entry.get()) # 获取输入框的值
messagebox.showinfo('Message', '登录成功')
def main():
app = Application(root)
root.mainloop()
if __name__ == '__main__':
main()