Reputation: 37
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
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