Python -- GUI图形界面编程—GUI编程实例 博主也在持续学习中[ 持续更新中!!! 欢迎白嫖 ]

news2024/9/21 3:12:54

 本文继上篇文章http://t.csdnimg.cn/mJlmW继续介绍GUI的图形界面编程(相关视频是哔站上的应该搜这个题目就能找到),文章还是很基础的,目前博主处于有一点基础的状态。

        文章的主要介绍了依旧非常重要的结构tinkter库、常见的三种布局管理器:Grid布局管理器、pack布局管理器、Place布局管理器;还有相关的小练习。依旧是很多代码部分是重复的,因为框架是固定的,跟着敲两遍就记住了,还是要动手。

感谢大佬持续支持!!既然路过就是缘分,点个赞吧!!

目录

12. Grid布局管理器详解

13. 计算器软件页面设计

14. pack布局管理器实现钢琴软件界面设计

15. Place布局管理器_绝对位置和相对位置

16. 扑克游戏界面设计_增加事件操作(练习place)

代码表示:

目录:


布局管理器简介:

tkinter提供了三种管理器:pack(组件的垂直或水平)、grid(表格布局【行和列 单元格】)、place(位置管理器,通过控制像素)

在Python中,特别是在使用图形用户界面(GUI)库如Tkinter、PyQt、PySide或Kivy时,布局管理器(Layout Managers)扮演着至关重要的角色。它们负责控制GUI组件(如按钮、文本框、标签等)的大小和位置,以确保用户界面在不同平台和屏幕尺寸上都能以一致且美观的方式呈现。

下面我将以Tkinter为例,详细解释几种常见的布局管理器,因为Tkinter是Python标准库的一部分,易于学习和使用。

### 1. Pack布局管理器

Pack布局管理器是最简单的布局管理器之一,它按照添加组件的顺序自动调整组件的位置和大小。默认情况下,它会将组件添加到容器的顶部,但你可以通过配置来改变方向(如`side=LEFT`、`side=RIGHT`等)。

```python
import tkinter as tk

root = tk.Tk()

button1 = tk.Button(root, text="Button 1")
button1.pack(side=tk.LEFT, padx=20, pady=20)

button2 = tk.Button(root, text="Button 2")
button2.pack(side=tk.RIGHT, padx=20, pady=20)

root.mainloop()
```

### 2. Grid布局管理器

Grid布局管理器将容器划分为一个二维的网格,你可以指定组件应该占据哪个网格位置(行和列)。Grid布局管理器非常适合需要表格或矩阵布局的场景。

```python
import tkinter as tk

root = tk.Tk()

label = tk.Label(root, text="Label")
label.grid(row=0, column=0, sticky=tk.W)

entry = tk.Entry(root)
entry.grid(row=0, column=1)

button = tk.Button(root, text="Submit")
button.grid(row=1, column=0, columnspan=2, sticky=tk.EW)

root.mainloop()
```

### 3. Place布局管理器

Place布局管理器提供了最大的灵活性,允许你通过指定组件的绝对位置(x和y坐标)和大小(宽度和高度)来放置组件。然而,这种灵活性也意味着你需要手动处理不同屏幕尺寸和分辨率的适配问题。

```python
import tkinter as tk

root = tk.Tk()

button1 = tk.Button(root, text="Button 1")
button1.place(x=50, y=50, width=100, height=50)

button2 = tk.Button(root, text="Button 2")
button2.place(x=160, y=50, width=100, height=50)

root.mainloop()
```

### 总结

- **Pack**:适合简单的垂直或水平布局。
- **Grid**:适合需要表格或矩阵布局的场景。
- **Place**:提供最大的灵活性,但需要手动处理不同屏幕尺寸的适配。

12. Grid布局管理器详解

代码表示:

import tkinter as tk
from tkinter import messagebox
​
class Application(tk.Frame):
    def __init__(self,master = None):
        super().__init__(master)
        self.master = master
        self.pack()
        self.createWidgets()
​
    def createWidgets(self):
        """通过grid布局实现登录页面"""
        self.label01 = tk.Label(self,text='用户名')
        self.label01.grid(row=0,column=0)
        self.entry01 = tk.Entry(self)
        self.entry01.grid(row=0,column=1)
        tk.Label(self,text='用户名为手机号').grid(row=0,column=2)
