pygame封装连个常用控件

news/2024/9/22 11:06:43/文章来源:https://www.cnblogs.com/xuxiaobo/p/18384105
#coding=utf-8import os,sys,re,time
import pygame
import random
from win32api import GetSystemMetrics
from tkinter import messageboxpygame.init()
pygame.display.set_caption("我的控件")percent = 0.6
screen_width = GetSystemMetrics(0)
screen_height = GetSystemMetrics(1)
window_width = int(screen_width*percent)
window_height = int(screen_height*percent)dt = 0
clock = pygame.time.Clock()screen = pygame.display.set_mode((window_width, window_height))#停止处理输入法事件
pygame.key.stop_text_input()def showMsg(msg):messagebox.showinfo('提示信息', msg)class Button:def __init__(self, x, y, w, h):self.x = xself.y = yself.w = wself.h = hself.color = 'gray'self.text = '按钮'self.text_color = 'black'self.text_size = 12self.border_width = 1self.border_color = 'black'self.font_path = os.path.join(os.path.dirname(sys.argv[0]), 'simsun.ttc')self.my_font = pygame.font.Font(self.font_path, self.text_size)def setColor(self, color):self.color = colordef setText(self, text):self.text = textdef getText(self):return self.textdef setTextColor(self, text_color):self.text_color = text_colordef setTextSize(self, text_size):self.text_size = text_sizeself.my_font = pygame.font.Font(self.font_path, self.text_size)def setBorderWidth(self, border_width):self.border_width = border_widthdef setBorderColor(self, border_color):self.border_color = border_colordef draw(self, win):pygame.draw.rect(win, self.color, (self.x, self.y, self.w, self.h))if self.border_width > 0:pygame.draw.rect(win, self.border_color, (self.x, self.y, self.w, self.h), self.border_width)text = self.my_font.render(self.text, True, self.text_color)myx = self.x + (self.w - text.get_width()) / 2myy = self.y + (self.h - text.get_height()) / 2win.blit(text, (myx, myy))def click(self, event):if self.x + self.w > event.pos[0] > self.x and self.y + self.h > event.pos[1] > self.y:return Truereturn Falseclass Label:def __init__(self, x, y, w, h):self.x = xself.y = yself.w = wself.h = hself.color = 'white'self.text = ''self.text_color = 'black'self.text_size = 12self.border_width = 0self.border_color = ''self.font_path = os.path.join(os.path.dirname(sys.argv[0]), 'simsun.ttc')self.my_font = pygame.font.Font(self.font_path, self.text_size)def setColor(self, color):self.color = colordef setText(self, text):self.text = textdef getText(self):return self.textdef setTextColor(self, text_color):self.text_color = text_colordef setTextSize(self, text_size):self.text_size = text_sizeself.my_font = pygame.font.Font(self.font_path, self.text_size)def setBorderWidth(self, border_width):self.border_width = border_widthdef setBorderColor(self, border_color):self.border_color = border_colordef getCharWH(self):padding_percent_width = 0.3padding_percent_height = 0.3test_text1 = '测试字符串'test_text2 = self.my_font.render(test_text1, True, self.text_color)char_width = test_text2.get_width() / len(test_text1)char_height = test_text2.get_height()padding_width = char_width * padding_percent_widthpadding_height = char_height * padding_percent_heightline_max_char = int((self.w - padding_width * 2) / char_width)return (char_height, padding_width, padding_height, line_max_char)def getTrueLines(self, char_height, padding_width, padding_height, line_max_char):texts = self.text.split("\n")k = 0for i,mytext in enumerate(texts):while len(mytext) > line_max_char:submytext = mytext[0:line_max_char]mytext = mytext[line_max_char:]k += 1k += 1return k+1def draw(self, win):(char_height, padding_width, padding_height, line_max_char) = self.getCharWH()lineNum = self.getTrueLines(char_height, padding_width, padding_height, line_max_char)if lineNum * char_height > self.h:self.h = lineNum * char_heightpygame.draw.rect(win, self.color, (self.x, self.y, self.w, self.h))if self.border_width > 0:pygame.draw.rect(win, self.border_color, (self.x, self.y, self.w, self.h), self.border_width)texts = self.text.split("\n")k = 0for i,mytext in enumerate(texts):while len(mytext) > line_max_char:submytext = mytext[0:line_max_char]subtext = self.my_font.render(submytext, True, self.text_color)submyx = self.x + padding_widthsubmyy = self.y + padding_height + char_height * kwin.blit(subtext, (submyx, submyy))mytext = mytext[line_max_char:]k += 1text = self.my_font.render(mytext, True, self.text_color)myx = self.x + padding_widthmyy = self.y + padding_height + char_height * kwin.blit(text, (myx, myy))k += 1bt = Button(5, 5, 80, 25)
bt.setText('测试按钮')
bt.setColor('Brown')
bt.setTextColor('Gold')
bt.setBorderColor('Lime')
bt.setBorderWidth(1)label_text = '''
我我我我我我我我我我我我我我我我我我我我我我我我
111111111111111111111111111111111111111111111
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
.。。。。。。。。。。。。。。。。。。。。。。。。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
'''.strip()
label = Label(115, 5, 250, 250)
label.setColor('Maroon')
label.setText(label_text)
label.setTextSize(18)
label.setBorderColor('Lime')
label.setBorderWidth(1)running = True
while running:for event in pygame.event.get():if event.type == pygame.QUIT:running = Falseif event.type == pygame.MOUSEBUTTONDOWN:if bt.click(event):showMsg("%s被点击了" % bt.getText())keys_pressed = pygame.key.get_pressed()#ESC键if keys_pressed[pygame.K_ESCAPE]:running = Falsescreen.fill("purple")bt.draw(screen)label.draw(screen)#更新显示pygame.display.flip()#pygame.display.update()dt = clock.tick(60) / 600pygame.quit()

  

