【问题标题】:Why is my Kivy Actionbar gone?为什么我的 Kivy 操作栏不见了?
【发布时间】:2017-11-25 01:44:49
【问题描述】:

晚上好,

我正在尝试将 kivy 的操作栏与屏幕管理器结合起来。我已经到了可以切换屏幕的地步,但无法显示我的操作栏。我遵循了很多例子,但没有一个可以帮助我解决我的问题。我对kivy还很陌生,所以我已经很久没有使用它了。 我有点想知道是否有人能够指出我的问题所在,因为我正在尝试使用操作栏构建我自己的 GUI,让我可以在屏幕之间切换。 这是我的 main.py:

#!/usr/bin/env python3
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager,Screen
from kivy.properties import ObjectProperty
from kivy.uix.boxlayout import BoxLayout

class Menu(BoxLayout):
    pass
class ScreenThermo(Screen):
    pass
class ScreenLight(Screen):
    pass
class ScreenEnergy(Screen):
    pass
class ScreenWeather(Screen):
    pass

class Manager(ScreenManager):
    screen_thermo = ObjectProperty(None)
    screen_light = ObjectProperty(None)
    screen_energy = ObjectProperty(None)
    screen_weather = ObjectProperty(None)

class MenuApp(App):
    def thermostaat(self):
        print("Thermostaat")
    def verlichting(self):
        print("Verlichting")
    def energie(self):
        print("Energie")
    def weer(self):
        print("Het Weer")
    def build(self):
        return Manager()


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

这是我的 menu.kv 文件:

#:kivy 1.0.9
<Menu>:
    orientation: "vertical"

    ActionBar:
        ActionView:
            ActionPrevious:
            ActionButton:
                text: "Thermostaat"

                on_release: app.thermostaat()
            ActionButton:
                text: "Verlichting"
                #I want my screens to switch when clicking on this actionbar button
                on_press: root.manager.current= 'light'
                on_release: app.verlichting()
            ActionButton:
                text: "Energieverbruik"
                on_release: app.energie()
            ActionButton:
                text: "Het Weer"
                on_release: app.weer()

    Button:
        text: "Nothing"
        background_color: 1, 1, 1, 0.6
        background_normal: ""

<ScreenThermo>:
    Button:
        text: "stuff1"
        #this is a test to see if i can switch through screens
        on_press: root.manager.current= 'light'
<ScreenLight>:
    Button:
        text: "stuff2"
<ScreenEnergy>:
    Button:
        text: "stuff3"
<ScreenWeather>:
    Button:
        text: "stuff4"

<Manager>:
    id: screen_manager
    screen_thermo: screen_thermo
    screen_light: screen_light
    screen_energy: screen_energy
    screen_weather: screen_weather

    ScreenThermo:
        id: screen_thermo
        name: 'thermo'
        manager: screen_manager
    ScreenLight:
        id: screen_light
        name: 'light'
        manager: screen_manager
    ScreenEnergy:
        id: screen_energy
        name: 'energy'
        manager: screen_manager
    ScreenWeather:
        id: screen_weather
        name: 'weather'
        manager: screen_manager

如您所见,我试图让我的屏幕在点击操作栏按钮时切换,但不知何故,当我启动它时,我的操作栏不见了。 如果有人能帮我解决这个问题,那就太棒了。