​
        tk.Label(self,text='密码').grid(row=1,column=0)
        tk.Entry(self,show='*').grid(row=1,column=1)
​
        tk.Button(self,text='登录').grid(row=2,column=1,sticky=tk.EW)
        tk.Button(self,text='取消').grid(row=2,column=2,sticky=tk.E)
​
​
if __name__ == '__main__':
    root = tk.Tk()      #创建根窗口对象
    root.geometry('400x200+200+200')
    app = Application(master=root)
    root.mainloop()         #事件循环

13. 计算器软件页面设计

# P13
from tkinter import *
from tkinter import messagebox
​
class Application(Frame):
    def __init__(self,master=None):
        super().__init__(master)
        self.master = master
        self.pack()
        self.createWidgets()
​
    def createWidgets(self):
        btnText = [['MC','M+','M-','MR'],
                   ['C','±','/','×'],
                   [7,8,9,'-'],
                   [4,5,6,'+'],
                   [1,2,3,'='],
                   [0,'.']]
​
        Entry(self).grid(row=0,column=0,columnspan=4,pady=10)       #跨列 外边框为10
​
        for rindex,r in enumerate(btnText):
            for cindex,c in enumerate(r):
                if c == '=':
                    Button(self,text=c,width=2)\
                    .grid(row=rindex+1,column=cindex,rowspan=2,sticky=NSEW)
                elif c == 0:
                    Button(self, text=c, width=2) \
                        .grid(row=rindex + 1, column=cindex, columnspan=2, sticky=NSEW)
                elif c == '.':
                    Button(self, text=c, width=2) \
                        .grid(row=rindex + 1, column=cindex+1, sticky=NSEW)
                else:
                    Button(self, text=c, width=2) \
                        .grid(row=rindex+1, column=cindex, sticky=NSEW)     #因为有一行是Entry,所以是rindex+1
​
​
if __name__ == '__main__':
    # 创建根窗口对象
    root = Tk()
    root.geometry('450x250-200+200')
    app = Application(master=root)
    root.mainloop()     #事件循环

14. pack布局管理器实现钢琴软件界面设计

对于一下了解看看就行,pack()只适用于简单的排布垂直水平情况

代码表示:

# P14
from tkinter import *
​
root=Tk()
root.geometry('700x220')
​
# Frame是一个矩形区域,就是用来方式其他子组件的容器
f1 = Frame(root);f1.pack()
f2 = Frame(root);f2.pack()
​
btnText= ('流行风','复古风','摇滚风','R&B','欧美风','中国风')
​
for txt in btnText:
    Button(f1,text=txt,).pack(side='left',padx='10')
​
for i in range(1,10):
    Label(f2,width=5,height=10,borderwidth=1,relief='solid',
           bg='black' if i%2==0 else'white').pack(side='left',padx=2)
root.mainloop()

15. Place布局管理器_绝对位置和相对位置

place布局管理器可以通过坐标精确控制组件的位置,适用于一些布局更加灵活的场景。

代码表示:

from tkinter import *
​
root = Tk()
root.geometry('600x300')
root.title('place布局管理')
root['bg'] = 'white'
​
f1 = Frame(root,width=200,height=200,bg='green')
f1.place(x=30,y=30)
​
Button(root,text='zmr').place(relx=0.2,x=100,y=20,relwidth=0.2,relheight=0.5)       #x方向上相对于父元素0.2+100
Button(f1,text='加油!').place(relx=0.6,rely=0.7)
Button(f1,text='相信自己,哦~~~~').place(relx=0.5,rely=0.2)
root.mainloop()

16. 扑克游戏界面设计_增加事件操作(练习place)

代码表示:
P16
from tkinter import *
from tkinter import messagebox
​
class Application(Frame):
    def __init__(self,master = None):
        super().__init__(master)
        self.master = master
        self.pack()
        self.createWidgets()
​
    def createWidgets(self):
        """通过place布局管理器实现扑克牌位置控制"""
        self.photos = [PhotoImage(file='img/img_'+str(i)+'.png') for i in range(7)]
        self.imges = [Label(self.master,image=self.photos[i]) for i in range(7)]