效果:

 

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

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

相关文章

相机产品展示步入3D可视化新纪元

在这个日新月异的数字时代,科技的每一次飞跃都在重新定义着我们的生活方式与创作边界。当摄影艺术邂逅前沿科技,一场关于视觉盛宴的变革正悄然上演,为摄影爱好者与专业人士开启了一扇通往无限创意与沉浸式体验的大门。传统相机展示往往受限于二维平面的局限,难以全方位、多…

探索最佳无代码低代码工具:加速 Web 应用开发

本文从新手友好视角,介绍一些顶级工具,并展示其应用示例,帮助新手开发者更快上手 Web 应用开发。Web 应用无处不在。 从用户友好的在线表单到功能强大的企业级解决方案,Web 应用的多样性和复杂性不断增长。 随着低代码无代码技术的发展,构建一个 Web 应用的门槛正在大大降…

为什么我们需要收集URL?

原创 M09ic ChainReactorNext Generation HTTP Dir/File Fuzz Tool: https://github.com/chainreactors/spray Fast passive URL enumeration Tool: https://github.com/chainreactors/urlfounder 为什么我们需要收集URL? 这个问题似乎在最基础的安全岗面试中都不太可能出现,但…

【C#】【Winform】自定义控件、自定义事件

https://blog.csdn.net/m0_62366581/article/details/139553373 在开发桌面的过程中,有时候自带的控件样式或者功能上可能不一定能够满足我们的所有要求。这时候,我们需要自定义控件。创建类库项目 把图标拖放到资源文件中 添加用户控件 设置样式尺寸 修改代码视图 其他项目中…

浪潮5468M7,英伟达4090,安装ubuntu18.04 使用ubuntu做运算

浪潮5468M7, 配置6块英伟达4090 使用ubuntu做运算 1.制作安装镜像,使用ventoy刻录U盘,下载ubuntu18.04 ,直接拷贝进入镜像 装系统方法此处省略,参见官方技术网站,浪潮信息技术网 – 360专家服务 (4008600011.com) 2.机器制作raid,此处步骤省略,默认启动模式为UEFI。 ri…

自我介绍+软工五问

| 这个作业属于哪个课程 | https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/ | | ----------------- |--------------- | | 这个作业要求在哪里| https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/homework/13228 | | 这个作业的目标 | <开通博客、Github账号。熟悉博客…

CSEC:香港城市大学提出SOTA曝光矫正算法 | CVPR 2024

在光照条件不佳下捕获的图像可能同时包含过曝和欠曝。目前的方法主要集中在调整图像亮度上,这可能会加剧欠曝区域的色调失真,并且无法恢复过曝区域的准确颜色。论文提出通过学习估计和校正这种色调偏移,来增强既有过曝又有欠曝的图像。先通过基于UNet的网络推导输入图像的增…

FlexAttention:解决二次复杂度问题,将大型视觉语言模型的输入提升至1008 | ECCV 2024

\({\tt FlexAttention}\) 是一种旨在增强大型视觉语言模型的方法,通过利用动态高分辨率特征选择和分层自注意机制,使其能够有效地处理并从高分辨率图像输入中获得优势, \({\tt FlexAttention}\) 在性能和效率方面超越了现有的高分辨率方法。 来源:晓飞的算法工程笔记 公众号…

折腾 Quickwit,Rust 编写的分布式搜索引擎 - 从不同的来源摄取数据

摄取 API 在这节教程中,我们将介绍如何使用 Ingest API 向 Quickwit 发送数据。 要跟随这节教程,您需要有一个本地的 Quickwit 实例正在运行。https://quickwit.io/docs/get-started/installation要启动它,请在终端中运行 ./quickwit run。 创建索引 首先,我们创建一个无模…

Git环境配置与安装

一:Git下载与安装 二:基础配置 三:配置SSH密钥一:Git下载与安装 Git - Downloading Package (git-scm.com) 下载Git到本地双击点击安装 一直点击“Next”安装完成点击右键发现有两个“Open Git GUI here”与“Open Git Bash here”的选项 Open Git GUI here:图形化界面 O…

HR人力资源OKR示例

==尝试将Tita 做为您的OKR解决方案== O:提高内部员工敬业度和工作满意度 KR1: 开展9月每周五全体员工的会议与励志演讲主题 KR2: 采访36名员工,了解他们改善工作文化的需求 KR3: 在所有16个部门中使用OKR和Tita软件实施 KR4: 达到至少每周员工的满意度:4.7分 O:招聘工作推…

Apache RocketMQ 中文社区全新升级丨阿里云云原生 7 月产品月报

《阿里云云原生每月动态》,从趋势热点、产品新功能、服务客户、开源与开发者动态等方面,为企业提供数字化的路径与指南。云原生月度动态 云原生是企业数字创新的最短路径。 《阿里云云原生每月动态》,从趋势热点、产品新功能、服务客户、开源与开发者动态等方面,为企业提供…