先说我的思路和改动
我把main.py里的disappear_message移到Message类里,并通过text.setter修饰的text函数触发,相应的,我删掉了main.py里所有对disappear_message的调用
接着我对disappear_message的逻辑进行了修改。我猜测你想要的是在文字条更新时不要删除文字,所以我将sleep(delay)改成循环来实现,我设置了self.timer变量,在text.setter被触发时,通过重置timer来实现中断delete_message线程,或者说重启delete_message线程的效果
这是改动后的Message类:class Message(pygame.sprite.Sprite):
def __init__(self, text, pos):
pygame.sprite.Sprite.__init__(self)
self._text = text
self.running = True
self.flush(pos)
self.timer = 50
@property
def text(self):
return self._text
@text.setter
def text(self, text):
pos = self.rect.topright
self._text = text
self.flush(pos)
if self.timer == 50:
Thread(target=self.disappear_message).start()
else:
self.timer = 50
def flush(self, pos):
self.image = Config.font.render(self._text, False, (255, 255, 255))
self.rect = self.image.get_rect()
self.rect.topright = pos
def disappear_message(self, delay: number = 1, interval: number = 0.09):
timer_interval = delay / self.timer
while self.timer >= 0:
sleep(timer_interval)
self.timer -= 1
while self.text and self.running:
self.text = self.text[:-1]
sleep(interval)
有两个小问题,第一个,移到Message类后,delete_message访问不到running,我把running同步到了Message类里: if event.type == pygame.QUIT:
running = False
message.running = False
第二个,我注意到你的delete_message有两个参数delay和interval,你可能想要在之后自定义等待的时间和文字消失的时间间隔,但我的版本里没有实现这个,所以可能对后续开发有点阻碍。我暂时也没想出能怎么解决,就先这样吧 |