02 tkinter有趣项目-头像制作-界面设计

头像制界面设计

在这里插入图片描述

avatar.png

在这里插入图片描述

界面

界面分析

  1. 背景图片:

    • 顶部中央位置显示一个小孩背着书包的图片。这个图片是程序的背景,占据了大部分的窗口空间。
  2. 标题和按钮:

    • 在图片上方,有一个标题栏,显示文本“在线姓氏头像制作”,使用隶书字体,字体大小为22,颜色为红色。
    • 标题下方有一个按钮,上面有“ ★☆★ 踢我一下 ☆★☆ ”的文本,使用隶书字体,大小为14,背景色为#b0fcff。
  3. 输入区域:

    • 在标题和按钮下方,有一个输入区域,分为几个部分:
      • 姓氏输入: 在输入区域的最左侧,有一个标签“输入姓氏”,用户可以在此输入框中输入姓氏。
      • 头像模板选择: 紧接着姓氏输入框的右侧,有一个下拉列表,用户可以从中选择不同的头像模板,如“献花男孩”、“风车男孩”等。
      • 印签文字输入: 在模板选择的下方,有一个标签“印签文字”,用户可以在此输入框中输入想要添加到头像上的印签文字。
      • 性别选择: 在印签文字输入框的下方,有一个标签“性别”,用户可以通过一个数值选择器(Spinbox)选择性别,选项为“男”或“女”。
  4. 装饰元素:

    • 根据你提供的描述,程序中还可能包含一些装饰元素,如蓝色和黄色的圆形装饰,上面分别有文字“大”、“小”、“菜”、“~”。这些装饰元素可能被放置在窗口的右侧或其它空白区域,以增加视觉效果。

界面布局

  • 主窗口标题: “头像制作”
  • 窗口大小: 600x500像素,位置偏移屏幕左上角1200x50像素
  • 窗口属性: 不可调整大小,始终位于其他窗口之上

主要组件

  1. 背景图片: 显示一个小孩背着书包的图片,背景为浅色。
  2. 标题: “在线姓氏头像制作”,字体为隶书,大小为22,颜色为红色。
  3. 按钮: 文本为" ★☆★ 踢我一下 ☆★☆ ",字体为隶书,大小为14,背景色为#b0fcff。
  4. 输入区域:
    • 姓氏输入: 用户可以输入姓氏。
    • 头像模板选择: 提供多个头像模板供用户选择,如"献花男孩"、"风车男孩"等。
    • 印签文字输入: 用户可以输入想要添加到头像上的印签文字。
    • 性别选择: 用户可以选择性别,选项为"男"或"女"。

注意

最下面的输入区域我用的是frame组件,可以让这个组件还是按照pack布局root窗口上四个小组件被frame组件包裹起来,它们之间按照grid布局。我用的是这个蠢方法,我估计还有更加简洁方便的方式。相信看我文章的大佬们心中有了更好的方法,希望可以教教小趴菜。咋们一起学习,一起进步啦,相信咋们是最棒的,加油,么么哒!

程序代码解析

