【问题标题】:Error while Adding buttons dynamically to Screen in ScreenManager Kivy在 ScreenManager Kivy 中将按钮动态添加到屏幕时出错
【发布时间】:2016-10-14 10:08:56
【问题描述】:

我正在尝试将按钮动态添加到屏幕。运行应用程序时出现以下错误。请帮我解决问题。

Traceback(最近一次调用最后一次):文件“main.py”,第 174 行,在 screenManager.add_widget(HomeScreen(name = 'homeScreen')) 文件“main.py”,第 162 行,在 init self.add_widget(btn) 文件“/Applications/Kivy.app/Contents/Resources/kivy/kivy/uix/floatlayout.py”, 第 111 行,在 add_widget 中 pos=self._trigger_layout, AttributeError: 'HomeScreen' 对象没有属性 '_trigger_layout'

这是我的 main.py

class HomeScreen(Screen):

    def __init__(self, **kwargs):
        for i in range(80):
            btn = Button(text=str(i), size=(90, 90), size_hint=(None, None))
            self.add_widget(btn)


# Screen Manager
screenManager = ScreenManager( transition = FadeTransition() )

# Add all screens to screen manager
#screenManager.add_widget( UsernameScreen( name = 'usernameScreen' ) )
#screenManager.add_widget( PasswordScreen( name = 'passwordScreen' ) )
#screenManager.add_widget( LevelTwoScreen( name = 'levelTwoScreen' ) )
#screenManager.add_widget( LevelTwoScreen( name = 'levelThreeScreen' ) )

screenManager.add_widget( HomeScreen( name = 'homeScreen' ) )

class ThreeLevelAuthApp(App):
    def build(self):
        return screenManager

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

kivy 文件

<HomeScreen>:
    ScrollView:
        size_hint: None, None
        size: 400, 400
        pos_hint: { 'center_x': 0.5,'center_y': 0.5 }   
        do_scroll_x: False

    GridLayout:
        cols: 6
        padding: 20
        spacing: 20
        size_hint: None, None
        width: 400

【问题讨论】:

    标签: python kivy


    【解决方案1】:

    让我们从__init__开始:

    class HomeScreen(Screen):
    
        def __init__(self, **kwargs):
            for i in range(80):
                btn = Button(text=str(i), size=(90, 90), size_hint=(None, None))
                self.add_widget(btn)
    

    虽然这看起来不错并且在您创建实例时被调用,但缺少一个基本的东西 - super()。您首先需要super() 来初始化Screen,以便它具有使其成为具有真实行为的类所需的所有变量和方法,从而使您能够实际继承该行为。

    请注意,Screen 本身就是RelativeLayout,如果您不使用适合您的布局,则需要处理定位和/或大小调整等其他内容。

    import random
    class HomeScreen(Screen):
    
        def __init__(self, **kwargs):
            super(HomeScreen, self).__init__(**kwargs)
            for i in range(80):
                btn = Button(text=str(i), size=(90, 90),
                             size_hint=(None, None),
                             pos=[random.randint(0,500), random.randint(0,500)])
                self.add_widget(btn)
    

    【讨论】:

    • 哦,我犯了一个愚蠢的错误。不管怎么说,多谢拉。它现在工作正常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多