首页 > 编程问答 >如何防止进度条指示器显示在圆角之外?

如何防止进度条指示器显示在圆角之外?

时间:2024-07-24 08:16:35浏览次数:6  
标签:python pygame pygame-surface

当我使用舍入时,我的进度条溢出了其边框:

image

我的修复(使用 pygame.draw.arc 在圆角矩形外部形成透明弧)仍然留下一部分可见。 arc 函数使用一个矩形,所以我计算它的位置和大小:

# I stored the 4 border radiuses in a dictionary.
rad = sqrt(border_radius['border_top_left_radius']**2*2)
# It can also be written as
rad = sqrt(2)*border_radius['border_top_left_radius']

并减去边框半径以获得从角到边界正方形顶点的距离:

dist = round(rad-border_radius['border_top_left_radius'])

我画了弧:

pygame.draw.arc(
    self.image,
    (0,0,0,0),
    pygame.Rect(
        -dist,
        -dist,
        border_radius['border_top_left_radius']*2+dist,
        border_radius['border_top_left_radius']*2+dist),
    math.radians(90), math.radians(180),
    dist
)

但它仍然溢出了它的圆角(黑色说明):

image

也许圆角不是正圆?


你遇到的问题是,你正在使用 line thickness pygame.draw.arc 中来控制透明弧的宽度,但这会导致部分溢出可见。这是因为线宽在绘制的弧线的中心绘制,因此即使线宽等于圆角半径,它也只会覆盖圆角的一半。

为了解决这个问题,你不需要绘制透明弧。 Pygame 没有内置方法来绘制具有完美圆角的形状,但你可以使用以下方法解决此问题:

1. 使用遮罩:

  • 创建一个带有圆角的表面。 这可以使用 pygame.Surface fill 方法(用于背景)和 pygame.draw.circle (用于绘制圆角)来完成。
  • 创建一个作为进度条的表面。
  • 将进度条表面 blit 到圆角表面上。
  • 将圆角表面设置为进度条表面的遮罩。 这将确保只有圆角内的像素可见。

这是一个示例代码:

import pygame

# 初始化 Pygame
pygame.init()

# 设置窗口大小
screen_width = 400
screen_height = 200
screen = pygame.display.set_mode((screen_width, screen_height))

# 设置进度条颜色
bar_color = (0, 128, 0)  # 绿色
bg_color = (255, 255, 255)  # 白色
border_color = (0, 0, 0)  # 黑色

# 设置进度条尺寸和圆角半径
bar_width = 300
bar_height = 30
border_radius = bar_height // 2

# 创建带有圆角的表面
rounded_rect_surface = pygame.Surface((bar_width, bar_height), pygame.SRCALPHA)
rounded_rect_surface.fill((0, 0, 0, 0))  # 透明背景

# 绘制圆角矩形
pygame.draw.rect(rounded_rect_surface, bg_color, (0, 0, bar_width, bar_height), border_radius=border_radius)
pygame.draw.rect(rounded_rect_surface, border_color, (0, 0, bar_width, bar_height), width=2, border_radius=border_radius)


# 创建进度条表面
progress_bar_surface = pygame.Surface((bar_width, bar_height), pygame.SRCALPHA)

# 设置进度条初始值
progress = 0