from tkinter import *
from tkinter import ttk
from PIL import Image, ImageTk# 导入Tkinter库及其扩展ttk,以及PIL库用于图像处理。root = Tk()
# 创建Tkinter的主窗口实例。root.title('头像制作')
# 设置窗口标题为“头像制作”。root.geometry('600x500+1200+50')
# 设置窗口大小为600x500像素,并指定窗口在屏幕上的位置(x=1200, y=50)。root.resizable(False, False)
# 设置窗口大小不可调整。root.attributes("-topmost", True)
# 设置窗口始终在其他窗口之上。img = Image.open('avatar.png')
# 使用PIL库打开名为'avatar.png'的图片文件。img = img.resize((464, 364))
# 将图片调整为464x364像素大小。img = ImageTk.PhotoImage(img)
# 将PIL图像转换为Tkinter可以使用的PhotoImage对象。# 创建一个Label组件,用于显示图片,并将其添加到窗口中。
Label(root, image=img).pack()# 创建一个Label组件,显示文本“在线姓氏头像制作”,设置字体和前景色,并将其添加到窗口中。
Label(root, text='在线姓氏头像制作', font=("隶书", 22), fg='red').pack()# 创建一个按钮,显示特定文本和样式,并将其添加到窗口中。
Button(root, text=' ★☆★ 踢我一下 ☆★☆ ', font=("隶书", 14), width='33', bg='#b0fcff').pack()name = StringVar()
# 创建一个StringVar变量,用于存储输入框的值。name.set('宇宙第一')
# 初始化StringVar变量的值为“宇宙第一”。text = StringVar()
# 创建另一个StringVar变量,用于存储另一个输入框的值。text.set('小趴菜~')
# 初始化StringVar变量的值为“小趴菜~”。number_int_var = StringVar()
# 创建一个StringVar变量,用于存储下拉列表的值。frame = Frame(root)
# 创建一个Frame组件,作为其他组件的容器。frame.pack()
# 将Frame组件添加到窗口中。Label(frame, text='输入姓氏', font=("隶书", 20)).grid(row=0, column=0)
# 在Frame中创建一个标签,显示文本“输入姓氏”。Entry(frame, textvariable=name, font=("微软雅黑", 10)).grid(row=0, column=1)
# 创建一个输入框,与name变量绑定,并设置字体。Label(frame, text='头像模板', font=("隶书", 20)).grid(row=0, column=2)
# 创建一个标签,显示文本“头像模板”。numberChosen = ttk.Combobox(frame, textvariable=number_int_var)
# 创建一个下拉列表组件,与number_int_var变量绑定。numberChosen['values'] = ('献花男孩','风车男孩','可爱男孩','摆酷男孩','可爱女孩','接花女孩','提琴女孩','口罩女孩'
)
# 设置下拉列表的选项。numberChosen.grid(row=0, column=3)
# 将下拉列表添加到Frame中。numberChosen.set('接花女孩')
# 默认选中下拉列表中的“接花女孩”。Label(frame, text='印签文字', font=("隶书", 20)).grid(row=1, column=0)
# 创建一个标签,显示文本“印签文字”。Entry(frame, textvariable=text, font=("微软雅黑", 10)).grid(row=1, column=1)
# 创建一个输入框,与text变量绑定,并设置字体。Label(frame, text='性别', font=("隶书", 20)).grid(row=1, column=2)
# 创建一个标签,显示文本“性别”。Spinbox(frame, from_=0, to=10, values=("男", "女"), font=("微软雅黑", 10)).grid(row=1, column=3)
# 创建一个选择框,允许用户选择“男”或“女”。# 运行程序
if __name__ == '__main__':root.mainloop()
# 如果这个脚本是直接运行的,而不是被导入的,则进入Tkinter的主事件循环,开始显示窗口并响应用户操作。

把程序封装成一个类方便后面使用

