欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 高考 > Python图形界面编程(一)

Python图形界面编程(一)

2025/9/15 20:23:13 来源:https://blog.csdn.net/2401_84944910/article/details/147429111  浏览:    关键词: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图形界面编程(一)的全部内容:)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词