【问题标题】:Trouble with verticle Pygame status bar [duplicate]垂直Pygame状态栏出现问题[重复]
【发布时间】:2021-10-03 23:33:36
【问题描述】:

以下代码有效,但对我来说看起来有点笨拙。如果有比我的方法更好的编写方法,我会徘徊。它的分辨率也太高了。如果有人对更好的方法以及如何减慢分辨率有任何想法,我很想听听。谢谢!

import pygame as pg
from random import randint###RANDOM LIBRARY

pg.init()

screen = pg.display.set_mode((640, 480))
FONT = pg.font.Font(None, 36)
BACKGROUND_COLOR = (37, 225, 192)
BLUE = (0, 0, 199)
GRAY = (0, 0, 55)

#Rectangle variables.
measure_rect = pg.Rect(200, 40, 100, 400)

done = False

while not done:
    for event in pg.event.get():
        if event.type == pg.QUIT:
            done = True

    random_bar=randint(33,34)#Manipulation of bar graph.
    value_print=random_bar
    length = random_bar*4
    random_bar = 100 - random_bar
    top = 40+(random_bar*4)

    screen.fill(BACKGROUND_COLOR)
    pg.draw.rect(screen, BLUE, (200, top, 100, length))
    pg.draw.rect(screen, GRAY, measure_rect, 2)
    txt = FONT.render(str(round(value_print, 2)), True, GRAY)
    screen.blit(txt, (120, 20))

    pg.display.flip()
    
pg.quit()

【问题讨论】:

标签: python user-interface pygame gauge


【解决方案1】:

我建议实现一个Bar 类:

import pygame as pg
from random import randint###RANDOM LIBRARY

pg.init()

screen = pg.display.set_mode((640, 480))
FONT = pg.font.Font(None, 36)
BACKGROUND_COLOR = (37, 225, 192)
BLUE = (0, 0, 199)
GRAY = (0, 0, 55)

class Bar():
    def __init__(self, rect, bar = BLUE, outline = GRAY):
        self.rect = pg.Rect(rect)
        self.bar = bar
        self.outline = outline
        self.value = 0
    def draw(self, surf):
        length = round(self.value * self.rect.height / 100)
        top = self.rect.height - length
        pg.draw.rect(surf, self.bar, (self.rect.x, self.rect.y + top, self.rect.width, length))
        pg.draw.rect(surf, self.outline, self.rect, 2) 
        txt = FONT.render(str(round(self.value, 2)), True, GRAY)
        txt_rect = txt.get_rect(topright = (self.rect.x - 10, self.rect.y))
        screen.blit(txt, txt_rect)   

bar = Bar((200, 40, 100, 400))

done = False
while not done:
    for event in pg.event.get():
        if event.type == pg.QUIT:
            done = True

    bar.value = randint(33, 34)

    screen.fill(BACKGROUND_COLOR)
    bar.draw(screen)
    pg.display.flip()
    
pg.quit()

【讨论】:

  • 感谢 Rabbid76 !如果 pg.display.flip() 没有参数,你如何减慢速度?我每秒只需要三帧。你对初始代码的清理很棒。
  • 我在 pg.display.flip() 之前添加了 pg.time.wait(500) 以降低帧速率。希望 pg.display.flip() 接受一个参数。