import tkinter as tk
from tkinter import ttk
from PIL import Image, ImageTk# 导入所需的模块。tkinter是Python的标准GUI库,ttk是tkinter的扩展,PIL用于图像处理。
class AvatarMaker(tk.Tk):# 定义一个名为AvatarMaker的类,继承自tk.Tk,即Tkinter的主窗口类。def __init__(self):super().__init__()# 调用父类的构造函数,初始化窗口。self.numberChosen = '献花男孩'self.title('头像制作')# 设置窗口标题为“头像制作”。self.geometry('600x500+1200+50')# 设置窗口大小为600x500像素,并指定窗口在屏幕上的位置(x=1200, y=50)。self.resizable(False, False)# 设置窗口大小不可调整。self.attributes("-topmost", True)# 设置窗口始终在其他窗口之上。# 加载并显示头像图片self.img = Image.open('avatar.png')# 使用PIL库打开名为'avatar.png'的图片文件。self.img = self.img.resize((464, 364))# 将图片调整为464x364像素大小。self.photo_img = ImageTk.PhotoImage(self.img)# 将PIL图像转换为Tkinter可以使用的PhotoImage对象。self.label_image = tk.Label(self, image=self.photo_img)# 创建一个Label组件,用于显示图片。self.label_image.pack()# 将Label组件添加到窗口中。# 添加标题self.label_title = tk.Label(self, text='在线姓氏头像制作', font=("隶书", 22), fg='red')# 创建一个Label组件,显示文本“在线姓氏头像制作”,设置字体和前景色。self.label_title.pack()# 将Label组件添加到窗口中。# 添加按钮self.button_kick = tk.Button(self, text=' ★☆★ 踢我一下 ☆★☆ ', font=("隶书", 14), width='33', bg='#b0fcff')# 创建一个按钮,显示特定文本和样式。self.button_kick.pack()# 将按钮添加到窗口中。# 创建输入框和下拉列表的变量self.name_var = tk.StringVar(value='宇宙第一')# 创建一个StringVar变量,用于存储输入框的值,并初始化为“宇宙第一”。self.text_var = tk.StringVar(value='小趴菜~')# 创建另一个StringVar变量,用于存储另一个输入框的值,并初始化为“小趴菜~”。self.number_int_var = tk.StringVar()# 创建一个StringVar变量,用于存储下拉列表的值。# 创建输入框和下拉列表self.create_widgets()# 调用create_widgets方法来创建其他界面组件。def create_widgets(self):frame = tk.Frame(self)# 创建一个Frame组件,作为其他组件的容器。frame.pack()# 将Frame组件添加到窗口中。tk.Label(frame, text='输入姓氏', font=("隶书", 20)).grid(row=0, column=0)# 在Frame中创建一个标签,显示文本“输入姓氏”。tk.Entry(frame, textvariable=self.name_var, font=("微软雅黑", 10)).grid(row=0, column=1)# 创建一个输入框,与self.name_var变量绑定,并设置字体。tk.Label(frame, text='头像模板', font=("隶书", 20)).grid(row=0, column=2)# 创建一个标签,显示文本“头像模板”。self.numberChosen = ttk.Combobox(frame, textvariable=self.number_int_var)# 创建一个下拉列表组件,与self.number_int_var变量绑定。self.numberChosen['values'] = ('献花男孩', '风车男孩', '可爱男孩', '摆酷男孩', '可爱女孩', '接花女孩', '提琴女孩', '口罩女孩')# 设置下拉列表的选项。self.numberChosen.grid(row=0, column=3)# 将下拉列表添加到Frame中。self.numberChosen.set('献花男孩')# 默认选中下拉列表中的“献花男孩”。tk.Label(frame, text='印签文字', font=("隶书", 20)).grid(row=1, column=0)# 创建一个标签,显示文本“印签文字”。tk.Entry(frame, textvariable=self.text_var, font=("微软雅黑", 10)).grid(row=1, column=1)# 创建一个输入框,与self.text_var变量绑定,并设置字体。tk.Label(frame, text='性别', font=("隶书", 20)).grid(row=1, column=2)# 创建一个标签,显示文本“性别”。tk.Spinbox(frame, from_=0, to=10, values=("男", "女"), font=("微软雅黑", 10)).grid(row=1, column=3)# 创建一个选择框,允许用户选择“男”或“女”。# 运行程序if __name__ == '__main__':# 如果这个脚本是直接运行的,而不是被导入的,则创建AvatarMaker类的实例。app = AvatarMaker()# 进入Tkinter的主事件循环,开始显示窗口并响应用户操作。app.mainloop()

注意事项

  • 确保avatar.png图片文件与程序在同一目录下,否则需要修改图片路径。
  • 该程序目前只提供了一个静态的头像背景,没有实现动态生成头像的功能。如果需要进一步开发,可以考虑集成图像处理库来根据用户输入生成头像。

可能的扩展

  • 实现一个功能,根据用户输入的姓氏、选择的模板和印签文字,动态生成并显示个性化的头像。
  • 增加保存功能,允许用户保存生成的头像到本地文件系统。

