Python图形界面编程(一)
目录
一、相关的库
1、tkinter库
2、PyQt库
二、图形界面编程要点
三、tkinter控件
1、tkinter控件表
2、tkinter的常用控件
3、tkinter的扩展控件
四、tkinter布局
1、简单示例
2、默认情况下的grid规则
3、调整窗口和网格
(1)调整窗口
(2)调整网格
4、grid()函数的sticky参数
五、Frame控件布局
当我们执行Python代码的时候,有时需要进行复杂的操作,比如进行一些输入操作,或者需要看下面的一些输出,这使得我们使用这些代码十分的困难,但是我们可以使用图形界面的程序和一些操作程序结合起来,使抽象的操作图形化,就像Windows一样,简单明了!
一、相关的库
1、tkinter库
这是Python自带的一个库,用法相对简单,但是界面比较简陋
2、PyQt库
是一个第三方库,做出的界面十分精美,但是代码相对复杂
二、图形界面编程要点
①控件
就是指按钮,列表框,单选框,多选框,编辑框
②布局
就是指如何把上面的那些控件摆放在合适的位置
③事件响应
对于鼠标的点击,键盘的敲击,控件被点击等操作进行响应
④对话框
弹出一个可以和用户交互的窗口,以及可以接受一些输入
三、tkinter控件
1、tkinter控件表
下面我们会用一个表格展示一些常用的控件
控件 | 描述 |
Button | 按钮 |
Canvas | 画布,显示图像或线条文本 |
Checkbutton | 多选框(方形) |
Entry | 单行编辑框(输入框) |
Frame | 框架,上面可放多个控件 |
Label | 标签,可显示文本和图像 |
Listbox | 列表框 |
Menubutton | 带菜单的按钮 |
Menu | 菜单 |
Message | 消息,显示多行文本 |
OptionMenu | 带下拉菜单的按钮 |
Radiobutton | 单选框(圆形) |
Scale | 滑块标尺,可以做一定范围内的数值选择 |
Scrollbar | 卷滚条,使内容在显示区域上下滚动 |
Text | 多行编辑框(输入框) |
Toplevel | 顶层窗口,用于弹出自定义的对话框 |
Spinbox | 微调输入框,可输入数值,也可以通过上下箭头调整数值 |
PanedWindow | 滑动分割窗口,把一个窗口分割成好几块,交界处可以拖动,改变大小 |
LabelFrame | 带文字标签的框架,上面可以摆放多个控件 |
2、tkinter的常用控件
import tkinter as tkwin = tk.Tk() #生成一个窗口
tk.Label(win) #在窗口win上生成一个Label
ckb = tk.Checkbutton(win) #在窗口上生成一个Checkbutton
frm = tk.Frame(win) #在窗口上生成一个Frame
bt = tk.Button(frm) #在frm上生成一个Button
3、tkinter的扩展控件
我们可以在tkinter中的ttk中找到扩展控件:
from tkinter import ttk
tk中有的控件ttk均有,而且更美观,用法也和tk相似,并且ttk包含一些扩展控件:
控件 | 描述 |
Treeview | 树形列表 |
Progressbar | 进度条 |
Notebook | 多页标签 |
LabeledScale | 带文字的滑块标尺 |
PanedWindow | 分栏窗口 |
四、tkinter布局
1、简单示例
在tkinter中我们主要涉及到的布局是grid布局,它可以在窗口上布置网格,控件放在网格单元里面
下面我们制作一个简单的登录窗口,可以进行登录确认:
import tkinter as tkwin = tk.Tk() #生成一个窗口
win.title("欢迎登录!") #指定窗口标题
user_label = tk.Label(win , text = "用户名:") #创建win上创建输入框的标签
password_label = tk.Label(win , text = "密码:")
et_username = tk.Entry(win)
et_password = tk.Entry(win) #在win上创建两个输入框user_label.grid(row = 0 , column = 0 , padx = 5 , pady = 5)
password_label.grid(row = 1 , column = 0 , padx = 5 , pady = 5)
et_username.grid(row = 0 , column = 1 , padx = 5 , pady = 5)
et_password.grid(row = 1 , column = 1 , padx = 5 , pady = 5)
#给每一个控件标记放置的位置(0,0)就是第0行,第0列,以及上下左右都留白5个像素login = tk.Button(win , text = "登录") #创建登录按钮
login.grid(row = 2 , column = 0 , columnspan = 2 , padx = 5 , pady = 5) #同上win.mainloop() #显示窗口
效果:
2、默认情况下的grid规则
注意是默认情况下的:
①一个单元格只能放一个控件,控件在单元格居中摆放
②不同控件的高度和宽度不一样,因此网格的不同的行和列可以不一样宽和高,但同一行和列的单元格都是一样的
③某一行或某一列的宽度和高度,取决于那一行或那一列中宽度或高度最宽或最高的那一个
④若不指定窗口的大小和显示,则窗口的大小和网格的大小一样,即恰好能包含所有的控件,显示位置则是由Python自己决定
3、调整窗口和网格
(1)调整窗口
我们可以通过下面这一行代码实现窗口打开时的大小:
win.geometry("800x500+200+100") #设定窗口的大小是800x500像素的,然后窗口的左上角的坐标是200,100(就是设置窗口的相对位置
(2)调整网格
我们在把窗口放大的时候会发现里面的各个控件是不动的,这就会使得窗口有一大部分是空白的,很不美观:
我们可以添加一些东西:
import tkinter as tkwin = tk.Tk() #生成一个窗口
win.title("欢迎登录!") #指定窗口标题
user_label = tk.Label(win , text = "用户名:") #创建win上创建输入框的标签
password_label = tk.Label(win , text = "密码:")
et_username = tk.Entry(win)
et_password = tk.Entry(win) #在win上创建两个输入框user_label.grid(row = 0 , column = 0 , padx = 5 , pady = 5)
password_label.grid(row = 1 , column = 0 , padx = 5 , pady = 5)
et_username.grid(row = 0 , column = 1 , padx = 5 , pady = 5)
et_password.grid(row = 1 , column = 1 , padx = 5 , pady = 5)
#给每一个控件标记放置的位置(0,0)就是第0行,第0列,以及上下左右都留白5个像素login = tk.Button(win , text = "登录") #创建登录按钮
login.grid(row = 2 , column = 0 , columnspan = 2 , padx = 5 , pady = 5) #同上#---------------------------------------------
win.columnconfigure(0 , weight = 1)
win.columnconfigure(1 , weight = 1)
#针对列,0和1列,增量分配权重改为1
win.rowconfigure(0 , weight = 1)
win.rowconfigure(1 , weight = 1)
win.rowconfigure(2 , weight = 1)
#针对行,0和1和2行,增量分配权重改为1#---------------------------------------------win.mainloop() #显示窗口
这样我们在放大窗口的时候就相对均匀美观了:
4、grid()函数的sticky参数
sticky参数用于指明控件在单元格中的“贴边方式”,即是否要贴着单元格的四条边,该参数可以是一个字符串,包含E,W,S,N,四个字符中的一个或多个,这四个字母就代表着东南西北,想让一个控件贴着哪个方向的边,就写哪个字符:
我们先看看没有sticky参数的时候:
假如我们现在想要它在右上角,我们可以增加一个参数:
或者我们也可以让他占满整个窗口:
(注:这几个大写字母没有顺序之分)
五、Frame控件布局
当我们在一个窗口上有很多控件,就需要计算每一个控件的行列等数据,十分的复杂麻烦,这时可以使用Frame控件
Frame控件上可以摆放其他控件,可当作底板使用,就相当于把win窗口上的各个控件划分成了若干个区域,便于管理
且Frame控件上也可以使用grid进行布局
下面我们来看一个简单的例子:
import tkinter as tkwin = tk.Tk() #生成一个窗口
win.title("学生系统") #指定窗口标题frame_zero = tk.Frame(win , bg = "blue" , highlightthickness = 2)
frame_zero.grid(row = 0 , column = 0 , padx = 6 , pady = 6 , sticky = "WENS")tk.Label(frame_zero , text = "nsjcndk").grid(row = 0 , column = 0 , padx = 6 , pady = 6)
#--------------------------------------------------------------------------------------
frame_one = tk.Frame(win , bg = "red" , highlightthickness = 2)
frame_one.grid(row = 0 , column = 1 , sticky = "WENS")tk.Label(frame_one , text = "姓名:").grid(row = 0 , column = 0 , padx = 6 , pady = 6)
tk.Entry(frame_one).grid(row = 0 , column = 1 , padx = 6 , pady = 6)
tk.Label(frame_one , text = "学号:").grid(row = 1 , column = 0 , padx = 6 , pady = 6)
tk.Entry(frame_one).grid(row = 1 , column = 1 , padx = 6 , pady = 6)
#--------------------------------------------------------------------------------------
frame_three = tk.Frame(win , bg = "green" , highlightthickness = 2)
frame_three.grid(row = 1 , column = 0 , padx = 6 , pady = 6 , sticky = "WENS")tk.Label(frame_three , text = "学生:").grid(row = 0 , column = 0 , padx = 6 , pady = 6 , sticky = "N")
name_list = tk.Listbox(frame_three)
name_list.grid(row = 1 , column = 0 , padx = 6 , pady = 6)
students = ["张三" , "李四" , "王五" , "赵六"]
for i in students :name_list.insert(tk.END , i)
#--------------------------------------------------------------------------------------
frame_four = tk.Frame(win , bg = "yellow" , highlightthickness = 2)
frame_four.grid(row = 1 , column = 1 , padx = 6 , pady = 6 , sticky = "WENS")tk.Text(frame_four).grid(row = 0 , column = 0 , columnspan = 2 , padx = 6 , pady = 6 ,sticky = "WENS")tk.Button(frame_four , text = "确定").grid(row = 1 , column = 0 , padx = 6 , pady = 6)
tk.Button(frame_four , text = "取消").grid(row = 1 , column = 1 , padx = 6 , pady = 6)win.mainloop() #显示窗口
效果:
以上就是Python图形界面编程(一)的全部内容:)