Search code examples
pythontkinterkeypress

tkinter using two keys at the same time


So tkinker can only use one key at a time. I am unable to say move to the left and up at the same time with this example. How would i go about doing it if I wanted to?

import tkinter
root = tkinter.Tk()
root.title('test')
c= tkinter.Canvas(root, height=300, width=400)
c.pack()
body = c.create_oval(100, 150, 300, 250, fill='green')

def key(event):
    OnKeyDown(event.char)
    print(event.char)

def MoveLeft(evenr)
    c.move(body, -10, 0)

def MoveRight(event):
    c.move(body, 10, 0)

def MoveUp(event):
    c.move(body, 0, 10)

def MoveDown(event):
    c.move(body, 0, -10)

root.bind('<KeyPress-Left>', MoveLeft)
root.bind('<KeyPress-Right>', MoveRight)
root.bind('<KeyPress-Up>', MoveUp)
root.bind('<KeyPress-Down>', MoveDown)

Personally I would also prefer to not have to "bind" my keys to functions as well as I also would like to use the keys to preform other actions (ie: make it move faster if I hold shift and up at the same time) Can tinker recognize when you pre-assign two keys or hold two keys at the same time?


Solution

  • Like this :

    from Tkinter import *
    
    root = Tk()
    var = StringVar()
    a_label = Label(root,textvariable = var ).pack()
    
    history = []
    def keyup(e):
        print e.keycode
        if  e.keycode in history :
            history.pop(history.index(e.keycode))
    
            var.set(str(history))
    
    def keydown(e):
        if not e.keycode in history :
            history.append(e.keycode)
            var.set(str(history))
    
    frame = Frame(root, width=200, height=200)
    frame.bind("<KeyPress>", keydown)
    frame.bind("<KeyRelease>", keyup)
    frame.pack()
    frame.focus_set()
    root.mainloop()
    

    Don't forget toggle keys because got a little mix status.