python - 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 的初始化覆盖
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()
解决方案
当你调用时super
,你应该提供你调用的类。例如:
class LifterGUI(FloatLayout):
def __init__(self, **kwargs):
super(LifterGUI, self).__init__(**kwargs)
print("LifterGUI __init__ called")
与您的其他课程类似。
推荐阅读
- android - SVG 文件在 Android Studio 中是否可扩展
- python - 如何在不使用字符串方法的情况下反转数字?
- excel - 列范围可以与 SUBSTITUTE 一起使用吗
- python - 如何使用 PyCharm 激活我的虚拟环境?我什至可以在 PyCharm 中激活它吗?
- gridsome - 单击按钮后调用 API
- javascript - 如何添加 4 位小数的输出结果?
- flutter - 带有不匹配参数的闭包调用:函数'LoginScreen.build。
- bash - 如何使用现有文件夹名称作为基本名称创建按顺序编号的文件夹列表
- python - django:如何从 View.py 读取和操作 .csv 文件
- flutter - 如何在 ListView 中显示来自实时数据库的数据?