繁体   English   中英

python中的Kivy小部件到KV文件,如何控制

[英]Kivy widget in python to kv file, how control it

我有一个简单的测试程序:

main.py

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.screenmanager import Screen
from kivy.clock import mainthread


class TestScreen(Screen):
@mainthread
def on_pre_enter(self): #Is loaded before kv buttons etc? how make it work
   pass
@mainthread
def on_enter(self): #Load after kv buttons etc?
    button = Button(text="Work?")
    #how now add it to display?
    #how control where display it? on end or begin is just about on_pre and on?

class TestApp(App):
    pass

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

和test.kv文件

#:import NoTransition kivy.uix.screenmanager.NoTransition 
<TestScreen>:   
    name:'try'
    GridLayout:
        id:'test'
        cols:2
        Button:
            text:'Test'
            on_press:app.root.current='Main'
ScreenManager:
    transition: NoTransition()
    Screen:
        name: 'Main'
        GridLayout:
            cols:1
            Button:
                text:'1'                
            Button:
                text:'2'
            Button:
                text:'Test'
                on_press:root.current='try'
    TestScreen:

是很容易控制kv和python小部件的(但是我不知道如何,但是更容易在kv文件中编写小部件等,但是仍然需要在python中创建一些自动内容)还是更好地仅在python中创建所有kv文件? 我想做这样的事情:总是显示带有左菜单的应用程序,而在右边的另一个基于屏幕的动态内容的屏幕(从菜单中单击)可能是另一个简单的解决方案。 有人可以逐步解释我吗? :)

AttributeError

解决AttributeError的方法,请在test.kv文件中将“ id:'test'”替换为“ id:test”。

动态内容

根据菜单的点击,可以显示具有动态内容的屏幕。 但是切记要删除退出屏幕(TestScreen / SettingsScreen)时添加的小部件。 如果不删除窗口小部件,则每次进入屏幕(TestScreen / SettingsScreen)时,都会获得每个窗口小部件的重复项/倍数。 我建议使用on_pre_enter和on_leave方法。 有关详细信息,请参见以下示例。

main.py

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


class MyScreenManager(ScreenManager):
    pass


class MenuScreen(Screen):
    pass


class SettingsScreen(Screen):
    def on_pre_enter(self, *args):
        self.ids.test.add_widget(Button(text="Work?"))

    def on_leave(self, *args):
        self.ids.test.remove_widget(self.ids.test.children[0])


class TestApp(App):
    title = "Add & Remove Widgets Dynamically"

    def build(self):
        return MyScreenManager()


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

测试文件

#:kivy 1.10.0
#:import NoTransition kivy.uix.screenmanager.NoTransition

<MyScreenManager>:
    transition: NoTransition()
    MenuScreen:
    SettingsScreen:

<MenuScreen>:
    name: 'menu'
    GridLayout:
        cols: 1
        Button:
            text: '1'
        Button:
            text: '2'
        Button:
            text: 'Test'
            on_press: root.manager.current = 'settings'

<SettingsScreen>:
    name:'settings'
    GridLayout:
        id: test
        cols: 2
        Button:
            text: 'Test'
            on_press: root.manager.current = 'menu'

输出量

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM