windows 如何在Kivy中将GridLayout居中显示在屏幕中间?

xuo3flqw  于 2023-02-05  发布在  Windows
关注(0)|答案(1)|浏览(187)

我有一个8列的网格布局,我添加了64个按钮。(所以是8x8)。我希望按钮总是二次的,所以我在spot_init()函数中做了这个。
这一切都工作得很好。当我把窗口变小或变大时,屏幕的其余部分会变黑,网格布局停留在角落里。但我希望它居中。
对于leftright来说,它工作得非常好,但是当我试着把它应用到updown上时,它会做一些奇怪的事情,我真的无法解释。
我(也许)发现了一些事情:

  • 当我像现在这样做的时候,但是在代码中,由于某种原因,Y坐标是它应该达到的3倍。
  • 当我把它除以3,它会变成7倍...
  • 如果我在.kv或.py文件中执行此操作,它不会发生变化
  • 不使用RelativeLayout移动GridLayout也不起作用(几乎发生同样的事情)
  • 其他提问者似乎也有同样的问题(或类似的问题),但他们的修复没有帮助我。

我的.kv文件:

RMainBoard:

<MainBoard>:
    cols:8
    # height: self.minimum_height
    # size_hint_y: None
    # size_hint_x: None

<RMainBoard@RelativeLayout>:
    pos:(self.width/2-min(self.width/8,self.height/8)*4,self.height/2-(min(self.width/8,self.height/8))*4)
    MainBoard:

我的.py文件:

#resize window (NEEDS TO BE AT VERY TOP)
from kivy.config import Config
Config.set('graphics', 'width', '600')
Config.set('graphics', 'height', '600')

from kivy.app import App
from kivy.core.window import Window
from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.metrics import dp
from kivy.properties import NumericProperty

class MainBoard(GridLayout):
    spots = []
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.spot_init()
        
    def on_size(self,*args):
        for spot in self.spots:
            spot_size = min(self.width/8,self.height/8)
            print(min(self.width/8,self.height/8))
            spot.height = spot_size
            spot.width = spot_size

    def spot_init(self):
        for i in range(0,64):
            self.spots.append(Button(size_hint=(None,None),height=self.height/8,width=self.width/8))
            self.add_widget(self.spots[i])

class TestApp(App):
    pass
TestApp().run()

非常感谢〈3

a6b3iqyw

a6b3iqyw1#

您可以使用kv来完成此操作,而不是编写自己的代码来定位GridLayout。下面是代码的修改版本,它可以完成此操作:

# resize window (NEEDS TO BE AT VERY TOP)
from kivy.config import Config
from kivy.lang import Builder

Config.set('graphics', 'width', '600')
Config.set('graphics', 'height', '600')

from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button

kv = '''
RMainBoard:

<RMainBoard@RelativeLayout>:
    MainBoard:
        cols: 8
        size_hint: None, None
        
        # make MainBoard square
        width: min(root.width, root.height)
        height: self.width
        
        # position MainBoard in center of RMainBoard
        pos_hint: {'center_x': 0.5, 'center_y': 0.5}
    
<SquareButton>:
    size_hint: None, None
    
    # make the Button square
    width: min(self.parent.width/8, self.parent.height/8) if self.parent else 100
    height: self.width
'''

class SquareButton(Button):
    pass

class MainBoard(GridLayout):
    spots = []

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.spot_init()

    def spot_init(self):
        for i in range(0, 64):
            self.spots.append(SquareButton(text=str(i)))
            self.add_widget(self.spots[i])

class TestApp(App):
    def build(self):
        return Builder.load_string(kv)

TestApp().run()

注意,我在python代码中包含了kv作为字符串,这只是为了我自己的方便,它也可以包含在kv文件中。
我定义了一个SquareButton类,以及kv中的<SquareButton>规则,该规则保持SquareButton为正方形,在spot_init()方法中创建的Buttons现在是SquareButtons

相关问题