首页 > 解决方案 > kivy:覆盖 __init__ 使子布局显示太小

问题描述

我目前正在做一个 kivy 项目,发现了一个奇怪的问题。如果我覆盖根布局的 __init__ 方法,它的子项显示比它们应该显示的要小得多。为什么会发生这种情况,覆盖 __init__ 的正确方法是什么?这是一个最小化的示例:

测试.kv

#:kivy 1.11.1
#:set camera_width_percent 4.0/5.0
#:set sidebar_width (1.0 - camera_width_percent) / 2.0

<LeftSidebar>:
    ok_btn_button: ok_btn
    #:set num_btns 10.0
    size_hint: (sidebar_width, 1.0)

    canvas:
        Color:
            rgb: 1, 0, 0
        Rectangle:
            pos: self.pos
            size: self.size
    CustomButton:
        id: ok_btn
        text: "ok"
        size_hint: (1.0, 1.0/num_btns)
        pos_hint: {'top': 1.0/num_btns}


<LifterGUI>:
    left_sidebar_widget: left_sidebar

    FloatLayout:
        LeftSidebar:
            id: left_sidebar

test.py,没有对 LifterGUI 的初始化覆盖

这是 GUI 的外观。

import kivy
kivy.require('1.11.1')

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.properties import NumericProperty, ObjectProperty
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.button import Button
from kivy.core.window import Window

Window.fullscreen = 'auto'

class CustomButton(Button):

    def __init__(self, **kwargs):
        super(Button, self).__init__(**kwargs)
        print("CustomButton __init__ called")


class LeftSidebar(FloatLayout):

    def __init__(self, **kwargs):
        super(FloatLayout, self).__init__(**kwargs)
        print("LeftSidebar __init__ called")


class LifterGUI(FloatLayout):

#    def __init__(self, **kwargs):
#        super(FloatLayout, self).__init__(**kwargs)
#        print("LifterGUI __init__ called")
    pass


class TestApp(App):

    def build(self):
        lifterGUI = LifterGUI()
        return lifterGUI


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

test.py,带有LifterGUI 的初始化覆盖

这是更改后的样子。

import kivy
kivy.require('1.11.1')

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.properties import NumericProperty, ObjectProperty
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.button import Button
from kivy.core.window import Window

Window.fullscreen = 'auto'

class CustomButton(Button):

    def __init__(self, **kwargs):
        super(Button, self).__init__(**kwargs)
        print("CustomButton __init__ called")


class LeftSidebar(FloatLayout):

    def __init__(self, **kwargs):
        super(FloatLayout, self).__init__(**kwargs)
        print("LeftSidebar __init__ called")


class LifterGUI(FloatLayout):

    def __init__(self, **kwargs):
        super(FloatLayout, self).__init__(**kwargs)
        print("LifterGUI __init__ called")
#    pass


class TestApp(App):

    def build(self):
        lifterGUI = LifterGUI()
        return lifterGUI


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

标签: pythonkivy

解决方案


当你调用时super,你应该提供你调用的类。例如:

class LifterGUI(FloatLayout):

    def __init__(self, **kwargs):
        super(LifterGUI, self).__init__(**kwargs)
        print("LifterGUI __init__ called")

与您的其他课程类似。


推荐阅读