GUI
GUI的概念
图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。
图形用户界面是一种人与计算机通信的界面显示格式,允许用户使用鼠标等输入设备操纵屏幕上的图标或菜单选项,以选择命令、调用文件、启动程序或执行其它一些日常任务。与通过键盘输入文本或字符命令来完成例行任务的字符界面相比,图形用户界面有许多优点。图形用户界面由窗口、下拉菜单、对话框及其相应的控制机制构成,在各种新式应用程序中都是标准化的,即相同的操作总是以同样的方式来完成,在图形用户界面,用户看到和操作的都是图形对象,应用的是计算机图形学的技术。
GUI:
- GUI概念
- GUI程序的组成:界面,菜单,按钮,输入框,显示框等
- GUI程序用户交互
图形界面应用程序 GUI
- 是一种 基于消息驱动模型 的可执行程序
- 程序的执行 依赖于用户的交互过程
- 程序执行过程中 实时响应用户操作
- 一般情况下程序执行后 不会主动退出
图形界面应用程序的运行模式
图形界面应用程序的消息处理模型
图形界面应用使用场合
- 多任务
- 强用户交互
- 非专业计算机用户
命令行应用程序和图形界面应用程序比较
tkinter的基本概念
tkinter是python中自带的用于GUI编程的模块,tkinter是对图形库TK的封装,tkinter是跨平台的,既在linux下编写的程序可以不加修改地在windows下运行,它的优势在于可移植性。
使用tkinter可以创建完整的GUI程序,在tkinter中可以直接使用文本框、按钮、标签等组件进行GUI编程,换句话说,要实现某个界面元素,只要调用对应的组件即可。tkinter是python中的一个模块,可以像其他模块在python的交互式shell中被导入tkinter模块被导入即可使用tkinter中的模块方法等。
tkinter 编程常用组件
GUI的样式
常用的组件
- Button:按钮。点击时执行一个动作
- Canvas:画布。绘制图表或图形(直线、 椭圆、多边形、矩形)
- Checkbutton:允许用户选择或反选一个选项,一组方框
- Entry:单行输入框。用来收集键盘输入的单行文本
- Frame:框架。用来承载放置其他GUI组件,一个容器
- Label:标签。用来显示不可编辑的文本或图标
- LabelFrame:容器组件。常用于复杂的窗口布局。
- Listbox:列表框。选择列表,用户可从中选择
- Menu:菜单条。用来实现下拉和弹出式菜单
- Menubutton:菜单按钮。用来挂载菜单的组件
- Message:消息框。类似Label但可 显示多行文本
- OptionMenu:选择菜单。下拉菜单的一 个改进版本
- PanedWindow:窗口布局管理。可以包含一个或多个组件
- Radiobutton:单选框。从多个选项中选取一个
- Scale:滑块组件。允许你通过滑块来设置一个数字值
- Scrollbar:滚动条。对其支持的组件提供滚动功能
- Spinbox:输入框。类似Entry,但可指定输入范围值
- Text:多行文本框。用来收集键盘输入的多行文本
- Toplevel:容器窗口,作为一个单独的、最上面的窗口显示
tkinter 界面布局
- place绝对布局,根据坐标设置组件位置
- pack相对布局,根据相对参数设置组件位置 (用的最多)
- grid表格布局,根据行和列设置组件位置
pack相对布局
- side:停靠方式,取值上、下、左、右
- fll:填充方式,X为填充水平方向,Y为垂直方向,BOTH为X+Y
- anchor:对齐方式,取值东、西、南、北、中间
Button按钮
按钮组件用于在Python应用程序中添加按钮,按钮上可以放.上文本或图像,按钮可用于监听用户行为,能够与一个Python函数关联,当按钮被按下时,自动调用该函数。
Canvas画布
画布(Canvas) 组件。用来绘图的。您可以将图形,文本小部件或框架放置在画布上
Checkbutton复选框
复选框用来选取我们需 要的选项,它前面有个小正方形的方块,如果选中则有一个对号,也可以再次点击以取消该对号来取消选中
Entry单行输入框
文本框用来让用户输入- -行文本字符串
Frame框架
在屏幕上显示一个矩形区域,多用来作为容器
Label标签
用来显示不可编辑的文本或图标。常和Entry输入框配合使用。
Listbox列表框
列表框组件。在Listbox窗 口小部件是用来显示一-个字符串列表给用户选择。
Menu菜单
菜单组件。显示菜单栏,用于下拉菜单和弹出菜单。
Menubutton菜单按钮
菜单按钮控件,用于显示菜单项。
Message消息组件
消息组件。用来显示多行文本,与labe比较类似。
Radiobutton单选按钮
单选按钮组件。显示一-组 单选的按钮,每次只有一-个被选中。
Scale组件
范围组件。显示一-个数值刻度, 通过滑动选择一个数字。
Scrollbar组件
滚动条组件。当内容超过可视化区域时使用,如列表框。
Text组件
文本组件。用于显示多行文本。
Toplevel组件
顶层窗口组件。用于创建独立与主窗口的顶层窗口组件。
PanedWindow组件
窗口布局管理组件,可以包含- -个或者多个子组件。用户可以用鼠标移动分割线来改变布局大小。
LabelFrame组件
带标题的Frame组件。LabelFrame 会在其子组件的周围绘制一个边框以及- -个标题。
MessageBox组件
弹出消息框组件。提示、警告、出错信息或询问弹框。
编程实例1
import tkinter as tk
class MainWindow:
def __init__(self):
# 创建主窗口
self.windows = tk.Tk()
self.windows.minsize(300, 300) # 窗口最小值
self.windows.title("示例")
# 添加组件
self.add_components()
# 进入消息循环
self.windows.mainloop()
def add_components(self):
my_frame = tk.Frame(self.windows)
my_frame.pack(side=tk.TOP)
# 创建按钮
my_button = tk.Button(my_frame, text="点我", command=self.button_clicked)
my_button.pack(side=tk.LEFT)
# 创建canvas
my_canvas = tk.Canvas(my_frame, bg="white")
my_canvas.create_rectangle(50, 50, 150, 150, outline="red", fill="blue", width=5)
my_canvas.pack(side=tk.RIGHT)
# 创建复选框
my_apple = tk.Checkbutton(my_frame, text="苹果")
my_apple.pack(side=tk.TOP)
# 创建单行文本
name = tk.Label(my_frame, text="姓名")
name.pack(side=tk.LEFT)
name_value = tk.Entry(my_frame, bd=5)
name_value.pack(side=tk.RIGHT)
def button_clicked(self):
print("按钮被点击了!")
if __name__ == '__main__':
MainWindow()
最终效果!
编程实例2
import tkinter as tk
class MainWindow:
def __init__(self):
# 创建主窗口
self.windows = tk.Tk()
self.windows.minsize(300, 300) # 窗口最小值
self.windows.title("示例")
# 初始化列表数据
self.list_data = ['苹果', '梨子', '葡萄', '西瓜']
# 添加组件
self.add_components()
# 进入消息循环
self.windows.mainloop()
def add_components(self):
my_frame = tk.Frame(self.windows)
my_frame.pack(side=tk.TOP)
# 创建Label
name = tk.Label(my_frame, text="请选择水果:")
name.pack(side=tk.TOP)
# 创建listbox
self.my_listbox = tk.Listbox(my_frame)
self.my_listbox.pack(side=tk.LEFT)
for item in self.list_data:
self.my_listbox.insert("end", item)
my_button = tk.Button(my_frame, text="选择", command=self.button_clicked)
my_button.pack(side=tk.RIGHT)
# 创建菜单
self.menubar = tk.Menu(self.windows, bg="lightgrey", fg="black") # 主菜单
self.file_new = tk.Menu(self.menubar, bg="lightgrey", fg="black") # 子菜单
self.menubar.add_cascade(label="文件", menu=self.file_new)
self.file_new.add_command(label="新建", command=self.file_new_command, accelerator="Ctrl+N")
self.windows.configure(menu=self.menubar)
# 创建第二个Frame容器
my_frame2 = tk.Frame(self.windows)
my_frame2.pack(side=tk.BOTTOM)
# 创建菜单按钮
menubutton = tk.Menubutton(my_frame2, text="菜单按钮", relief=tk.RAISED) # relief 按钮样式 tk.RAISED 突出显示
menubutton.pack(side=tk.TOP)
file_menu = tk.Menu(menubutton)
file_menu.add_command(label="新建", command=self.file_new_command)
menubutton.configure(menu=file_menu)
# 创建Message消息
my_message = tk.Message(my_frame2, text="这是一册可以自动换行很长很长的文本消息", width=150)
my_message.pack()
def button_clicked(self):
index = self.my_listbox.curselection() # 当前选项
if index:
print(self.list_data[index[0]]) # 选出水果名称
else:
print("未选择")
def file_new_command(self):
print("新建文件")
if __name__ == '__main__':
MainWindow()
编程实例3
import tkinter as tk
class MainWindow:
def __init__(self):
# 创建主窗口
self.windows = tk.Tk()
self.windows.minsize(300, 300) # 窗口最小值
self.windows.title("示例")
# 定义radiobutton相关的变量
self.list_data = (
("苹果", 0), ("梨子", 1), ("葡萄", 2), ("西瓜", 3)
)
self.radio_selected = tk.IntVar() # 用户选择哪个项
# 定义scale相关变量
self.scale_value = tk.IntVar()
# 添加组件
self.add_components()
# 进入消息循环
self.windows.mainloop()
def add_components(self):
my_frame = tk.Frame(self.windows)
my_frame.pack(side=tk.TOP)
# 创建按钮
my_button = tk.Button(my_frame, text="点我", command=self.button_clicked)
my_button.pack(side=tk.LEFT)
# 创建radiobutton
for label, value in self.list_data:
tk.Radiobutton(my_frame, text=label, value=value, variable=self.radio_selected,
command=self.radio_clicked).pack()
# 创建scale
my_scale = tk.Scale(my_frame, from_=0, to=100, orient=tk.HORIZONTAL, variable=self.scale_value)
my_scale.pack(side=tk.RIGHT)
# scrollbar的用法
my_frame2 = tk.Frame(self.windows)
my_frame2.pack()
my_scrollbar = tk.Scrollbar(my_frame2)
my_scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
my_listbox = tk.Listbox(my_frame2, yscrollcommand=my_scrollbar.set)
# 往listbox里添加数据
for i in range(0, 100):
my_listbox.insert("end", i)
my_listbox.pack()
my_scrollbar.configure(command=my_listbox.yview)
# 创建Text
my_text = tk.Text(my_frame2, width=20, height=3)
for i in range(100):
my_text.insert(tk.END, "我是第{}个\n".format(i))
my_text.pack()
def radio_clicked(self):
for item in self.list_data:
if self.radio_selected.get() == item[1]:
print("喜欢吃{}".format(item[0]))
def button_clicked(self):
print("按钮被点击了!")
print('scale值:{}'.format(self.scale_value.get()))
# 创建toplevel
top = tk.Toplevel()
top.title("新窗口")
message = tk.Message(top, text="小叶柏杉")
message.pack()
if __name__ == '__main__':
MainWindow()
编程实例4
import tkinter as tk
import tkinter.messagebox as msg
class MainWindow:
def __init__(self):
# 创建主窗口
self.windows = tk.Tk()
self.windows.minsize(300, 300) # 窗口最小值
self.windows.title("示例")
# 定义radiobutton相关的变量
self.list_data = (
("苹果", 0), ("梨子", 1), ("葡萄", 2), ("西瓜", 3)
)
self.radio_selected = tk.IntVar() # 用户选择哪个项
# 添加组件
self.add_components()
# 进入消息循环
self.windows.mainloop()
def add_components(self):
my_frame = tk.Frame(self.windows)
my_frame.pack(side=tk.TOP)
# 创建spinbox组建
self.my_spinbox = tk.Spinbox(my_frame, from_=0, to=150)
self.my_spinbox.pack()
self.my_spinbox2 = tk.Spinbox(my_frame, values=('苹果', '梨子', '葡萄', '西瓜'))
self.my_spinbox2.pack()
# 创建panewindow
my_panedwindow = tk.PanedWindow(orient=tk.VERTICAL) # 垂直方向布局
my_panedwindow.pack(fill=tk.BOTH)
my_label = tk.Label(my_panedwindow, text="One Paned Windows")
my_panedwindow.add(my_label)
my_text = tk.Text(my_panedwindow, width=20, height=10)
for i in range(0, 100):
my_text.insert("end", "第{}个\n".format(i))
my_text.pack()
my_panedwindow.add(my_text)
# 创建LabelFrame
my_frame2 = tk.LabelFrame(self.windows, text="请选择您想吃的水果")
my_frame2.pack(side=tk.BOTTOM)
# 创建radiobutton
for label, value in self.list_data:
tk.Radiobutton(my_frame2, text=label, value=value, variable=self.radio_selected,
command=self.radio_clicked).pack(side=tk.LEFT)
# 创建MessageBox
msg.showinfo("提示", "人生苦短我用Python")
msg.showwarning("警告", "小心代码有问题哦")
msg.showerror("错误", "你写了一个BUG")
if msg.askyesno("询问","是否继续执行"):
print("继续执行")
else:
print("终止")
def radio_clicked(self):
for item in self.list_data:
if self.radio_selected.get() == item[1]:
print("喜欢吃{}".format(item[0]))
if __name__ == '__main__':
MainWindow()