Kivy:为什么BoxLayout将我的按钮推到底部?

时间:2017-11-20 19:10:16

标签: python kivy kivy-language

我是Kivy的新手,但试图抓住它。我正在通过“在Kivy中创建应用程序”中的示例作为模板,但我甚至偶然发现了第一章。出于某种原因,我的按钮被推到应用程序的底部。我错过了一些他们正在那里出现的批评吗?

我的python文件:

import kivy

from kivy.app import App
from kivy.uix.button import Label
from kivy.uix.boxlayout import BoxLayout

# In the kv file, everything to the right of the colon is pure python
# for loading python module in kv file, use format of #:  import keyword module_name
class WeatherWidget(BoxLayout):
    def printing_test(self):
        print('This is a test')

class DailyViewApp(App):
    def build(self):
        return WeatherWidget()

if __name__ == '__main__':
    DailyViewApp().run()

我的kv档案:

<WeatherWidget>:
    orientation: "vertical"
    BoxLayout: 
        height: "30dp"
        size_hint_y: None
        Button: 
            text: 'New York, NY' 
            size_hint_x: 1
            on_press: root.printing_test()
        Button: 
            text: 'Test'
            size_hint_x: 0.25

My (incorrect) output:

3 个答案:

答案 0 :(得分:1)

在BoxLayout和垂直方向中,第一个小部件放置在窗口的底部,并在下面添加更多小部件时向上滚动。如果您希望它显示在窗口的顶部,则必须使用 pos ,或添加另一个boxlayout(size_hint_y = 0.9)以填充剩余空间,或添加小部件,直到它填满剩余空间。使用 pos ,您必须计算高度,如示例1所示。

pos: 0, root.height - 30

如果您要在outter boxlayout中的按钮/下面放置更多小部件,我建议使用GridLayout作为根小部件,如示例2所示。

示例1 - 嵌套BoxLayout

dailyview.kv

#:kivy 1.10.0

<WeatherWidget>:
    orientation: "vertical"
    pos: 0, root.height - 30
    BoxLayout:
        height: "30dp"
        size_hint_y: None
        Button:
            text: 'New York, NY'
            size_hint_x: 1
            on_press: root.printing_test()
        Button:
            text: 'Test'
            size_hint_x: 0.25

输出1 - 嵌套BoxLayout

enter image description here

示例2 - GridLayout

main.py

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

# In the kv file, everything to the right of the colon is pure python
# for loading python module in kv file, use format of #:  import keyword module_name


class WeatherWidget(GridLayout):
    def printing_test(self):
        print('This is a test')


class DailyViewApp(App):
    def build(self):
        return WeatherWidget()


if __name__ == '__main__':
    DailyViewApp().run()

dailyview.kv

#:kivy 1.10.0

<WeatherWidget>:
    cols: 1
    BoxLayout:
        height: "30dp"
        size_hint_y: None
        Button:
            text: 'New York, NY'
            size_hint_x: 1
            on_press: root.printing_test()
        Button:
            text: 'Test'
            size_hint_x: 0.25

输出2 - GridLayout

enter image description here

答案 1 :(得分:1)

另一种解决方案是在第一个boxlayout之后放置另一个小部件,其中包含用于覆盖剩余位置的按钮

<WeatherWidget>:
    orientation: "vertical"
    BoxLayout: 
        height: "30dp"
        size_hint_y: None
        Button: 
            text: 'New York, NY' 
            size_hint_x: 1
            on_press: root.printing_test()
        Button: 
            text: 'Test'
            size_hint_x: 0.25
    BoxLayout:
        size_hint_y: .9 #this is a random number that I have chosen

答案 2 :(得分:-2)

class WeatherWidget(BoxLayout):
    def __init__(self,**kwargs):
        super(WeatherWidget,self).__init__(**kwargs)

<WeatherWidget>:
    BoxLayout:
        orientation:'vertical'
        BoxLayout:
            id: box1
            height: "40dp"
            size_hint_y: None
            Button:
                text: 'New York, NY'
                size_hint_x: 1
                on_press: root.printing_test()
            Button:
                text: 'Test'
                size_hint_x: 0.25

更改类以使其看起来像这样