Как я могу проверить, выпущены ли одновременно 2 ключа в Python? - PullRequest
3 голосов
/ 27 мая 2020

В python, пытаюсь получить игру с лопастями, работающими аналогично Pong. У меня есть этот код для перемещения весла внутри холста tkinter.

self.canvas.bind_all("<KeyPress-Left>", self.change_dir)
self.canvas.bind_all("<KeyPress-Right>", self.change_dir)
...
def change_dir(self, e):
   if e.keysym == "Left":
       self.x = -2
   elif e.keysym == "Right":
       self.x = 2

self.x - это скорость весла, которая также указывает направление. Однако этот код приводит к тому, что пользователю нужно всего лишь нажать кнопку один раз, и затем лопасть изменит направление. Я хочу, чтобы пользователю приходилось удерживать клавишу, чтобы он двигался. Я не могу сказать ему, чтобы он прекратил движение. У меня есть идея, но она не работает.

self.canvas.bind_all("<KeyRelease-Right><KeyRelease-Left>", self.change_dir)

Кто-нибудь знает, как я могу проверить, отпущены ли правая и левая клавиши одновременно? Спасибо!

1 Ответ

2 голосов
/ 27 мая 2020

Возможно, вы слишком обдумываете это: вы можете перемещать лопасть влево при нажатии клавиши Left и вправо при нажатии клавиши Right и игнорировать события KeyRelease.

В следующем примере кодируется поведение лопасти таким образом, что лопасть перемещается влево при нажатии клавиши Left, останавливается, когда ее отпускают, и перемещается вправо при нажатии клавиши Right.

import tkinter as tk


def move_paddle(event=None):
    dx = 0
    if event.keysym == "Left":
        dx = -1
    elif event.keysym == 'Right':
        dx = 1
    x0, y0, x1, y1 = canvas.coords(paddle)
    if x0 < 1:
        dx, x0, x1 = 0, 1, PADDLEWIDTH + 1
    elif x1 > WIDTH:
        dx, x0, x1 = 0, WIDTH - PADDLEWIDTH, WIDTH
    canvas.coords(paddle, x0+dx, y0, x1+dx, y1)        


WIDTH, HEIGHT = 100, 30
PADDLEWIDTH = 30

root = tk.Tk()
canvas = tk.Canvas(root, width=WIDTH, height = HEIGHT)
canvas.pack(expand=True, fill=tk.BOTH)

paddle = canvas.create_rectangle((10, 10), (40, 20), fill='red', outline='black')
canvas.bind_all("<KeyPress-Right>", move_paddle)
canvas.bind_all("<KeyPress-Left>", move_paddle)

root.mainloop()
...