【问题讨论】:

    标签: python user-interface raspberry-pi kivy kivy-language


    【解决方案1】:

    在下面的例子中,我们将根部件Manager替换为Menu,具体解决方案如下:

    main.py - Python 脚本

    1。构建方法

    通过替换使类 Menu 成为根小部件:

    def build(self):
        return Manager()
    

    与:

    def build(self):
        return Menu()
    

    2。菜单类

    声明一个变量,类型为 ObjectProperty 的管理器,我们将把它连接到 ScreenManager。

    class Menu(BoxLayout):
        manager = ObjectProperty(None)
    

    menu.kv - kv 文件

    3。将 ObjectProperty 连接到 id

    在这里,我们将 ObjectProperty, manager 连接到 ScreenManager 的 id, screen_manager 以便我们可以引用它,例如root.manager.current.

    <Menu>:
        manager: screen_manager
    

    4。定义ActionBar的高度

    我们使用 size_hint_y = 0.1 将 ActionBar 的高度设置为父级高度的 10% (0.1)

    ActionBar:
        size_hint_y: 0.1
        ActionView:
    

    5。定义Button的高度

    我们将 Button 的高度设置为父级高度的 10% (0.1) size_hint_y = 0.1

        Button:
            size_hint_y: 0.1
            text: "Nothing"
    

    6。将 ScreenManager 添加为 Menu 的子项

    我们在 Button 之后添加 Manager 作为 Menu 的子项。由于我们没有指定高度,它默认为剩余的可用高度,即 0.8(父母高度的 80%)。

    Manager:
        id: screen_manager
    

    示例

    main.py

    ​​>
    from kivy.app import App
    from kivy.uix.screenmanager import ScreenManager,Screen
    from kivy.properties import ObjectProperty
    from kivy.uix.boxlayout import BoxLayout
    
    
    class Menu(BoxLayout):
        manager = ObjectProperty(None)
    
    
    class ScreenThermo(Screen):
        pass
    
    
    class ScreenLight(Screen):
        pass
    
    
    class ScreenEnergy(Screen):
        pass
    
    
    class ScreenWeather(Screen):
        pass
    
    
    class Manager(ScreenManager):
        screen_thermo = ObjectProperty(None)
        screen_light = ObjectProperty(None)
        screen_energy = ObjectProperty(None)
        screen_weather = ObjectProperty(None)
    
    
    class MenuApp(App):
        def thermostaat(self):
            print("Thermostaat")
    
        def verlichting(self):
            print("Verlichting")
    
        def energie(self):
            print("Energie")
    
        def weer(self):
            print("Het Weer")
    
        def build(self):
            return Menu()
    
    
    if __name__ == '__main__':
        MenuApp().run()
    

    menu.kv

    #:kivy 1.10.0
    
    <Menu>:
        manager: screen_manager
        orientation: "vertical"
        ActionBar:
            size_hint_y: 0.1
            ActionView:
                ActionPrevious:
                ActionButton:
                    text: "Thermostaat"
    
                    on_release: app.thermostaat()
                ActionButton:
                    text: "Verlichting"
                    #I want my screens to switch when clicking on this actionbar button
                    on_press: root.manager.current= 'light'
                    on_release: app.verlichting()
                ActionButton:
                    text: "Energieverbruik"
                    on_release: app.energie()
                ActionButton:
                    text: "Het Weer"
                    on_release: app.weer()
    
        Button:
            size_hint_y: 0.1
            text: "Nothing"
            background_color: 1, 1, 1, 0.6
            background_normal: ""
        Manager:
            id: screen_manager
    
    <ScreenThermo>:
        Button:
            text: "stuff1"
            #this is a test to see if i can switch through screens
            on_press: root.manager.current= 'light'
    <ScreenLight>:
        Button:
            text: "stuff2"
    <ScreenEnergy>:
        Button:
            text: "stuff3"
    <ScreenWeather>:
        Button:
            text: "stuff4"
    
    <Manager>:
        id: screen_manager
        screen_thermo: screen_thermo
        screen_light: screen_light
        screen_energy: screen_energy
        screen_weather: screen_weather
    
        ScreenThermo:
            id: screen_thermo
            name: 'thermo'
            manager: screen_manager
        ScreenLight:
            id: screen_light
            name: 'light'
            manager: screen_manager
        ScreenEnergy:
            id: screen_energy
            name: 'energy'
            manager: screen_manager
        ScreenWeather:
            id: screen_weather
            name: 'weather'
            manager: screen_manager
    

    输出

    【讨论】:

      【解决方案2】:

      您永远不会将菜单添加到您的应用程序中,您还需要在菜单中添加管理器属性。试试这样的:

      在.py中:

      ...
      class Menu(BoxLayout):
          manager = ObjectProperty(None)
      
      ...
      class MenuApp(App):
          def thermostaat(self):
              print("Thermostaat")
          def verlichting(self):
              print("Verlichting")
          def energie(self):
              print("Energie")
          def weer(self):
              print("Het Weer")
      
      ...
      

      请注意,我已经删除了构建方法

      在你的 kv 末尾添加这段代码:

      ...
      BoxLayout: #use a box layout or whatever you want
          orientation: 'vertical'
          Menu:
              size_hint_y: .1
              manager: manager
          Manager:
              size_hint_y: .9
              id: manager
      

      【讨论】:

      • 感谢您的惊人回复!这解决了我的问题!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-21
      相关资源
      最近更新 更多