Namper
Namper

Reputation: 37

How to catch two key events in Tkinter

So I'm making small glow hokey game in tkinter and i faced wall.Compiler only catches the one key event and if second user presses key ,1st users movement ll stop. do you guys know how to slove this problem?

here is code:

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()

Upvotes: 1

Views: 156

Answers (1)

furas
furas

Reputation: 142681

In other modules - like PyGame - you use variables like w_pressed = True/False and up_pressed = True/False which you change when key is pressed or released. Next you create mainloop which checks this variables to move objects. Because tkinter has already mainloop so you can use after() to execute periodically own function which will check w_pressed/up_pressed and move objects.

Simple (working) example:

It checks w and up and displays True/False for both keys.

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()

Upvotes: 3

Related Questions