0

我在 tkinter 的 aa 框架中嵌入了一个 pygame 窗口。在另一个框架中,我有一个按钮,单击时会调用以下函数:

def setStart():
global start
# set start position
for event in pygame.event.get():
    if event.type == pygame.MOUSEBUTTONUP:
        start = event.pos
        print("start",start)
        break

我打算让程序在单击按钮后打印用户在 pygame 表面上单击的位置的位置。但是,在第一次单击按钮和随后单击 pygame 表面时,没有输出。在相应的第二次点击pygame表面之前第二次点击按钮,python打印出如下输出:

('开始', (166, 115))

在点击pygame表面后,我怎样才能让它给我一个结果?当我有两个单独的 tkinter 和 pygame 窗口时,我遇到了同样的问题,因此将 pygame 嵌入 tkinter 不太可能是问题的原因。

编辑:经过进一步测试,如果按下按钮然后多次单击 pygame 表面,则在第二次单击按钮时,所有这些单击的坐标都将作为批处理打印出来。

4

2 回答 2

1

在 pygame 中,最基本的形式是:

import pygame
pygame.init()

screen = pygame.display.set_mode((100, 100))
clock = pygame.time.Clock()

while True:
    clock.tick(60)

    for event in pygame.event.get():
        if event.type == pygame.MOUSEBUTTONUP:  # or MOUSEBUTTONDOWN depending on what you want.
            print(event.pos)
        elif event.type == pygame.QUIT:
            quit()

    pygame.display.update()

有关如何处理 pygame 事件的更多信息可以在文档中找到。

以下是您在 tkinter 中的操作方式:

try:
    import tkinter as tk  # Python 3
except ImportError:
    import Tkinter as tk  # Python 2

root = tk.Tk()

def print_pos(event):
    print(event.x, event.y)

root.bind("<Button-1>", print_pos)
root.mainloop()

更多关于 tkinter 事件的信息可以在effbots 文档中找到。

我建议不要在pygamebreak中添加事件循环。这样做会使所有其他事件都未处理,这意味着程序可能不响应某些事件。

很遗憾,鉴于您提供给我们的代码,您的“编辑:[...]”是错误的。我对代码没有问题;它打印了我释放鼠标按钮的位置,并且总是只打印一个位置。因此,您的代码中的其他地方必须存在逻辑错误。

于 2016-09-23T12:37:14.667 回答
0

首先我不得不说我对pygame一无所知。但是,如果您已经在使用 Tkinter,我也许可以帮助您:我会定义一个新函数(我们称之为 mouse_click)。在按钮单击功能中,我会将新功能绑定到游戏的表面。在新功能中,我打印出当前鼠标位置:

def button_click(self):
    game_surface.bind("<Button-1>", self.mouse_click)

def mouse_click(self, event):
    print "X:", event.x
    print "Y:", event.y

我希望这是有帮助的。请注意,您应该修改此代码以使其在您的程序中工作(使用正确的小部件名称等)。顺便说一句,“Button-1”是鼠标左键的事件标识符。

于 2016-09-22T20:28:59.853 回答