Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 一次按两个键可沿对角线方向移动tkinter?_Python_Tkinter - Fatal编程技术网

Python 一次按两个键可沿对角线方向移动tkinter?

Python 一次按两个键可沿对角线方向移动tkinter?,python,tkinter,Python,Tkinter,如何使用2个键在画布上移动某个对象?在别人告诉我我没有做研究之前,我做了。我仍然这样问是因为我不知道他们在说什么。人们在谈论我不知道的微型状态和命令 from tkinter import * def move(x,y): canvas.move(box,x,y) def moveKeys(event): key=event.keysym if key =='Up': move(0,-10) elif key =='Down': mov

如何使用2个键在画布上移动某个对象?在别人告诉我我没有做研究之前,我做了。我仍然这样问是因为我不知道他们在说什么。人们在谈论我不知道的微型状态和命令

from tkinter import *

def move(x,y):
    canvas.move(box,x,y)

def moveKeys(event):
    key=event.keysym
    if key =='Up':
        move(0,-10)
    elif key =='Down':
    move(0,10)
    elif key=='Left':
    move(-10,0)
    elif key=='Right':
        move(10,0)

window =Tk()
window.title('Test')

canvas=Canvas(window, height=500, width=500)
canvas.pack()

box=canvas.create_rectangle(50,50,60,60, fill='blue')
canvas.bind_all('<Key>',moveKeys)
从tkinter导入*
def移动(x,y):
画布移动(框,x,y)
def移动键(事件):
key=event.keysym
如果键==“向上”:
移动(0,-10)
elif键==“向下”:
移动(0,10)
elif键==‘左’:
移动(-10,0)
elif key==“右侧”:
移动(10,0)
window=Tk()
window.title('Test')
画布=画布(窗口,高度=500,宽度=500)
canvas.pack()
box=canvas.创建一个矩形(50,50,60,60,fill='blue')
canvas.bind_all(“”,moveKeys)
有什么办法可以让我同时得到两把钥匙来移动吗?我希望使用这种格式来完成,而不是使用迷你状态。

如果您所说的“迷你状态”方法是指这个答案(),那么它实际上并不难理解

请参见以下代码的修改和注释版本,该版本遵循该理念:

from tkinter import tk

window = tk.Tk()
window.title('Test')

canvas = tk.Canvas(window, height=500, width=500)
canvas.pack()

box = canvas.create_rectangle(50, 50, 60, 60, fill='blue')

def move(x, y):
    canvas.move(box, x, y)

# This dictionary stores the current pressed status of the (← ↑ → ↓) keys
# (pressed: True, released: False) and will be modified by Pressing or Releasing each key
pressedStatus = {"Up": False, "Down": False, "Left": False, "Right": False}

def pressed(event):
    # When the key "event.keysym" is pressed, set its pressed status to True
    pressedStatus[event.keysym] = True

def released(event):
    # When the key "event.keysym" is released, set its pressed status to False
    pressedStatus[event.keysym] = False

def set_bindings():
    # Bind the (← ↑ → ↓) keys's Press and Release events
    for char in ["Up", "Down", "Left", "Right"]:
        window.bind("<KeyPress-%s>" % char, pressed)
        window.bind("<KeyRelease-%s>" % char, released)

def animate():
    # For each of the (← ↑ → ↓) keys currently being pressed (if pressedStatus[key] = True)
    # move in the corresponding direction
    if pressedStatus["Up"] == True: move(0, -10)
    if pressedStatus["Down"] == True: move(0, 10)
    if pressedStatus["Left"] == True: move(-10, 0)
    if pressedStatus["Right"] == True: move(10, 0)
    canvas.update()
    # This method calls itself again and again after a delay (80 ms in this case)
    window.after(80, animate)

# Bind the (← ↑ → ↓) keys's Press and Release events
set_bindings()

# Start the animation loop
animate()

# Launch the window
window.mainloop()
从tkinter导入tk
window=tk.tk()
window.title('Test')
canvas=tk.canvas(窗口,高度=500,宽度=500)
canvas.pack()
box=canvas.create_矩形(50,50,60,60,fill='blue')
def移动(x,y):
画布移动(框,x,y)
#此字典存储当前已按下按钮的状态(← ↑ → ↓) 钥匙
#(按下:True,释放:False)并将通过按下或释放每个键进行修改
pressedStatus={“向上”:错误,“向下”:错误,“左”:错误,“右”:错误}
def按下(事件):
#按下键“event.keysym”时,将其按下状态设置为True
按下状态[event.keysym]=真
def释放(事件):
#释放键“event.keysym”时,将其按下状态设置为False
按状态[event.keysym]=错误
def set_绑定():
#捆绑(← ↑ → ↓) 按键的按下和释放事件
对于[“上”、“下”、“左”、“右”]中的字符:
window.bind(“%char,按下)
绑定(“%char,已发布)
def animate():
#对于每个(← ↑ → ↓) 当前按下的键(如果按下状态[键]=真)
#向相应的方向移动
如果按状态[“向上”]==真:移动(0,-10)
如果按状态[“向下”]==真:移动(0,10)
如果按状态[“左”]==真:移动(-10,0)
如果按状态[“右”]==真:移动(10,0)
canvas.update()
#此方法在延迟后一次又一次地调用自身(本例中为80毫秒)
window.after(80,动画)
#捆绑(← ↑ → ↓) 按键的按下和释放事件
set_绑定()
#启动动画循环
制作动画()
#打开窗口
window.mainloop()

您无法使用指定的格式执行此操作。tkinter中的事件处理程序将始终对单次按键作出响应。如果约束是您不能使用“迷你状态”,那么你就做不到。你希望13岁的孩子的大脑能够处理这个问题吗?好吧,你可以先运行代码,看看它是否做了你想做的事情。然后用它一次换一行,直到你对结果满意为止:)