Python GUI 新手入门教程:轻松构建图形用户界面

news2024/11/18 17:29:15

Python 凭借其简单性和多功能性,已经成为最流行的编程语言之一。被广泛应用于从 web 开发到数据科学的各个领域。

在本教程中,我们将探索用于创建图形用户界面(GUIs)的 Python 内置库:

Tkinter:无论你是初学者还是经验丰富的开发人员,了解如何创建 Python GUI 都可以增强你构建交互式应用程序的能力。

Tkinter 是 Python 附带的标准 GUI 工具包。它提供了一组用于创建图形用户界面的工具和小部件。

一、从创建一个简单的 Hello World 开始

让我们从一个基本的例子开始了解 Tkinter。打开你最喜欢的 Python 编辑器(我的是 Pycharm)并创建一个新文件,例如就叫 hello_tkinter.py。编写以下代码:

import tkinter as tk


def say_hello():
    label.config(text="Hello, Tkinter!")


# Create the main window
root = tk.Tk()
root.title("Tkinter Hello World")

# Create a label widget
label = tk.Label(root, text="Welcome to Tkinter!")

# Pack the label into the main window
label.pack(pady=10)

# Create a button widget
button = tk.Button(root, text="Say Hello", command=say_hello)

# Pack the button into the main window
button.pack(pady=10)

# Start the Tkinter event loop
root.mainloop()

输出

保存文件并运行它,你应该会看到一个带有标签和按钮的窗口,点击该按钮将把标签文本更改为"Hello, Tkinter!":

在这里插入图片描述

在这里插入图片描述

二、Tkinter 基础

现在我们已经创建了一个简单的 Tkinter 应用程序,让我们深入研究一些基本概念和小部件。

2.1 小部件(Widgets)

小部件是 Tkinter GUI 的构建模块。它们可以是按钮、标签、输入字段等等。比如在前面的例子中我们已经使用了 LabelButton 小部件。

输入小部件(Entry Widget)

Entry Widget 允许用户输入一行文本。现在让我们扩展我们的 Hello, Tkinter! 的示例,通过添加一个 Entry Widget 来获取用户名:

import tkinter as tk


def say_hello():
    name = entry.get()
    label.config(text=f"Hello, {name}!")


# Create the main window
root = tk.Tk()
root.title("Tkinter Hello World")

# Create a label widget
label = tk.Label(root, text="Welcome to Tkinter!")

# Pack the label into the main window
label.pack(pady=10)

# Create a button widget
button = tk.Button(root, text="Say Hello", command=say_hello)

# Pack the button into the main window
button.pack(pady=10)

# Create an entry widget
entry = tk.Entry(root)

# Pack the entry widget into the main window
entry.pack(pady=10)

# Start the Tkinter event loop
root.mainloop()

通过这个修改,用户可以在 Entry Widget 中输入他们的名字,点击 Say Hello 按钮将会向他们打招呼。

演示

在这里插入图片描述

在这里插入图片描述

2.2 布局管理(Layout Management)

Tkinter 提供多种几何管理器来组织窗口内的小部件。我们前面使用的 pack() 方法就是其中之一。此外,你还可以使用 grid()place() 进行更复杂的布局。

网格布局(Grid Layout)

你可以使用 grid() 方法创建类似网格的布局。让我们在我们的示例中加入网格布局:

# ...

# Pack the label and entry widgets into the main window using the grid layout
label.grid(row=0, column=0, pady=10)
entry.grid(row=1, column=0, pady=10)

# ...

注意:不能将 grid()pack() 混合使用,否则运行程序会报如下错误:_tkinter.TclError: cannot use geometry manager grid inside . which already has slaves managed by pack

2.3 事件及事件处理(Events and Event Handling)

在前面的示例中,我们使用 command 参数指定单击按钮时要调用的函数。Tkinter 允许你将函数绑定到各种事件,例如单击按钮、按键或鼠标移动。

让我们在 Entry Widget 中添加一个事件处理程序,以便在用户按下 Enter 键时向用户表示欢迎:

# ...

def on_enter(event):
    say_hello()

# Bind the on_enter function to the Enter key press event
entry.bind("<Return>", on_enter)

# ...

现在,在 Entry Widget 中按 Enter 将触发 say_hello 函数。

三、中级 Tkinter 概念

前面我们已经了解 Tkinter 的基础知识,现在让我们探索其中更高级的概念吧!

3.1 菜单(Menu)

