如何使我的 Boxlayout 在另一个 Boxlayout 中粘在顶部?

问题描述 投票:0回答:1

我正在用 kivy 制作一个应用程序,它有一个可以在屏幕之间导航的菜单。菜单是一个垂直的 BoxLayout,添加了按钮,稍后将进行屏幕切换。此外,它还添加到水平 BoxLayout 以及屏幕管理器中。我目前正在尝试实现的目标是使垂直 BoxLayout 粘在顶部。我研究过,

pos_hint: {"top": 1}
应该可以解决问题,但它的行为并不像我预期的那样。难道是我理解错了?或者说它对 BoxLayout 中的 BoxLayout 不起作用?

我的脚本如下所示:

from kivy.lang import Builder
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import ScreenManager, Screen

class Menu(BoxLayout):
    pass

class ArtistTab(Screen):
    pass

class SongTab(Screen):
    pass

class AlbumTab(Screen):
    pass

class MuDoApp(App):
    def build(self):
        interface = Builder.load_file('main.kv')
        sm = ScreenManager()
        sng_tab = SongTab(name="song")
        art_tab = ArtistTab(name="artist")
        alb_tab = AlbumTab(name="album")
        sm.add_widget(art_tab)
        sm.add_widget(alb_tab)
        sm.add_widget(sng_tab)
        interface.add_widget(sm)
        print(interface.ids["menu"].height)
        print(interface.ids["menu"].minimum_height)
        return interface
    
if __name__ == '__main__':
    app = MuDoApp()
    app.run()

和我的 .kv 文件:

BoxLayout:
    Menu:
        orientation: "vertical"
        pos_hint: {"y":1}
        id: menu
        
        Label:
            size_hint: (None,None)
            size: 500,100
            text: "Download by ..."
        Button:
            size_hint: (None,None)
            size: 300,100
            text: "songtitel"
        Button:
            size_hint: (None,None)
            size: 300,100
            text: "artist"
        Button
            size_hint: (None,None)
            size: 300,100
            text: "album"
        
        
<ArtistTab>:
    BoxLayout:
        id: artist_tab
        TextInput:
            size_hint: (None,None)
            width: 500
        Button:
            size_hint: (None,None)
            width: 300
            text: "download"

我尝试过 pos_hint 参数并得到以下结果:

pos_hint: {"top":1}

pos_hint: {"top":0}

pos_hint: {"top":.7}

pos_hint: {"y":1}

pos_hint: {"y":0}

pos_hint: {"y":.7}

此外,

print(interface.ids["menu"].height)
打印了100,
print(interface.ids["menu"].minimum_height)
打印了0,这也让我感到惊讶,因为我菜单中的小部件添加到了400的高度。

python-3.x layout kivy kivy-language
1个回答
0
投票

您的

print
语句在设置
Menu
的实际大小之前执行,因此您只能看到那里的默认值。

使用

pos_hint: {"top":1}
是获得你想要的东西的正确方法,但问题是
BoxLayout
将其整个垂直空间分配给它的每个子元素。
Menu
最终获得完整高度,因此
pos_hint
没有任何效果。考虑到这两个事实,您可以使用以下代码来实现您的目标:

    pos_hint: {"top":1}
    size_hint_y: None
    height: self.minimum_height

对于

Menu
。这会将
Menu
高度设置为其最小值,以便
pos_hint
实际上可以执行某些操作。

© www.soinside.com 2019 - 2024. All rights reserved.