悬停仅适用于第一个按钮

时间:2017-03-23 02:15:08

标签: python button pygame sdl 2d-games

在我的代码中:

import subprocess
full_cmd = "external command"
p = subprocess.Popen(full_cmd, shell=True, env=self._env)
p.communicate()

我拨打的第一个按钮(“播放”按钮)完美运行(我还不关心这些动作,此刻对我来说重要的是徘徊)。 但是第二个按钮非常小(当我按顺序调用按钮时,第一个被调用的按钮总是很完美)

1 个答案:

答案 0 :(得分:0)

第一件事:“框架”之间没有暂停 - 即检查程序中的事件 - 所以一切都尽可能快地完成计算机可以携带它,使用100%的CPU - 更糟糕的选择。正确的事情是在调用pygame.display.update后等待几十毫秒 - 在此之后立即拨打pygame.time.delay(30)之类的电话。

代码到达那里,虽然设计不好,几乎可以工作,但是有一件事 - 当你调用pygame.event.get时,它会获取队列中的所有事件。因此,有一些竞争条件n在主循环上调用get选择所有事件 - 但是由于代码的无暂停性质,第二次调用选择了一些MOUSEMOTION事件,{{{ 1}}第一个按钮的方法。

当你放置我上面建议的暂停时,即使是第一个按钮的悬停也应该停止 - 因为它只是偶然的工作方式,帧之间的暂停将解决这个机会。

现在,你有两个选择 - 如果你想继续检查对象代码中的事件,他们不应该自己调用display - 而是在每一帧上对它进行一次调用,然后分配结果变量 - 它们将该变量作为参数传递给所有应该处理事件的地方:

在菜单屏幕上输入代码:

pygame.events.get

在文本课上:

while menu:  #
    #the loop
    events = pygame.event.get()
    for event in events:
         ...
    gameWindow.fill(green)
    menu_txt.display(events)
    Play_txt.display(events)
    Quit_txt.display(events)

这应该可以解决您的问题和设计上的很多问题。但是,请注意,如果鼠标实际移动,这些只会突出显示您的文本 - 如果它正在悬停,但没有移动,则不会生成MOUSEMOTION事件。因此,您可以检查鼠标位置本身是否在按钮rect内,而不是检查事件 - 您直接获得鼠标位置,而不是依赖于事件。此外,在此期间,您可能更喜欢使用Pygame的矩形计算函数,而不是眼睛def display(self, events): ... if self.button: # Please, just stop checking truthiness doing "x == True" self.Textrect.topleft = (self.position) gameWindow.blit(self.Textsurface, self.Textrect) for event in events: if event.type == pygame.MOUSEMOTION: 表达式的令人不快的颜色。
self.position[0] < event.pos[0] < self.second_x_pos and self.position[1] < event.pos[1] < self.second_y_pos

__init__

self.rect = pygame.Rect(self.pos + tuple(Textrect[2:]) 上检查指针是否在rect中:

if