​
        for i in range(7):
            self.imges[i].place(x=10+i*60,y=50)
​
        # 为所有的Lable添加事件处理
        self.imges[0].bind_class('Label','<Button-1>',self.chupai)
​
    def chupai(self,event):
        print(event.widget.winfo_geometry())
        print(event.widget.winfo_y())
​
        if event.widget.winfo_y() == 50:
            event.widget.place(y=30)
        else:
            event.widget.place(y=50)
​
if __name__ == '__main__':
    root = Tk()      #创建根窗口对象
    root.geometry('750x600+200+200')
    app = Application(master=root)
    root.mainloop()         #事件循环
项目列表:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2079860.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Patch-Package:一款灵活的开源依赖修复工具

一、背景 在现代软件开发中&#xff0c;开发者通常依赖大量的开源库来加快开发进程。然而&#xff0c;随着时间的推移&#xff0c;可能会遇到一些问题&#xff1a; 开源包的缺陷&#xff1a;开源库可能存在 Bug 或者与项目不兼容的问题。开发者可以自己修复这些问题&#xff0…

QML控件: 动画输入框 LineEdit PySide6

1. 前言 本代码为扫地僧-smile原创, 废话不多说, 直接看效果图由于录制的这个GIF图掉帧严重, 实际动画效果非常细腻 2.看代码 控件模块代码如下 SmileLineEdit.qml import QtQuick import QtQuick.Controls/* __author__: 扫地僧-smile */Rectangle {// 属性property int …

这些年使用Delphi的成果

成果1&#xff1a; 收到了一件文化衫 成果2&#xff1a;被评为亚洲专家&#xff0c;收到了一套Delphi7 光碟找不到了。

Arista与英伟达IB网络竞争格局分析

悄然崛起的英伟达新对手 英伟达都有哪些对手&#xff1f; 当然首选AMD和英特尔。AMD具备AI加速卡业务&#xff0c;融合CPU和GPU设计能力&#xff1b;英特尔作为x86架构的开创者&#xff0c;如今也涉足AI加速卡领域。它们的产品在参数上与英伟达对标&#xff0c;同时在定位和售…

江西生物科技职业学院春雨宣讲团丨弘扬西柏坡精神,共绘时代新篇章

今年五月&#xff0c;江西生物科技职业学院春雨宣讲团获批共青团中央2024年全国大学生西柏坡精神志愿宣讲团之一。 秉承传承红色文化、弘扬西柏坡精神的崇高使命&#xff0c;该宣讲团成员自7月3日起至8月20日&#xff0c;踏上了深入江西省南昌市、九江市、景德镇市、吉安市等地…

走线特征阻抗

ns/ft中ft代表英尺 :1ft0.3048m30.48cm 对于FR-4板&#xff0c;1.017*根号&#xff08;4.5&#xff09;2.121ns/ft 也即每英寸的传输时间为2.121ns&#xff0c;30.48/2.12114.6cm/ns&#xff1b; 当差分线中以相同的驱动电压驱动时&#xff0c;我们称之为偶模&#xff0c;当以…

Eclipse 自定义字体大小

常用编程软件自定义字体大全首页 文章目录 前言具体操作1. 打开设置对话框2. 打开字体设置页面3. 找到Text Font&#xff0c;点击修改4. 修改字体 前言 Eclipse 自定义字体大小&#xff0c;统一设置为 Courier New &#xff0c;大小为 三号 具体操作 【Windows】>【Perfer…

IROS 2024不容错过的4大理由

01 IROS是国际机器人顶会 关于机器人学术顶会&#xff0c;听IROS 2025大会主席、上海交通大学王贺升教授怎么说。 ICRA 2024专辑&#xff1a;上交王贺升教授聊机器人学术顶会【度量访问】 02 未来一年难得的国际交流机会 ICRA 2025 将在美国亚特兰大举办&#xff1b; RSS 20…

zookeeper命令 及 ACL控制

1命令 登录 zkCli.sh -server 192.168.58.81:2128 登录ip zkCli.sh 登录本机 关闭会话 close 帮助文档 help 让zk数据发生变化都是一次事务 create创建 create /aaa 创建持久节点 create -e /aaa/bbb 创建临时节点 create /aaa/bbb/ccc 不能创建成功 …

docker 拉取镜像超时

docker 拉取镜像超时报错如下&#xff1a; error pulling image configuration: Get xxx:443: i/o timeout [rootlocalhost docker]# docker pull nginx Using default tag: latest latest: Pulling from library/nginx e4fff0779e6d: Pulling fs layer 2a0cb278fd9f: Pulli…

GB28181 SDP协议学习笔记

GB28181 SDP协议学习笔记 (GB/T28181-2016 附录F 100页) 定义 示例 v0 o34000000002000000001 0 0 IN IP4 192.168.100.100 sDownload u34020000001310000001:3 cIN IP4 192.168.100.100 t1498173736 1498174066 mvideo 10122 TCP/RTP/AVP 96 98 97 arecvonly artpmap:96 P…

MySQL索引详解:原理、数据结构与分析和优化

在数据库管理系统中&#xff0c;索引是提高查询性能、优化数据存储结构的重要工具。MySQL作为广泛使用的开源关系型数据库管理系统&#xff0c;其索引机制对于提升数据库操作效率具有至关重要的作用。本文将围绕“MySQL索引详解&#xff1a;原理、数据结构与分析和优化”这一主…

仓颉语言:静态类型与垃圾收集,让编程更安全高效

在编程的世界里&#xff0c;安全与效率是永恒的追求。仓颉语言以其静态类型系统和先进的垃圾收集机制&#xff0c;为开发者提供了一个既安全又高效的编程环境。 静态类型系统&#xff1a;编译期的严格把关 类型安全&#xff1a;所有变量和表达式的类型在编译期确定&#xff0c;…

IS-IS路由原理详解

目录 一. 协议介绍: 优点: 二. 1) 协议基本概念: 2) 协议网络类型与网络链路关系 3) IS-IS的报文类型 4) P2P链路邻居关系的建立 ​编辑三. 综上所述 一. 协议介绍: IS-IS最初是国际标准化组织ISO&#xff08;the International Organization for Standardization&am…

