我正在用 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的高度。
您的
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
实际上可以执行某些操作。