Python Pygame事件处理程序是否相互干扰?

Python Pygame事件处理程序是否相互干扰?,python,pygame,Python,Pygame,我正在用Python3.7制作一个游戏启动器,并使用Pygame(“pg”)库。我为可点击文本(“链接”)创建了一个类,我有一个事件处理程序来检查pg.QUIT函数 我设置了一个while循环,该循环从检查pg.QUIT的事件处理程序函数开始,然后在循环中,我有一个类函数来侦听链接是否被单击 不幸的是,当它们都能够在循环中运行时,它们相互干扰,一些输入被忽略,例如pg.MOUSEBUTTONDOWN(这在这里很重要) 我尝试过禁用事件处理程序(我只是对调用它的行进行了注释),这使它能够工作;每个

我正在用Python3.7制作一个游戏启动器,并使用Pygame(“pg”)库。我为可点击文本(“链接”)创建了一个类,我有一个事件处理程序来检查pg.QUIT函数

我设置了一个while循环,该循环从检查pg.QUIT的事件处理程序函数开始,然后在循环中,我有一个类函数来侦听链接是否被单击

不幸的是,当它们都能够在循环中运行时,它们相互干扰,一些输入被忽略,例如pg.MOUSEBUTTONDOWN(这在这里很重要)

我尝试过禁用事件处理程序(我只是对调用它的行进行了注释),这使它能够工作;每个输入都已注册。但是,我不想在对象类中检查pg.QUIT,也不想在事件处理程序中查找特定对象:我想将这些对象分开

我班上的代码如下:

(Inside TextObject class)

def link():

    for e in pg.event.get():

        if e.type == pg.MOUSEBUTTONDOWN and {mouse is over link}:

            print('click!')
def handle():

    for e in pg.event.get():

        if e.type == pg.QUIT:

            running = False
while running:

    handle()

    {update screen and draw text}

    textObject.link()

    clock.tick(fps)
我的事件处理程序中的代码如下所示:

(Inside TextObject class)

def link():

    for e in pg.event.get():

        if e.type == pg.MOUSEBUTTONDOWN and {mouse is over link}:

            print('click!')
def handle():

    for e in pg.event.get():

        if e.type == pg.QUIT:

            running = False
while running:

    handle()

    {update screen and draw text}

    textObject.link()

    clock.tick(fps)
我的while循环中的代码如下所示:

(Inside TextObject class)

def link():

    for e in pg.event.get():

        if e.type == pg.MOUSEBUTTONDOWN and {mouse is over link}:

            print('click!')
def handle():

    for e in pg.event.get():

        if e.type == pg.QUIT:

            running = False
while running:

    handle()

    {update screen and draw text}

    textObject.link()

    clock.tick(fps)
我想让程序监听pg.QUIT,如果没有,继续收听,看看链接是否被点击

当我运行它时,程序只打印“单击!”在我点击链接20次之后。这几乎是随机的

我预测这两个函数相互干扰,我可以用某种联合函数来修复它,但我真的更喜欢保持这些函数的模糊性,而不在某些文本坐标中进行硬编码,你知道吗

谢谢

另外,我使用伪代码给出了一些上下文,但我已经确认问题在于我明确编写的代码。

将所有事件处理移到主循环中。您正在丢失事件,因为某些事件正在一个循环中处理(并丢弃未处理的事件),而在另一个事件循环中也是如此,但对于其他事件类型

将事件处理扩展到代码的各个部分会使逻辑和调试更加困难。理想情况下,在单个位置处理单个逻辑项效果良好。因此,当用户输入出现问题时,只需调试用户输入部分,而不需要调试该函数、该函数和文件中的这个东西

当然,如果您需要查看按下了哪个按钮或其他什么,请编写一个函数来执行此操作,然后在单击事件处理期间调用该函数(将鼠标位置传递给它)

while running:
    # Handle user input
    for e in pg.event.get():

        if e.type == pg.QUIT:
            running = False

        elif e.type == pg.MOUSEBUTTONDOWN:
            if {mouse is over link}:
                print('click!')

     # Handle screen painting
         ...

嘿,这清理了代码很多,它的工作以及!最后我不得不重新调整对象的位置处理方式,但效果很好,谢谢!