以上就是对程序的简单介绍和笔记。希望对你有所帮助!

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

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

相关文章

负载均衡详解

概述 负载均衡建立在现有的网络结构之上,提供了廉价、有效、透明的方式来扩展网络设备和服务器的带宽,增加了吞吐量,加强了网络数据的处理能力,提高了网络的灵活性和可用性。项目中常用的负载均衡有四层负载均衡和七层负载均衡。…

redis面试(二十)读写锁WriteLock

写锁WriteLock 和读锁一样,在这个地方执行自己的lua脚本,我们去看一下 和read没有多大的区别 KEYS[1] anyLock ARGV[1] 30000 ARGV[2] UUID_01:threadId_01:write hget anyLock mode,此时肯定是没有的,因为根本没这个锁 …

代码随想录训练营day43|动态规划part10

最长递增子序列 力扣题目链接 class Solution { public:int lengthOfLIS(vector<int>& nums) {int len nums.size();int result 1;vector<int> dp(len, 1);for(int i 1; i < len; i){for(int j 0; j < i; j){if(nums[j] < nums[i]){dp[i] max(…

flink+flinkcdc+同步(MYSQL到MYSQL)实践

flink+flinkcdc+同步MYSQL到MYSQL 目标 通过Flink +FlinkCDC实现MYSQL到MYSQL的同步【单表,多表】运行环境 mysql8.0.3 | flink-1.13.2 | flink-connector-jdbc_2.11-1.13.2.jar |flink-sql-connector-mysql-cdc-2.1.0.jar前置条件 开启bin_log日志 以及设置bin_log格式=RO…

@RequestBody与@RequestParam:Spring MVC中的参数接收差异解析

在Spring MVC中&#xff0c;RequestBody和RequestParam是两个常用于接收客户端请求参数的注解&#xff0c;但它们的使用场景和作用机制存在显著差异。了解这些差异对于开发RESTful API和处理HTTP请求至关重要。本文将详细探讨RequestBody与RequestParam的区别。 RequestParam …

“双指针”算法下篇

WeChat_20240806081335 对双指针这一思想在OJ 里面的相关应用&#xff0c;感兴趣的友友们&#xff0c;可以看下此篇博客 https://blog.csdn.net/X_do_myself/article/details/141291451?spm1001.2014.3001.5502 目录 一盛最多水的容器 1题目链接&#xff1a;盛最多水的容器…

音频分割软件有什么?最方便的音频分割软件分享给你

一段长音频就像是一本厚重的百科全书&#xff0c;而音频剪辑师的任务&#xff0c;就是要将这本书拆分成数个章节&#xff0c;每章都有其独立的主题和内容&#xff0c;这非常考验剪辑师们的音频分割技巧。 幸运的是&#xff0c;随着技术的发展&#xff0c;市面上出现了许多优秀…

在 Spring Boot 中为 MyBatis 添加拦截器

在 Spring Boot 中为 MyBatis 添加拦截器以实现分表查询涉及几个步骤。以下是如何在 Spring Boot 应用中配置和使用 MyBatis 拦截器的指南&#xff0c;具体以分表查询为例&#xff1a; 创建拦截器 首先&#xff0c;定义一个自定义的 MyBatis 拦截器&#xff0c;实现 Intercept…

【八股】DDD领域驱动设计

什么是 DDD 领域驱动设计 🔜 是一种软件设计方法,核心思想是通过领域驱动设计方法定义领域模型,从而确定业务和应用边界,保证业务模型和代码模型的一致性。它倡导统一语言,提出了一系列概念,包括实体、值对象、聚合根等。 🔜 优势:帮助开发团队更好地理解和表达业务…

微信小程序引入全局环境变量

有时候一套代码要在多个小程序appId下使用,其中又有一些数据(文字)需要做区分.可以使用下面的方法 把要配置的数据以export default 形式导出 在app.js中,引入project.config.0.js文件,将导出的数据放在globalData中 在页面目录中,即可利用getApp()方法使用全局变量 也可以放数…

剪辑视频的软件在手,温馨瞬间秒变电影级大片

在现在这个啥都能数字化的年代&#xff0c;家里拍的视频成了咱们记录生活、留下美好回忆的好办法。不过&#xff0c;好多人可能就只是随便拍拍&#xff0c;然后直接发出去&#xff0c;没想过用专业的剪辑视频的软件来搞一搞&#xff0c;让自己的视频更有感觉&#xff0c;看起来…

Python-基础-面向对象

文章目录 面向对象1 简介2 基本操作2.1 类2.2 对象2.3 继承 面向对象 1 简介 面向对象&#xff08;OOP&#xff09;是一种对现实世界理解和抽象的方法&#xff0c;对象的含义是指在现实生活中能够看得见摸得着的具体事物&#xff0c;一句比较经典的描述是一切皆对象&#xff…

微服务通信

一、Feign远程调用 Feign是Spring Cloud提供的⼀个声明式的伪Http客户端&#xff0c; 它使得调⽤远程服务就像调⽤本地服务⼀样简单&#xff0c; 只需要创建⼀个接⼝并添加⼀个注解即可。 Nacos很好的兼容了Feign&#xff0c; Feign 默认集了Ribbon&#xff0c; 所以在Nacos下…

vue全局参数

/* eslint-disable no-new */ new Vue({el: #app,router,components: { App },template: <App/>,data:function(){return{wbWinList: [] // 定义的变量&#xff0c;全局参数}}, }) //使用全局参数 // this.$root.backgroundColor 666;其它页面如果想监听改变 //监听全…

git cherry-pick 用法

/* * cherry-pick */ git cherry-pick 允许开发者有选择地合并其他分支的提交到当前分支&#xff0c; 这对于解决代码冲突、修复bug以及在不同分支之间转移提交非常有用。 基本用法&#xff1a; 1.合并一个提交&#xff1a;通过指定提交的哈希值&#xff0c…

polarctf靶场[CRYPTO]显而易见的密码、[CRYPTO]夏多的梦、[CRYPTO]再这么说话我揍你了、[CRYPTO]神秘组织M

[CRYPTO]显而易见的密码 考点&#xff1a;ntlm编码 打开文件&#xff0c;显示内容就是ntlm格式 ntlm解密 在线网站&#xff1a; https://www.cmd5.com/便可得到flag [CRYPTO]夏多的梦 根据题目提示可以猜测为夏多密码 考点&#xff1a;夏多密码 在线加密原理网站&#x…

使用axios的fetch adapter遇到浏览器兼容问题

axios 2024年5月20号发布1.7.0版&#xff0c;开始支持fetch adapter&#xff0c;我是很高兴的&#xff0c;把此前fetch写的语句换成axios的&#xff0c;感觉简洁了很多。 因为我要post传urlencode编码参数&#xff0c;所以用fetch得这样&#xff1a; let data{k1:v1,k2:v2,k3:…

链表OJ题——链表的回文结构

文章目录 一、题目链接二、解题思路三、解题代码 一、题目链接 链表的回文结构 二、解题思路 三、解题代码

探索JetBrains IDE数据库驱动的存储位置及离线安装指南

JetBrains IDE&#xff0c;如IntelliJ IDEA和GoLand&#xff0c;是广受开发者喜爱的集成开发环境。它们提供了强大的数据库支持功能&#xff0c;包括数据库连接和操作。了解数据库驱动的存储位置对于进行离线安装和配置非常重要。 理解数据库驱动 数据库驱动是软件应用程序与…

4种方法!前端判断页面是在PC端还是移动端打开

4种方法&#xff01;前端判断页面是在PC端还是移动端打开 在写前端的过程中&#xff0c;有时候考虑适配与页面权限等问题的时候&#xff0c;需要涉及到用户访问的设备情况&#xff0c;下面将介绍几种常见的判断页面是在PC端还是移动端打开的方法。 方法1. 基于 navigator.use…