# 游戏循环
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # 更新进度条 (这里只是一个例子,你可以根据需要更改逻辑)
    progress += 0.01
    if progress > 1:
        progress = 0

    # 清空进度条表面
    progress_bar_surface.fill((0, 0, 0, 0)) 

    # 绘制进度条
    pygame.draw.rect(progress_bar_surface, bar_color, (0, 0, progress * bar_width, bar_height), border_radius=border_radius)

    # 将进度条 blit 到圆角表面上
    rounded_rect_surface.blit(progress_bar_surface, (0, 0))

    # 将圆角表面设置为遮罩
    progress_bar_surface.set_colorkey((0, 0, 0))  # 设置黑色为透明
    progress_bar_surface.blit(rounded_rect_surface, (0, 0), special_flags=pygame.BLEND_RGBA_MIN) 

    # 在屏幕上绘制进度条
    screen.fill(bg_color)
    screen.blit(progress_bar_surface, ((screen_width - bar_width) // 2, (screen_height - bar_height) // 2))

    # 更新显示
    pygame.display.flip()

# 退出 Pygame
pygame.quit()

2. 使用带有圆角的图像编辑软件创建进度条图像。

  • 创建一个带有圆角的透明 PNG 图像,作为进度条的背景。
  • 在你的 Pygame 代码中,加载此图像并将其用作进度条的背景。然后,你可以简单地在上面绘制一个矩形来表示进度,而圆角将由背景图像处理。

这两种方法都可以帮助你创建带有完美圆角的进度条,而不会出现任何溢出。

标签:python,pygame,pygame-surface
From: 78780163

相关文章

  • 在Python多处理中执行二进制信号量或互斥体以进行上下文切换操作
    我正在尝试自动化win应用程序和java应用程序之间的同步关系。我的标准是:启动win和jav应用程序在jav应用程序中执行命令等待jav应用程序的响应使用jav应用程序的响应到Windows应用程序作为输入。在jav应用程序中执行命令win应用程序......
  • 在spyder-python上随机出现的这些奇怪的亮点是什么
    在此处输入图像描述每次我单击此按钮或进行任何更改时,都会创建奇怪的突出显示,当我最小化功能时更是如此。有什么建议如何摆脱这些或可能的原因是什么?谢谢!我尝试更改外观首选项中的设置,但无法影响问题。很抱歉,我无法直接查看或与Spyder界面交互。我是一个AI......
  • 比较Python字典并找到缺失的元素
    我遇到了一个问题,我已经尝试了几天但没有得到任何结果。我想比较两个字典,在一个字典中有“赛前”足球比赛,在第二个字典中有“现场”足球比赛。我想将它们相互比较并打印它们(如果有)没有赛前比赛直播。示例1pre=[{"Home":"Genoa","Away":"In......
  • Python使用Visual Studio打印功能不显示输出
    任务:检查一个整数是正数还是负数。检查整数是否能被2整除。当输入0时,我需要退出循环并报告每个计数和总和。print函数没有显示任何输出。这是我从defmain()开始使用的代码defmain():countpositive=0countnegative=0count_divisible_by_2=0sump......
  • Python 中的像素最小二乘法
    我有一个非线性前向模型,它计算每个像素参数w的灰度图像。我还可以使用scipys优化函数来反转模型。我目前遇到的唯一问题是图像的大小使得这个解决方案非常慢...比如7%的像素在40分钟内计算得很慢。我使用for循环遍历所有像素并按像素应用模型。我尝试过......
  • SQL 命令在手动运行时工作正常(SQL Developer),但在 Python 的 oracledb 模块中给出 ORA-
    我正在使用OracleSQL数据库,并且我想运行该命令ALTERSESSIONSETNLS_DATE_FORMAT='YYYY-MM-DD';当我从SQLDeveloper应用程序手动运行它时,它工作正常。但是,当我使用oracledb模块从Python运行它时,出现以下错误:ErrorrunningSQLscript:ORA-00922:mi......
  • 在pip包中分发pythonnet dll类型信息
    我已经能够使用C#通过以下方式加载pythonnetdll:fromimportlib.resourcesimportpathimportsys#Assuming'my_package.lib'isthesub-packagecontainingtheDLLswithpath('pyrp.lib','')aslib_path:sys.path.append......
  • 尝试使用 pyinstaller 将 python 文件转换为可执行文件时出现 TypeError
    稍后的目的是通过命令行向GPT4all发送问题并将答案存储在文本文档中。我想将阻止代码转换为exe,但它产生了TypeError。这是到目前为止的代码:fromgpt4allimportGPT4Allmodel=GPT4All("Meta-Llama-3-8B-Instruct.Q4_0.gguf",device='cpu')#downloads/loads......
  • 使用 Python-PlexAPI 获取 plex 上所有好友的关注列表
    有关如何接收我的plex服务器上所有用户的监视列表的任何提示。我正在根据一些规则创建自动删除,其中一个规则是,如果电影位于用户观看列表中,则不应删除该电影。我遇到了麻烦,因为所有与观看列表相关的内容都在MyPlexAccount上。lexapi.myplex.MyPlexAccount具有我的用......
  • 如何在 Python 中查看与 Azure OpenAI 助手关联的所有上传文件?
    我正在使用Python对文档中的问题进行基准测试,并在jupyter笔记本中实例化了我的助手。我想确认助手是否有我上传的文件,但似乎找不到有关此功能将使用什么功能的文档。使用适用于AzureOpenAI的最新版本的PythonAPI。目前,无法使用AzureOpenAI的PythonAPI直接查看......