调整窗口大小后的kivy网格布局子位置



我是kivy的新手,我正在尝试制作一个8puzzle游戏,我的问题是,在网格布局中移动数字(使用按钮或标签)后(使用动画calss移动按钮),直到调整窗口大小都没有问题!调整窗口大小后,每个按钮或标签都将位于其初始位置:-/那么,为什么网格布局的孩子在挤压窗户后会回到最初的位置呢?我该怎么解决这个问题?

python code :
class Cubes(Button):
    #value=StringProperty('0')
    pos_i=NumericProperty(0)
    pos_j=NumericProperty(0)

class Puzzle(GridLayout):
    def __init__(self,**kwargs):
        super(Puzzle,self).__init__()
        self._keyboard = Window.request_keyboard(None,self)
        print("Tsfsdfsdfdsfsdfdsf")
        if not self._keyboard:
            return
        game =[
        [1,2,3],
        [4,5,6],
        [7,8,"-"]
        ]
        for i in range (3):
            for j in range (3):
                self.add_widget(Cubes(text=str(game[i][j]),pos_i=i,pos_j=j))

        self._keyboard.bind(on_key_down=self.move)
        self.wait=False
        self._index=-1
        self._solution=[]

    def move(self, keyboard, keycode, text,modifires):

        pos=-1
        for i in range(9):
            if self.children[i].text=="-":
                pos=self.children[i].pos
                self._index=i

        #print (self.children[self._index].pos)     
        if keycode[1]=="up":
            if Expand(Node(self.generatePuzzleTable())).CanGoUp():
                for m in range(9):
                    if self.children[m].pos_i==self.children[self._index].pos_i-1:
                        if self.children[m].pos_j==self.children[self._index].pos_j:
                            self.replace(self.children[m].pos,self.children[self._index].pos,m)
                            break
        if keycode[1]=="right":
            if Expand(Node(self.generatePuzzleTable())).CanGoRight:
                for m in range(9):
                    if self.children[m].pos_i==self.children[self._index].pos_i:
                        if self.children[m].pos_j==self.children[self._index].pos_j+1:
                            self.replace(self.children[m].pos,self.children[self._index].pos,m)
                            break
        if keycode[1]=="down":
            if Expand(Node(self.generatePuzzleTable())).CanGoDown():
                for m in range(9):
                    if self.children[m].pos_i==self.children[self._index].pos_i+1:
                        if self.children[m].pos_j==self.children[self._index].pos_j:
                            self.replace(self.children[m].pos,self.children[self._index].pos,m)
                            break                   
        print (keycode[1])
        if keycode[1]=="enter":
            self.ans()
        if keycode[1]=="left":
            if Expand(Node(self.generatePuzzleTable())).CanGoLeft():
                for m in range(9):
                    if self.children[m].pos_i==self.children[self._index].pos_i:
                        if self.children[m].pos_j==self.children[self._index].pos_j-1:
                            self.replace(self.children[m].pos,self.children[self._index].pos,m)
                            break
        if keycode[1]=="spacebar":
            print ("what the fuck ?!? ",keycode[1])
            self.solve()

    def replace(self,pos,pos1,NodeIndex):
        anime=Animation(pos=(float(pos[0]),float(pos[1])),d=0.2,t="out_cubic")#.start(self.children[0])
        anime.start(self.children[self._index])
        anime2=Animation(pos=(float(pos1[0]),float(pos1[1])), d=0.2,t="out_cubic")#.start(self.children[1])
        anime2.start(self.children[NodeIndex])
        ti=self.children[self._index].pos_i
        tj=self.children[self._index].pos_j
        self.children[self._index].pos_i,self.children[self._index].pos_j=self.children[NodeIndex].pos_i,self.children[NodeIndex].pos_j
        self.children[NodeIndex].pos_i,self.children[NodeIndex].pos_j=ti,tj

kivy代码:

<Cubes>:
    background_color: 1,1,1,1

<Puzzle>:
    cols: 3
    spacing: 2
    size: (300, 300)

BoxLayout:
    canvas.before:
        Color:
            rgb: (0.7, 0.3, .4)
        Rectangle:
            pos: (self.x, self.y)
            size: (self.width, self.height)
    size: (600, 600)
    AnchorLayout:
        Puzzle:
            center_x: root.center_x
            center_y: root.center_y*2/3

在这张图中,我将短划线按钮移到了左上角,但我调整了窗口的大小它将处于初始位置(右下角)

GridLayout(或任何Layout)负责定位其子窗口小部件,因此在每次重新调整大小(以及其他有意义的事件)时,布局将从头开始定位窗口小部件(这是让您恼火的行为)。

在GridLayout的情况下,重要的是网格的子级的顺序。。。

要解决您的问题,您有两个选项:

1) 动画完成后,将"-"小部件与网格子列表中的另一个小部件交换。

2) 使用类似的东西https://github.com/inclement/sparsegridlayout它允许您为每个小部件(网格条目)指定的(i,j)

我希望这能让事情变得更清楚一点

最新更新