KIVY ScreenManager 使用案例常见错误总结

# 导入Kivy的App类,它是所有kivy应用的基类
from kivy.app import App
# kivy内置了丰富的控件widget  如 按钮button 复选框checkbox 标签label 输入框textinput 滚动容器scrollable container等
from kivy.uix.button import Button
# 引入BoxLayout 布局
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import ScreenManager, Screen



class IndexPage(BoxLayout):
    # 初始化
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        # 添加一个按钮
        self.join = Button(text="Hello World")
        # 将按钮添加到页面控件中
        self.add_widget(self.join)
# 从App类中继承了kivy应用组基本的方法,如创建窗口、设置窗口的大小和位置等

class TestApp(App):
    def build(self):
        self.sm = ScreenManager()
        #build()方法返回的控件,在kivy中称之为“根控件” root widget
        # kivy将自动缩放根控件,让它填满整个窗口

        screen = Screen(name = 'index')
        screen.add_widget(IndexPage)
        self.sm.add_widget(screen)
        return self.sm
# 当.py文件被直接运行时, if__name__ == '__main__' 之下的代码块将被运行
# 当.py文件以模块的形式被导入时,if __name__ == '__main__' 之下的代码块不被运行
if __name__ == '__main__':
    TestApp().run()  #启动应用程序

 TypeError: unbound method EventDispatcher.bind() needs an argument

如图报错,是因为第二十八行的代码中应该做这样修改

       screen.add_widget(IndexPage())

即可正常运行。

kivy中 screen.add_widget(IndexPage()) 为什么不可以用 screen.add_widget(IndexPage)

在Kivy框架中,screen.add_widget(IndexPage()) 和 screen.add_widget(IndexPage) 之间的主要区别在于它们如何引用和实例化IndexPage类。

1. screen.add_widget(IndexPage())

当你使用IndexPage()时,你实际上是在调用IndexPage类的构造函数(也称为__init__方法),从而创建了一个IndexPage的实例。这个实例是一个Kivy小部件(Widget)对象,可以被添加到其他小部件中,比如屏幕(Screen)或布局(Layout)。因此,screen.add_widget(IndexPage())是正确的用法,因为它将一个IndexPage的实例作为子小部件添加到了screen上。

2. screen.add_widget(IndexPage)

然而,当你只写IndexPage而不加括号时,你并没有创建IndexPage的实例,而是引用了IndexPage类本身。在Kivy中,你不能直接将一个类作为小部件添加到另一个小部件中;你必须添加类的实例。因此,screen.add_widget(IndexPage)会导致一个错误,因为add_widget方法期望一个Widget的实例作为参数,而不是一个类。

总结

  • IndexPage() 创建了一个IndexPage的实例。
  • IndexPage 引用了IndexPage类本身,而不是其实例。

在Kivy(以及大多数面向对象的编程语言)中,类是用于创建对象的蓝图或模板。对象(或实例)是类的一个具体实现,包含类的所有属性和方法,以及可能的额外数据。因此,当你想要使用某个类的功能时,你需要先创建该类的一个实例。

另一方面,在使用纯py文件时,onpress要和bind()方法相搭配才能实现页面转换功能以及current的赋值。

# 导入Kivy的App类,它是所有kivy应用的基类
from kivy.app import App
# kivy内置了丰富的控件widget  如 按钮button 复选框checkbox 标签label 输
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xinzheng新政

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值