Tkinter Python:使用OOP同时移动多个小部件对象?

Tkinter Python:使用OOP同时移动多个小部件对象?,python,tkinter,tkinter-canvas,Python,Tkinter,Tkinter Canvas,我是一名python初学者,正在使用Tkinter创建2048游戏。到目前为止,我一直在努力使多个瓷砖具有相同的运动,遵循相同的一般行为。为了做到这一点,我定义了一个类,Tile,它定义了每个Tile可以如何移动。我的想法是,我可以添加几个平铺对象,它们将一致移动,就像2048年一样。然而,问题是每当我按下箭头键时,Tkinter画布上的每个磁贴都会随机移动。如果我将“”箭头键组合三次,它将分别移动三个磁贴,随机选择要移动的下一个磁贴 我如何解决这个问题,只需按一次箭头键即可移动画布上的所有瓷砖

我是一名python初学者,正在使用Tkinter创建2048游戏。到目前为止,我一直在努力使多个瓷砖具有相同的运动,遵循相同的一般行为。为了做到这一点,我定义了一个类,Tile,它定义了每个Tile可以如何移动。我的想法是,我可以添加几个平铺对象,它们将一致移动,就像2048年一样。然而,问题是每当我按下箭头键时,Tkinter画布上的每个磁贴都会随机移动。如果我将“”箭头键组合三次,它将分别移动三个磁贴,随机选择要移动的下一个磁贴

我如何解决这个问题,只需按一次箭头键即可移动画布上的所有瓷砖

这是我定义的画布:

from tkinter import * 
from tkinter.ttk import *

root = Tk()

w = 300
h = 300
my_canvas = Canvas(root, width=w, height=h, bg="white")
在这段代码下面,我定义了我的类,它在画布上添加了一个矩形,并定义了四个方向的运动

class Tile:
    def __init__(self, starting_x, starting_y):
        self.root = root
        self.x = 0
        self.y = 0
        self.starting_y = starting_y
        self.starting_x = starting_x
    self.tile = my_canvas.create_rectangle(starting_x, starting_y, starting_x + 25, starting_y + 25,fill="black")
    my_canvas.pack()



    self.movement()

def movement(self):
    root.bind("<Left>", self.left)
    root.bind("<Right>", self.right)
    root.bind("<Up>", self.up)
    root.bind("<Down>", self.down)

    my_canvas.move(self.tile, self.x, self.y)
    

    self.coordinates = []
    self.coordinates = my_canvas.coords(self.tile)
    if self.coordinates[0] == 0: self.x = 0
    if self.coordinates[2] == w: self.x = 0
    if self.coordinates[1] == 0: self.y = 0
    if self.coordinates[3] == h: self.y = 0
    my_canvas.after(1, self.movement)

def left(self, e):
    self.x = -1
    self.y = 0
    if self.coordinates[0] == 0:
        self.x = 0
        self.y = 0
def right(self, e):
    self.x = 1
    self.y = 0
    if self.coordinates[2] == w:
        self.x = 0
        self.y = 0
def up(self, e):
    self.x = 0
    self.y = -1
    if self.coordinates[1] == 0:
        self.x = 0
        self.y = 0
def down(self, e):
    self.x = 0
    self.y = 1
    if self.coordinates[3] == h:
        self.x = 0
        self.y = 0
如您所见,所有三个磁贴都会输出,但它们不会同步移动


提前感谢您的帮助

问题是,movement中的命令
my_canvas.move(self.tile,self.x,self.y)
不知道要移动哪个tile。 为了使该程序正常工作,您必须保留一组可从
movement()
函数访问的磁贴

root = Tk()
w = 300
h = 300
my_canvas = Canvas(root, width=w, height=h, bg="white")
root.bind("<Left>", left)
root.bind("<Right>", right)
root.bind("<Up>", up)
root.bind("<Down>", down)


global tilelist
tilelist = []
tilelist.append(Tile(my_canvas,0,0))
tilelist.append(Tile(my_canvas,50,50))
tilelist.append(Tile(my_canvas,100,100))
具体地说,我建议创建一个全球瓷砖列表,这些瓷砖能够自行移动,并且准确地知道它们位于什么画布上:

class Tile:
    def __init__(self, canv, starting_x, starting_y):
        self.root = root
        self.canvas = canv
        self.x = 0
        self.y = 0
        self.starting_y = starting_y
        self.starting_x = starting_x
        self.idx = canv.create_rectangle(starting_x, starting_y, starting_x + 25, starting_y + 25,fill="black")
        canv.update()

    def moveleft(self): ## Add more methods for other movements
        if self.starting_x>25:
            self.starting_x -= 25
            self.canvas.move(self.idx,self.starting_x,self.starting_y)    
然后,您可以创建小部件和可能在画布上移动的平铺对象列表。在函数的开头而不是内部指定绑定

root = Tk()
w = 300
h = 300
my_canvas = Canvas(root, width=w, height=h, bg="white")
root.bind("<Left>", left)
root.bind("<Right>", right)
root.bind("<Up>", up)
root.bind("<Down>", down)


global tilelist
tilelist = []
tilelist.append(Tile(my_canvas,0,0))
tilelist.append(Tile(my_canvas,50,50))
tilelist.append(Tile(my_canvas,100,100))

这将移动所有磁贴。

问题是,移动中的命令
my_canvas.move(self.tile,self.x,self.y)
不知道要移动哪个磁贴。 为了使该程序正常工作,您必须保留一组可从
movement()
函数访问的磁贴

root = Tk()
w = 300
h = 300
my_canvas = Canvas(root, width=w, height=h, bg="white")
root.bind("<Left>", left)
root.bind("<Right>", right)
root.bind("<Up>", up)
root.bind("<Down>", down)


global tilelist
tilelist = []
tilelist.append(Tile(my_canvas,0,0))
tilelist.append(Tile(my_canvas,50,50))
tilelist.append(Tile(my_canvas,100,100))
具体地说,我建议创建一个全球瓷砖列表,这些瓷砖能够自行移动,并且准确地知道它们位于什么画布上:

class Tile:
    def __init__(self, canv, starting_x, starting_y):
        self.root = root
        self.canvas = canv
        self.x = 0
        self.y = 0
        self.starting_y = starting_y
        self.starting_x = starting_x
        self.idx = canv.create_rectangle(starting_x, starting_y, starting_x + 25, starting_y + 25,fill="black")
        canv.update()

    def moveleft(self): ## Add more methods for other movements
        if self.starting_x>25:
            self.starting_x -= 25
            self.canvas.move(self.idx,self.starting_x,self.starting_y)    
然后,您可以创建小部件和可能在画布上移动的平铺对象列表。在函数的开头而不是内部指定绑定

root = Tk()
w = 300
h = 300
my_canvas = Canvas(root, width=w, height=h, bg="white")
root.bind("<Left>", left)
root.bind("<Right>", right)
root.bind("<Up>", up)
root.bind("<Down>", down)


global tilelist
tilelist = []
tilelist.append(Tile(my_canvas,0,0))
tilelist.append(Tile(my_canvas,50,50))
tilelist.append(Tile(my_canvas,100,100))
这将移动所有的瓷砖