【问题标题】:Getting position of user click in pygame在pygame中获取用户点击的位置
【发布时间】:2016-09-21 20:28:59
【问题描述】:

我在 tkinter 的框架中嵌入了一个 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 表面,则在第二次单击按钮时,所有这些单击的坐标将作为批处理打印出来。

【问题讨论】:

    标签: python python-2.7 tkinter pygame pygame-surface


    【解决方案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 事件的更多信息,请参阅docs

    这就是你在 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 documentation找到。

    我建议不要break 放在 pygame 的事件循环中。这样做会使所有其他事件都无法处理,这意味着程序可能不响应某些事件。

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

    【讨论】:

      【解决方案2】:

      首先我不得不说我对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”是鼠标左键的事件标识符。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多