Tkinter 可以让你为应用程序创建菜单。菜单通常包含 FileEditHelp 等菜单项,并且每个菜单项都可以有子菜单和命令。

# ...

def exit_app():
    root.destroy()

# Create a menu bar
menu_bar = tk.Menu(root)
root.config(menu=menu_bar)

# Create a File menu
file_menu = tk.Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="File", menu=file_menu)

# Add an "Exit" command to the File menu
file_menu.add_command(label="Exit", command=exit_app)

# ...

现在,运行程序后将会有一个带有 Edit 选项的 File 菜单。点击 Edit 将会关闭应用程序。

3.2 框架(Frames)

框架是用于分组和组织小部件的容器,它们有助于实现更干净、更有组织的布局。

# ...

# Create a frame
frame = tk.Frame(root)
frame.pack(pady=10)

# Create widgets inside the frame
label_in_frame = tk.Label(frame, text="Inside the Frame")
button_in_frame = tk.Button(frame, text="Click me!")

# Pack widgets inside the frame
label_in_frame.pack()
button_in_frame.pack()

# ...

在这里,我们创建了一个框架并对其中的小部件进行打包。框架在需要将界面划分为多个部分时特别有用。

3.3 对话框(Dialog Box)

对话框是提示用户输入或提供信息的弹出窗口。Tkinter 提供了一种使用 tkinter.messagebox 模块创建对话框的简单方法。

# ...

from tkinter import messagebox

def show_info():
    messagebox.showinfo("Information", "This is an information message.")

# ...

# Create a button to show the information dialog
info_button = tk.Button(root, text="Show Info", command=show_info)
info_button.pack(pady=10)

# ...

点击 Show Info 按钮将显示一个信息对话框:

在这里插入图片描述

四、高级 Tkinter 特征(Advanced Tkinter Features)

4.1 图片使用(Using Images)

Tkinter 支持各种格式的图像显示,你可以使用 PhotoImage 类来加载和显示图像。

# ...

# Load an image
image = tk.PhotoImage(file="path/to/image.png")

# Create a label to display the image
image_label = tk.Label(root, image=image)
image_label.pack(pady=10)

# ...

用你的图片地址替换“path/to/image.png”即可。但实际测试时发现有的 png 图片可以正常展示,但是有的却不能,会报如下错误:

_tkinter.TclError: couldn't recognize data in image file "images/beutiful_girl.jpg"

网上说 Tkinter 只支持 gif 格式的图片,要加载 png 或 jpg 格式的图片应该用 PIL 包的 Image,同时用 ImageTK.PhotoImage 替换 tk.PhotoImage

from PIL import Image, ImageTk
image = ImageTk.PhotoImage(Image.open("images/beutiful_girl.jpg"))

测试后发现确实可以解决上述报错问题,如果你也遇到同样的错误,可以尝试使用这个解决方法。

4.2 自定义样式(Customizing Styles)

Tkinter 允许你使用样式自定义小部件的外观,你可以为按钮、标签和其他小部件定义样式。

# ...

# Create a button with the custom style
styled_button = tk.Button(root, text="Styled Button", 
                          foreground="green", font=("Arial", 12))
styled_button.pack(pady=10)

# ...

在本例中,我们为按钮创建了自定义样式(绿色文本和指定的字体)。

五、总结(Conclusion)

这个全面的教程涵盖了 Python 内置 GUI 库 Tkinter 的基础和高级功能。从创建一个简单的“Hello, Tkinter!”应用程序来探索菜单、框架和对话框等高级概念,现在你对构建交互式和用户友好的应用程序已经有一个扎实的基础。

记住,实践是掌握 GUI 开发的关键。尝试不同的小部件、布局和样式,为您的 Python 应用程序创建完美的界面。Tkinter 的文档是进一步探索和微调的优秀资源。

完整代码我已整理好,如果需要参考,请关注我,公众号聊天窗口回复关键字”tkinter“即可获取。

如果你觉得这篇文章对你有用,请点赞支持,同时让更多人加入我们一起学习!

技术交流

技术要学会分享、交流,不建议闭门造车。一个人可以走的很快、一堆人可以走的更远。

技术交流、资料干货、数据&源码,均可加交流群获取,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友。

方式①、微信搜索公众号:Python学习与数据挖掘,后台回复: tkinter
方式②、添加微信号:dkl88194,备注:来自CSDN +交流

