如何在Tkinter的Canvas中对角移动对象?

时间:2019-03-15 18:45:47

标签: python python-3.x tkinter tkinter-canvas

每当有人同时按下两个箭头键时,如何使对象在Tkinter画布中对角移动? 我正在创建一个简单的动画,但它只能向上,向下,向左或向右移动。 这是我的代码:

from tkinter import *
import time
root = Tk()
canvas = Canvas(root, width=800, height=800)
square = canvas.create_rectangle(0,0,50,50,outline='red')


def right(event):
 for i in range(5):
  canvas.move(ball,1,0)
  canvas.update()

def left(event):
 for i in range(5):
  canvas.move(ball,-1,0)
  canvas.update()

def down(event):
 for i in range(5):
  canvas.move(ball,0,1)
  canvas.update()

def up(event):
 for i in range(5):
  canvas.move(ball,0,-1)
  canvas.update()

root.bind('<Right>', right)
root.bind('<Left>', left)
root.bind('<Down>', down)
root.bind('<Up>', up)

canvas.pack()
root.mainloop()

1 个答案:

答案 0 :(得分:0)

tkinter中的按键是个别事件;除了键修饰符(shift,control和alt)外,您不能将动作绑定到“同时”按下两个键。

您可以做的是将NE,SE,NW,SW分配到不同的键。

我将动作控制分配给了以下按键:

Q W E
A   D
Z X C 

其他更改:

  • 最佳做法是避免星星的进入。
  • 不需要每次update画布; move已经在画布上重新绘制了更改。
  • 我为对象分配了“速度”,在循环中删除了move的重复调用,并使用速度来确定移动的距离。
  • 我将square重命名为ball,因此定义了ball

代码:

import tkinter as tk


root = tk.Tk()
canvas = tk.Canvas(root, width=800, height=800)
ball = canvas.create_rectangle(0, 0, 50, 50, outline='red')

speed = 5

def w(event):
    canvas.move(ball, speed, 0)

def e(event):
    canvas.move(ball, -speed, 0)

def s(event):
    canvas.move(ball, 0, speed)

def n(event):
    canvas.move(ball, 0, -speed)

def nw(e):
    canvas.move(ball, speed, -speed)

def sw(e):
    canvas.move(ball, speed, speed)

def ne(e):
    canvas.move(ball, -speed, -speed)

def se(e):
    canvas.move(ball, -speed, speed)

root.bind('<KeyPress-w>', n)
root.bind('<KeyPress-e>', nw)
root.bind('<KeyPress-d>', w)
root.bind('<KeyPress-c>', sw)
root.bind('<KeyPress-x>', s)
root.bind('<KeyPress-z>', se)
root.bind('<KeyPress-a>', e)
root.bind('<KeyPress-q>', ne)

canvas.pack()
root.mainloop()