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