所以,我决定尝试在pygame中制作一个应用程序,因为它比tkinter复杂得多(这也有助于我已经使用了其中的一部分),并且遇到了一个问题,即我的文本只有一部分在闪烁。 (并非屏幕上的所有文本只是其中的一部分)
一些环境信息:我正在Windows 10上在atom上运行python 3.7。我已经尝试隔离问题,但是无法找到问题的根源,我通过正常运行文件来检查它是否为原子,但这无济于事。
import pygame
from winsound import Beep
from roundrects import aa_round_rect
from time import sleep, time
pygame.init()
pygame.font.init()
window_h = 725
window_w = 1300
bg_grey = (230, 230, 230)
button_grey = (190, 190, 190)
del_button_grey = (165, 165, 165)
white = (255, 255, 255)
black = (0, 0, 0)
normalfont = pygame.font.SysFont("Aileron", 30)
mediumfont = pygame.font.SysFont("Aileron", 60)
largefont = pygame.font.SysFont("Aileron", 70)
window = pygame.display.set_mode((window_w, window_h))
morse_keystrokes = []
class Button: # this class will be used to draw and interact with a Button.
def __init__(self, x, y, w, h, color, border=0, round=False, text=None, Font=mediumfont, Font_Color=black):
self.x = x
self.y = y
self.w = w
self.h = h
self.color = color
self.border = border
self.round = round
self.text = text
self.Font = Font
self.Font_Color = Font_Color
self.draw()
def draw(self):
if self.round == False:
if self.border != 0:
pygame.draw.rect(window, self.color, (self.x, self.y, self.w, self.h))
pygame.draw.rect(window, black, (self.x, self.y, self.w, self.h), self.border)
pygame.display.update()
else:
pygame.draw.rect(window, self.color, (self.x, self.y, self.w, self.h))
pygame.display.update()
elif self.round == True:
if self.border != 0:
aa_round_rect(window, (self.x, self.y, self.w, self.h), black, 30, self.border, self.color)
pygame.display.update()
else:
aa_round_rect(window, (self.x, self.y, self.w, self.h), self.color, 30)
pygame.display.update()
if self.text != None:
self.draw_text()
def clicked(self):
mouse = pygame.mouse.get_pos()
if self.x + self.w > mouse[0] > self.x and self.y + self.h > mouse[1] > self.y:
return True
else:
return False
def draw_text(self):
Label(self.text, self.x, self.y, self.w, self.h, self.Font, self.Font_Color)
class Typing_Box:
def __init__(self, x, y, w, h, color, dbc, border=0, font=normalfont, typing_font=mediumfont, font_color=black):
self.x = x
self.y = y
self.w = w
self.h = h
self.color = color
self.dbc = dbc #delete button color
self.border = border
self.font = font
self.typing_font = typing_font
self.font_color = font_color
self.draw()
def draw(self):
if self.border != 0:
pygame.draw.rect(window, self.color, (self.x, self.y, self.w, self.h))
pygame.draw.rect(window, black, (self.x, self.y, self.w, self.h), self.border)
pygame.draw.rect(window, self.dbc, ((window_w-self.x)-(self.w/15), self.y, self.w/15, self.h))
pygame.draw.rect(window, black, ((window_w-self.x)-(self.w/15), self.y, self.w/15, self.h), self.border)
else:
pygame.draw.rect(window, self.color, (self.x, self.y, self.w, self.h))
pygame.draw.rect(window, self.dbc, ((window_w-self.x)-(self.w/15), self.y, self.w/15, self.h))
Label("DEL", self.x, self.y, self.w, self.h, self.font, self.font_color, (((window_w-self.x)-(self.w/15)+((self.w/15)/2)), (self.y+(self.h/2))))
Label("".join(morse_keystrokes), self.x, self.y, self.w, self.h, self.font, self.font_color, ((self.x+((self.w/2)-(self.w/15)+35)), (self.y+(self.h/2)-10)))
def update(self):
if self.border != 0:
pygame.draw.rect(window, self.color, (self.x, self.y, self.w, self.h))
pygame.draw.rect(window, black, (self.x, self.y, self.w, self.h), self.border)
pygame.draw.rect(window, self.dbc, ((window_w-self.x)-(self.w/15), self.y, self.w/15, self.h))
pygame.draw.rect(window, black, ((window_w-self.x)-(self.w/15), self.y, self.w/15, self.h), self.border)
else:
pygame.draw.rect(window, self.color, (self.x, self.y, self.w, self.h))
pygame.draw.rect(window, self.dbc, ((window_w-self.x)-(self.w/15), self.y, self.w/15, self.h))
Label("DEL", self.x, self.y, self.w, self.h, self.font, self.font_color, (((window_w-self.x)-(self.w/15)+((self.w/15)/2)), (self.y+(self.h/2))))
Label("".join(morse_keystrokes), self.x, self.y, self.w, self.h, self.typing_font, self.font_color, ((self.x+((self.w/2)-(self.w/15)+35)), (self.y+(self.h/2)-10)))
def clicked(self):
mouse = pygame.mouse.get_pos()
if ((window_w-self.x)-(self.w/15)) + self.w > mouse[0] > ((window_w-self.x)-(self.w/15)) and self.y + self.h > mouse[1] > self.y:
return True
else:
return False
class Label:
def __init__(self, msg, x, y, w, h, font, font_color=black, alternate_center=None):
self.msg = msg
self.x = x
self.y = y
self.w = w
self.h = h
self.font = font
self.font_color = font_color
self.alternate_center = alternate_center
self.draw()
def render(self):
textsurface = self.font.render(self.msg, True, self.font_color)
return textsurface, textsurface.get_rect()
def draw(self):
textsurf, textrect = self.render()
if self.alternate_center == None:
textrect.center = ((self.x+(self.w/2)-3), (self.y+(self.h/2)))
else:
textrect.center = self.alternate_center
window.blit(textsurf, textrect)
pygame.display.update()
def Play_Beep(Type, box):
if Type == 1:
morse_keystrokes.append(".")
box.update()
Beep(800, 300)
elif Type == 2:
morse_keystrokes.append("_")
box.update()
Beep(800, 600)
def first_screen():
window.fill(bg_grey)
dit = Button(20, 40, 450, 250, button_grey, 2, True, "Dit")
da = Button(20, 370, 450, 250, button_grey, 2, True, "Da")
first_box = Typing_Box(150, 667, 1000, 55, button_grey, del_button_grey, 2)
back = Button(-2, 677, 80, 50, button_grey, 2, False, "Back", normalfont)
run = True
while run:
first_box.update()
for event in pygame.event.get():
if event.type == pygame.QUIT:
quit()
if event.type == pygame.MOUSEBUTTONDOWN:
if dit.clicked():
Play_Beep(1, first_box)
elif da.clicked():
Play_Beep(2, first_box)
elif first_box.clicked():
start = time()
global morse_keystrokes
morse_keystrokes = morse_keystrokes[:-1]
first_screen()
任何帮助将不胜感激, TIA
答案 0 :(得分:0)
这些文章会有所帮助。
Flickering dice image when i press my dice button.
以下是对tkinter问题的答案,但与pygame问题的答案相似。我将引用它,因为它看起来更加简洁。
画布刷新的唯一方法是为事件循环提供“重绘”事件。在您的循环中,您永远不会给事件循环一个更新的机会,因此您看不到任何更改。
快速的解决方法是调用
self.canvas.update_idletasks
,但这只是黑客,而不是适当的解决方案。制作动画的正确方法是使用事件循环进行迭代。通过将要完成的工作放在队列中(在本例中为空闲事件队列)来完成此操作。您可以使用
after
命令将内容放入此队列。您应该做的是编写一个对动画进行一次迭代的函数。本质上,将所有内容放入while循环中并将其移至函数中。然后,安排有工作要做的地方连续调用该函数。您可以在该函数中调用
after
,也可以使用单独的函数来控制动画。
答案 1 :(得分:0)
感谢您的帮助,但事实证明,我正在将屏幕更新一帧。