当前位置: 首页 > news >正文

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图形界面编程(一)的全部内容:)

http://www.xdnf.cn/news/107641.html

相关文章:

  • HTML表格居中显示、在表格中插入音频文件、表格分行列显示
  • SpringBoot入门实战(第七篇:项目接口-商品管理)
  • 考研单词笔记 2025.04.23
  • es的range失效
  • 如何在Spring Boot中实现热加载以避免重启服务器
  • 数据治理体系的“三驾马车”:质量、安全与价值挖掘
  • 武汉昊衡科技OLI光纤微裂纹检测仪:高密度光器件的精准守护者
  • JavaWeb学习打卡-Day2-Mysql索引、事务
  • 浅试MCP:spring ai使用mcp调用deepseek的API接口
  • IDEA中Quarkus框架(3.13版本)容器编排、压测与调优、注意事项等
  • element-ui transfer 组件源码分享
  • 永磁同步电机控制算法--零d轴电流IF控制
  • 幂等性设计保障系统可靠性和数据一致性
  • 顺序表专题
  • 结合地理数据处理
  • 数据流量采集系统的实现
  • 为什么Spring中@Bean注解默认创建单例Bean
  • TORL:解锁大模型推理新境界,强化学习与工具融合的创新变革
  • 将 MySQL 8 主从复制延迟优化到极致
  • cgdb的基础使用教程
  • 制造业数字化转型标杆解析:从冀凯机电到君乐宝的启示
  • Java类加载器(ClassLoader)及其相关类 简介
  • 【C++】AVL树
  • 《从卷积核到数字解码:CNN 手写数字识别实战解析》
  • 蚊子的搜索距离可达60公里:对一些特殊气味有所偏爱
  • 短说社区V5.2.1正式版发布|修复已知问题
  • 品牌名凭空消失?3步破解亚马逊前台标题隐藏危机
  • 在Linux驱动开发中使用DeepSeek的方法
  • 智能指针(shared_ptr)之二
  • 18487.1-2015-解读笔记五-交流充电之停止充电