毕设/大作业系列

  • 毕设/大作业:基于Python+Flask+MySQL的豆瓣电影可视化系统
  • 毕设/大作业:搭建基于 Python+Flask+MySQL 的学生培养计划管理系统(附源码)
  • 毕设/大作业:一款基于 Python+flask 的态势感知系统(附完整源码)
  • 毕设/大作业:基于 Python 的 Flask 框架开发的在线电影网站系统(附完整源码)
  • 毕设/大作业:基于 Echarts + Python Flask 动态实时大屏轻松可以实现
  • 毕设/大作业:基于 Python+Django 构建智能互动拍照系统
  • 毕设/大作业:基于 Python+Flask+SQLite 的网易云音乐评论情感分析系统
  • 毕设/大作业:基于 Python 和Surprise库,新手轻松搭建推荐系统
  • 毕设/大作业:基于 Python+Django+MySQL 数据库的租房数据可视化系统

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

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

相关文章

深入学习卷积神经网络(CNN)的原理知识

在深度学习领域中&#xff0c;已经经过验证的成熟算法&#xff0c;目前主要有深度卷积网络&#xff08;DNN&#xff09;和递归网络&#xff08;RNN&#xff09;&#xff0c;在图像识别&#xff0c;视频识别&#xff0c;语音识别领域取得了巨大的成功&#xff0c;正是由于这些成…

gitlab 命令执行漏洞(CVE-2022-2992)

