Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.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
tkinter(python):将类方法分配给键_Python_Tkinter_Canvas_Move_Tkinter Canvas - Fatal编程技术网

tkinter(python):将类方法分配给键

tkinter(python):将类方法分配给键,python,tkinter,canvas,move,tkinter-canvas,Python,Tkinter,Canvas,Move,Tkinter Canvas,在我的简单代码中,一个红色的球沿直线下落(这是有效的)。当我按下向右箭头键时,我希望球也朝着正确的方向移动。然而,这是行不通的。我做错了什么 from tkinter import * root = Tk() canvas = Canvas(root, height=400, width=500, background='black') canvas.pack() class Bird: def __init__(self, canvas, coords): se

在我的简单代码中,一个红色的球沿直线下落(这是有效的)。当我按下向右箭头键时,我希望球也朝着正确的方向移动。然而,这是行不通的。我做错了什么

from tkinter import *

root = Tk()

canvas = Canvas(root, height=400, width=500, background='black')
canvas.pack()


class Bird:
    def __init__(self, canvas, coords):
        self.canvas = canvas
        self.coords = coords
        self.bird = canvas.create_rectangle(coords, fill='red')

    def gravity(self):
        self.canvas.move(self.bird, 0, 10)
        self.canvas.after(200, self.gravity)

    def moveRight(self, event):
        self.canvas.move(self.bird, 10, 0)
        self.canvas.after(200, self.moveRight)

bird = Bird(canvas, (100, 100, 110, 110))

bird.gravity()

canvas.bind('<Right>', bird.moveRight)

root.mainloop()
从tkinter导入*
root=Tk()
画布=画布(根,高度=400,宽度=500,背景为黑色)
canvas.pack()
类鸟:
定义初始化(自我、画布、坐标):
self.canvas=画布
self.coords=coords
self.bird=canvas.create_矩形(坐标,fill='red')
def重力(自):
self.canvas.move(self.bird,0,10)
self.canvas.after(200,self.gravity)
def moveRight(自身、事件):
self.canvas.move(self.bird,10,0)
self.canvas.after(200,self.moveRight)
鸟=鸟(画布,(100100110110))
鸟重力
canvas.bind(“”,bird.moveRight)
root.mainloop()
我还有一个问题:

是否可以为整个画布调用此“after”函数或类似函数,而不是分别调用这两个方法

如果你看到我的代码有任何其他缺陷,请告诉我


谢谢

必须将正确的键绑定到类内的画布,并在画布上设置焦点:

from tkinter import *

root = Tk()

canvas = Canvas(root, height=400, width=500, background='black')
canvas.pack()


class Bird:
    def __init__(self, canvas, coords):
        self.canvas = canvas
        self.coords = coords
        self.bird = canvas.create_rectangle(coords, fill='red')
        self.canvas.bind('<Right>', self.moveRight)
        self.canvas.focus_set()

    def gravity(self):
        self.canvas.move(self.bird, 0, 10)
        self.canvas.after(200, self.gravity)

    def moveRight(self, event=None):
        self.canvas.move(self.bird, 10, 0)
        self.canvas.after(200, self.moveRight)


bird = Bird(canvas, (100, 100, 110, 110))

bird.gravity()

root.mainloop()
从tkinter导入*
root=Tk()
画布=画布(根,高度=400,宽度=500,背景为黑色)
canvas.pack()
类鸟:
定义初始化(自我、画布、坐标):
self.canvas=画布
self.coords=coords
self.bird=canvas.create_矩形(坐标,fill='red')
self.canvas.bind(“”,self.moveRight)
self.canvas.focus_set()
def重力(自):
self.canvas.move(self.bird,0,10)
self.canvas.after(200,self.gravity)
def moveRight(自身,事件=无):
self.canvas.move(self.bird,10,0)
self.canvas.after(200,self.moveRight)
鸟=鸟(画布,(100100110110))
鸟重力
root.mainloop()

您面临的问题是绑定键盘事件,但只有当绑定的小部件具有键盘焦点时,事件才能工作。您可以使用
focus\u set()
为画布提供键盘焦点:

是否可以为整个画布调用此“after”函数或类似函数,而不是分别调用这两个方法

对。您的绑定可以调用您想要的任何函数。如果希望有多个对象,并且希望所有对象同时移动,则可以从函数中移动所有对象

首先,从
moveRight
中删除对
after
的调用。接下来,定义一个全局函数,为每个对象调用
moveRight
。例如:

def move_them_all():
    bird1.moveRight()
    bird2.moveRight()
    something_else.moveRight()
    self.canvas.after(1000, move_them_all)
...
canvas = Canvas(root, height=400, width=500, background='black')
...
canvas.bind('<right>', move_them_all)
def move_them_all():
bird1.moveRight()
bird2.moveRight()
还有别的事
self.canvas.after(1000,全部移动)
...
画布=画布(根,高度=400,宽度=500,背景为黑色)
...
画布。绑定(“”,移动它们全部)

什么是“不工作”?球打错方向了吗?你有错误吗?这只鸟按下向右箭头键没有反应,它只是掉了下来。但是,我没有收到错误消息OK,所以问题不在于绑定本身。这只是焦点之一。只有当具有绑定的小部件具有键盘焦点时,对键的绑定才有效。“必须将正确的键绑定到类内的画布上。”这不是真的。可以在类外进行绑定。是的,你是对的,这是可能的;我觉得它在这里更有意义。谢谢你,它现在正在工作!但是当我按下右键时(仍然向下移动),我必须改变什么,使鸟只向右移动一步?现在的结果是对角线运动…很高兴我能帮上忙。由于重力的作用,鸟儿呈对角线移动(每200毫秒更新一次向下的位置);你必须停止这样做,因为这只鸟只能侧着身子飞。试一试(你必须弄清楚你想要这只鸟的确切行为),如果你遇到麻烦,再问另一个问题;好的,我想我的问题表达得不够准确,对不起。我想让这只鸟按以下方式移动:在每个时间间隔内,它应该自动向下移动定义的距离。当按下箭头键时,该鸟还应向右移动一步。所以问题是,如果你知道我的意思,我希望两个动作都在同一个时间间隔内发生…@Kubi:所有这些都是可能的。
def move_them_all():
    bird1.moveRight()
    bird2.moveRight()
    something_else.moveRight()
    self.canvas.after(1000, move_them_all)
...
canvas = Canvas(root, height=400, width=500, background='black')
...
canvas.bind('<right>', move_them_all)