2024年适合初创企业的10款项目管理软件

身为初创企业的掌舵人或联合创始人&#xff0c;您深深了解兼顾多项事务的艰辛。适合初创企业的项目管理软件能够对团队运营效率产生明显影响。 您需要精准把握产品研发、营销推广以及团队协作&#xff0c;同时要严格控制预算和时间。项目管理的失策极易导致延期、超支&#xff…

Spring不是引入了三级缓存,解决了循环依赖的问题吗?

上面是典型的循环依赖问题&#xff0c;在很多人认识中spring引入了三级缓存&#xff0c;不会发生循环依赖报错&#xff0c;但是结果是会启动报错&#xff1a; 其实&#xff0c;在 Spring 2.6 开始&#xff0c;默认已经不开启对循环依赖的支持了&#xff0c;如果想要开启对循环依…

【学术会议征稿】第三届地理信息与遥感技术国际学术会议(GIRST 2024)

第三届地理信息与遥感技术国际学术会议&#xff08;GIRST 2024&#xff09; 2024 3rd International Conference on Geographic Information and Remote Sensing Technology 第三届地理信息与遥感技术国际学术会议&#xff08;GIRST 2024&#xff09;将在2024年11月29日-12…

IO进程线程 0827作业

作业 作业一&#xff1a;创建3个线程&#xff0c;一个子线程拷贝文件的前一半&#xff0c;一个子线程拷贝后一半文件&#xff0c;主线程回收子线程资源。 将1.txt内容拷贝到2.txt中 #include <myhead.h> /* 创建3个线程&#xff0c;一个子线程拷贝文件的前一半&#xf…

[数据集][目标检测]直肠息肉病变检测数据集VOC+YOLO格式10725张6类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;10725 标注数量(xml文件个数)&#xff1a;10725 标注数量(txt文件个数)&#xff1a;10725 标…

IDEA 编译项目时卡在Parsing java,最终报out of memory

今天在项目运行的时候莫名其妙报错&#xff1a; 报错内容&#xff1a; java.lang.OutOfMemoryError: GC overhead limit exceeded原因&#xff1a; 通常是因为堆内存太小&#xff0c;无法有效管理正在创建和销毁的对象。 解决方法&#xff1a; 在 IDEA 的安装目录下找到 bi…