当前位置: 首页 > 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图形界面编程(一)的全部内容:)

相关文章:

  • 常用第三方库精讲:cached_network_image图片加载优化
  • 每天五分钟深度学习PyTorch:图像的处理的上采样和下采样
  • 第四节:核心概念高频题-Vue生命周期钩子变化
  • 解锁webpack:对html、css、js及图片资源的抽离打包处理
  • 麒麟信安与中教汇控达成战略合作,共绘教育信息化新蓝图
  • 修电脑之电脑没有声音
  • HarmonyOS-ArkUI: 组件内转场(transition)
  • rpm包管理
  • C语言 ——— 分支循环语句
  • 第51讲:AI在农业政策支持系统中的应用——用人工智能点亮科学决策的新范式
  • 绿色森林人文生活纪实摄影Lr调色教程,手机滤镜PS+Lightroom预设下载!
  • 电路中的DGND、GROUND、GROUND_REF的区别,VREF、VCC、VDD、VEE和VSS的区别?
  • Android 回显
  • Ubuntu 20.04 安装Docker 全过程
  • (2025最新版)CUDA安装及环境配置
  • java记忆手册(2)
  • 深入理解XGBoost(何龙 著)学习笔记(一)
  • 基于RabbitMQ实现订单超时自动处理
  • LeetCode热题100--283.移动零--简单
  • 【开源】STM32HAL库驱动ST7789_240×240(硬件SPI+软件SPI)
  • 消费者买国外电话卡使用时无信号,店铺:运营商故障,较少见
  • 厦门国贸去年营收约3544亿元,净利润同比减少67.3%
  • 特斯拉季度利润暴跌71%,马斯克下月开始大幅减少为政府工作时间
  • 港澳航天员最早2026年飞天
  • 泰国总理佩通坦:推迟与美国的关税谈判
  • 江苏一季度实现地区生产总值3.3万亿元,同比增长5.9%