2016-11-27 6 views
1

Итак, я делаю маленькую игру hokey glow в tkinter, и я столкнулся с wall.Compiler только ловит одно ключевое событие, и если второй пользователь нажимает клавишу, 1-е движение пользователей останавливается. вы, ребята, знаете, как решить эту проблему?Как поймать два ключевых события в Tkinter

здесь код:

from tkinter import* 
w=600 
h=300 
padis_sigane=10 
padis_sigrdze=75 
padis_sichqare=5 
root=Tk() 
root.geometry("{}x{}".format(w,h)) 
root.resizable(False,False) 
c=Canvas(root,width=w,height=h,bg="green") 
c.create_line(w//2,0,w//2,h,width=10,fill="white") 
c.create_line(padis_sigane,0,padis_sigane,h,width=2,fill="white") 
c.create_line(w-padis_sigane,0,w-padis_sigane,h,width=2,fill="white") 
c.create_oval(w//2-w//30,h//2-w//30,w//2+w//30,h//2+w//30,fill="white",outline="white") 
class chogani: 
    def __init__(self,x,y): 
     self.x=x 
     self.y=y 
     self.pad=c.create_rectangle(self.x,self.y,self.x+padis_sigane,self.y+padis_sigrdze,fill="lightblue",outline="white") 
    def shxuili(self): 

     if c.coords(self.pad)[3]>=h: 
      c.coords(self.pad,self.x,h-padis_sigrdze,self.x+padis_sigane,h) 

     elif c.coords(self.pad)[1]<=0: 
      c.coords(self.pad,self.x,0,self.x+padis_sigane,padis_sigrdze) 


x=0;y=0 #Momavalshi 
pad1=chogani(0,1) 
pad2=chogani(w-padis_sigane,1) 
def K(event): 
    pad1.shxuili() 
    pad2.shxuili() 
    if event.keysym=='w': 
     c.move(pad1.pad,0,-padis_sichqare) 
    elif event.keysym=='s': 
     c.move(pad1.pad,0,padis_sichqare) 
    elif event.keysym=='Up': 
     c.move(pad2.pad,0,-padis_sichqare) 
    elif event.keysym=='Down': 
     c.move(pad2.pad,0,padis_sichqare) 
def R(event): 
    print("shen aushvi ", event.char) 
root.bind("<KeyPress>",K) 
root.bind("<KeyRelease>",R) 
root.focus_set() 
c.pack() 
root.mainloop() 

ответ

2

В других модулей - как PyGame - использовать переменные, как и up_pressed = True/False, которые вы изменяете, когда клавиша нажата или отпущена. Затем вы создаете mainloop, который проверяет эти переменные для перемещения объектов. Потому что tkinter уже mainloop, поэтому вы можете использовать after() для выполнения периодически собственной функции, которая будет проверять w_pressed/up_pressed и перемещать объекты.

Простой (рабочий) пример:

Он проверяет w и up и отображает True/False для обоих ключей.

import tkinter as tk 

# --- functions --- 

def pressed(event): 
    global w_pressed 
    global up_pressed 

    if event.keysym == 'w': 
     w_pressed = True 
    elif event.keysym == 'Up': 
     up_pressed = True 

def released(event): 
    global w_pressed 
    global up_pressed 

    if event.keysym == 'w': 
     w_pressed = False 
    elif event.keysym == 'Up': 
     up_pressed = False 

def game_loop(): 

    # use keys 
    print(w_pressed, up_pressed) 

    # run again after 500ms 
    root.after(500, game_loop) 

# --- data --- 

w_pressed = False 
up_pressed = False 

# --- main --- 

root = tk.Tk() 

root.bind("<KeyPress>", pressed) 
root.bind("<KeyRelease>", released) 

# start own loop 
game_loop() 

root.mainloop() 

 Смежные вопросы

  • Нет связанных вопросов^_^