如何将小部件添加到现有屏幕?

时间:2019-02-20 20:57:38

标签: python-3.x kivy

我的应用程序是从.kv文件构建的。

我想从我的python文件向Screen添加按钮。

class Profiles(Screen):
    def suh(self):
        for i in range(5):
            self.add_widget(Button(text=i))

suh函数似乎无效。这是因为在构建应用后会调用该函数吗?有一个更好的方法吗?

2 个答案:

答案 0 :(得分:1)

解决方案1 ​​

由于屏幕是 RelativeLayout ,因此请使用on_pre_enteron_enter来调用方法 suh(),然后添加sizepos到“按钮”小部件。

解决方案2

使用容器,例如在屏幕顶部的 BoxLayout Gridayout

注意

每当通过on_pre_enteron_enter将窗口小部件添加到屏幕时,请使用on_pre_leaveon_leave删除窗口小部件。这是为了防止每次进入屏幕时将小部件加倍。

如果清除窗口小部件的速度过快,请在一定时间间隔内使用 Clock.schedule_once

注1:屏幕事件

Kivy屏幕发生以下事件。

Kivy Screen » Events

  

on_pre_enter:()

     

将要使用屏幕时触发的事件:进入   动画开始了。

     

on_enter:()

     

显示屏幕时触发事件:输入的动画为   完成。

     

on_pre_leave:()

     

要删除屏幕时触发的事件:离开   动画开始了。

     

on_leave:()

     

移除屏幕时触发事件:离开动画为   完成。

注意2:屏幕是RelativeLayout

Kivy Screen » RelativeLayout

  

请注意,默认情况下,Screen不显示任何内容:   RelativeLayout。您需要将该类用作根窗口小部件   您自己的屏幕,最好的方法是继承类。

     

警告

     

由于ScreenRelativeLayout,因此了解这一点很重要   Common Pitfalls

示例-解决方案1 ​​

main.py

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.button import Button
from kivy.lang import Builder


Builder.load_string("""
<Profiles>:
    # on_pre_enter: self.suh()
    on_enter: self.suh()
""")


class Profiles(Screen):
    def suh(self):
        for i in range(5):
            self.add_widget(Button(text=str(i), size_hint=(0.1, 0.1), pos=(i*100, i*100)))


sm = ScreenManager()
sm.add_widget(Profiles(name='profiles'))


class TestApp(App):

    def build(self):
        return sm


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

输出-解决方案1 ​​

Output - Solution 1

示例-解决方案2

main.py

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.button import Button
from kivy.lang import Builder


Builder.load_string("""
<Profiles>:
    # on_pre_enter: self.suh()
    on_enter: self.suh()
    BoxLayout:
        id: container
""")


class Profiles(Screen):
    def suh(self):
        for i in range(5):
            self.ids.container.add_widget(Button(text=str(i), size_hint=(0.1, 0.1)))


sm = ScreenManager()
sm.add_widget(Profiles(name='profiles'))


class TestApp(App):

    def build(self):
        return sm


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

输出-解决方案2

Output - Solution 2

答案 1 :(得分:0)

通过App类而不是Screen添加小部件。因此,您将必须创建一个创建小部件的函数,并且在构建函数中,必须使用Clock.schedule_once模块中的Clock来运行其他函数。示例:

class TestApp(App):
    def build(self):
        Clock.schedule_once(self.yoyo, 0)
        return MainWin()

    def yoyo(self, *args):
        for i in memu_acc:
            self.root.ids["prof"].ids["pro"].add_widget(Button(text=i))