【问题标题】:Kivy widget in python to kv file, how control itpython中的kivy小部件到kv文件,如何控制它
【发布时间】:2018-03-06 13:38:35
【问题描述】:

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

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 中创建一些用于自动内容)或者更好的是在没有 kv 文件的情况下在 python 中创建所有?我想做这样的事情:始终显示左侧菜单的应用程序,而在右侧另一个具有基于屏幕的动态内容的屏幕(从菜单中单击)可能是另一个简单的解决方案。任何人都可以逐步解释我吗? :)

【问题讨论】:

    标签: python widget kivy screens


    【解决方案1】:

    属性错误

    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()
    

    test.kv

    #: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'
    

    输出

    【讨论】:

      猜你喜欢
      • 2019-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-03
      • 2016-06-18
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多