1.漏洞影响版本 GitLab CE/EE 中的一个漏洞影响从 11.10 开始到 15.1.6 之前的所有版本、从 15.2 开始到 15.2.4 之前的所有版本、从 15.3 开始到 15.3.2 之前的所有版本。允许经过身份验证的用户通过从 GitHub API 端点导入实现远程代码执行。 查看 gitlab 版本。(登录后才能…

keil logic analyzer使用

DARMSTM.DLL--- -pSTM32F103VC ---- TRAMSTM.DLL ------ -pSTM32F103VC 然后点击DEBUG按钮 用上面的名称USART1_SR 点击STUP 不同的引脚&#xff0c;用不同的名称&#xff0c;通过放大缩小来查看波形。当前串口用的是USART1_SR&#xff0c;只能用这个名称&#xff0c;…

海思刷机注意事项

目录 为什么写这个文档海思SOC刷机原理1.串口缓冲区关闭2.IP地址自动更改导致无法烧录3.烧录完成后找不到根文件系统4.由于电源设计不合理导致无法烧录 为什么写这个文档 海思SOC刷机时,偶然会遇到奇奇怪怪的问题,会刷机不上.现在总结一下. 海思SOC刷机原理 如果没有任何程序…

VUE--组件通信(非父子)

一、非父子通信 --- event bus 事件总线 作用&#xff1a;非父子组件之间进行简易的消息传递 步骤&#xff1a; 1、创建一个都能访问到的事件总线&#xff08;空vue实例&#xff09;--- utils/EventBus.js import Vue from vue export default new Vue({}) 2、 接收方&…

day5:IO多路复用

思维导图 TCP并发服务器的IO复用poll函数实现 #include <head.h> #define SER_PORT 8888 #define SER_IP "192.168.232.133" int main(int argc, const char *argv[]) {int sfdsocket(AF_INET,SOCK_STREAM,0);if(sfd-1){perror("sfd error:");retur…

【正点原子STM32】Cortex-M系列介绍(ARM、Cortex、DMIPS/MHz和CoreMark/MHz*)

一、ARM公司 二、Cortex内核分类及特征 三、Cortex-M3/4/7介绍 四、总结 ARM官网 ARM开发者官网 CoreMark分数 一、ARM公司 ARM架构特点 ARM&#xff08;Advanced RISC Machine&#xff09;架构是一种RISC&#xff08;Reduced Instruction Set Computing&#xff09;架构&…

【征服redis2】redis的事务介绍

目录 1.redis事务介绍 2 事务出错的处理 1.redis事务介绍 在前面我们介绍了redis的几种典型数据结构和应用&#xff0c;本文我们来看一下redis的事务问题。事务也是数据库的重要主题&#xff0c;熟悉关系型数据库的读者应该对事务比较了解&#xff0c;简单地说&#xff0c;事…

第四期——kali

文章目录 12.4kali安装内网主机发现探测 12.5nmapnccdnzenmapdocker启动redisredis命令vulhub启动redispython爆破redis密码密码攻击——九头蛇hydra密码攻击——美杜莎medusa 12.6rsyncgobyMongoDBmongodb命令hydra爆破python脚本爆破 12.7Elasticsearchpython连接esMetasploi…

系分备考计算机网络传输介质、通信方式和交换方式

文章目录 1、概述2、传输介质3、网络通信4、网络交换5、总结 1、概述 计算机网路是系统分析师考试的常考知识点&#xff0c;本篇主要记录了知识点&#xff1a;网络传输介质、网络通信和数据交换方式等。 2、传输介质 网络的传输最常见的就是网线&#xff0c;也就是双绞线&…

蓝天采集器,功能逆天的网站数据抓取神器,轻松助你成为采集达人,附带搭建配置文档

源码介绍 蓝天采集器是一款专为web服务器打造的数据采集神器。与市面上常见的桌面端采集工具&#xff08;如火车头等&#xff09;相比&#xff0c;蓝天采集器在易用性、上手成本和灵活性方面更胜一筹。它部署简便&#xff0c;无需复杂的设置&#xff0c;即可迅速融入您的web服…

ONLYOFFICE服务器无法连接,请联系管理员问题解决

1、现象 部署好了nextcloud和onlyoffice后&#xff0c;新建文本文档报错ONLYOFFICE服务器无法连接&#xff0c;请联系管理员。 用快捷键“F12”进入控制台&#xff0c;点开错误提示栏&#xff0c;找到有“api.js“文件&#xff0c;“https://ONLYOFFICED的地址/web-apps/apps/…

史上最详细的JAVA学生信息管理系统(MySQL实现)

一、项目介绍 为了巩固Java的学习写了一个基于MVC设计模式的学生管理系统。 简单介绍一下MVC设计模式&#xff1a; 1、M也就是Model 模型层&#xff08;也叫数据层&#xff09;主要是通过这个类来进行数据的操作。 2、V是Views 视图层&#xff0c;主要就是来显示页面信息。 3、…

KubeSphere平台使用

KubeSphere官网地址&#xff1a;https://kubesphere.io/zh/ KubeKey一键部署K8S集群&#xff1a;https://kubesphere.io/zh/docs/v3.4/installing-on-linux/introduction/multioverview/ 一台master node&#xff08;初始化主节点&#xff09;、两台 work node&#xff08; joi…

品牌价格维护的具体方法

品牌销售渠道的混乱&#xff0c;一般体现在产品价格&#xff0c;价格是产品价值的直接表现&#xff0c;当价格混乱&#xff0c;消费者会不认可品牌价值&#xff0c;品牌因为自身渠道问题&#xff0c;导致消费者的流失&#xff0c;是非常得不偿失的&#xff0c;同时&#xff0c;…

(每日持续更新)jdk api之FileReader基础、应用、实战

博主18年的互联网软件开发经验&#xff0c;从一名程序员小白逐步成为了一名架构师&#xff0c;我想通过平台将经验分享给大家&#xff0c;因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验&#xff0c;晚上进行用心精简、整理、总结、定稿&…

c++学习笔记-STL案例-机房预约系统4-管理员模块

前言 衔接上一篇“c学习笔记-STL案例-机房预约系统3-登录模块”&#xff0c;本文主要设计管理员模块&#xff0c;从管理员登录和注销、添加账号、显示账号、查看机房、清空预约五个功能进行分析和实现。 目录 7 管理员模块 7.1 管理员登录和注销 7.1.1 构造函数 ​编辑7.1.2…

双线逆变器之低压转高压DC-DC拓扑结构

这是一个升压的过程&#xff0c;电池电压48V经过变压器等一系列的元器件最后升压到400V 如何让变压器形成正负电压&#xff1f; 通过让Q6Q7开通&#xff0c;Q6Q8关闭形成上下- 通过让Q6Q7关闭&#xff0c;Q6Q8开通形成上-下 前面四个管子和变压器的作用就是类似一个方波发生…

【linux进程间通信(一)】匿名管道和命名管道

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; 进程间通信 1. 前言2. 进程间…

解决Windows下VSCode控制台乱码问题

我们在Windows使用VSCode编写C/C程序时&#xff0c;如果代码中的中文字符串使用的是UTF8编码&#xff0c;且代码内没有设置控制台的输出编码&#xff0c;或者编译时没有指定运行时编码&#xff08;GCC可以在编译时使用-fexec-charsetGBK来指定运行时的字符串编码&#xff1b;cl…