Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么我的Kivy Actionbar不见了?_Python_User Interface_Raspberry Pi_Kivy_Kivy Language - Fatal编程技术网

Python 为什么我的Kivy Actionbar不见了?

Python 为什么我的Kivy Actionbar不见了?,python,user-interface,raspberry-pi,kivy,kivy-language,Python,User Interface,Raspberry Pi,Kivy,Kivy Language,晚上好, 我正在尝试将kivy的actionbar与屏幕管理器结合起来。我已经到了可以在屏幕间切换的地步,但无法让我的actionbar显示出来。我列举了很多例子,但没有一个能帮助我解决问题。我对kivy还比较陌生,所以我已经很长时间没有使用它了。 我想知道是否有人能指出我的问题所在,因为我正试图用一个操作栏构建自己的GUI,让我可以在屏幕之间切换。 这是我的main.py: #!/usr/bin/env python3 from kivy.app import App from kivy.ui

晚上好,

我正在尝试将kivy的actionbar与屏幕管理器结合起来。我已经到了可以在屏幕间切换的地步,但无法让我的actionbar显示出来。我列举了很多例子,但没有一个能帮助我解决问题。我对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
#:kivy 1.0.9
:
方向:“垂直”
操作栏:
ActionView:
以前的行动:
操作按钮:
正文:“恒温箱”
发布时:应用程序thermostaat()
操作按钮:
文本:“Verlichting”
#我想在点击这个actionbar按钮时切换屏幕
按:root.manager.current='light'
发布时:app.verlichting()
操作按钮:
文本:“能源之路”
发布时:app.energie()
操作按钮:
文本:“Het Weer”
发布时:app.weer()
按钮:
文本:“没有”
背景颜色:1,1,1,0.6
背景_正常:“
:
按钮:
文本:“填充1”
#这是一个测试,看看我是否可以通过屏幕切换
按:root.manager.current='light'
:
按钮:
文字:“stuff2”
:
按钮:
文字:“stuff3”
:
按钮:
文字:“stuff4”
:
id:屏幕管理器
屏幕温度:屏幕温度
屏幕灯:屏幕灯
屏幕能量:屏幕能量
屏幕天气:屏幕天气
屏幕温度:
识别号:屏幕
名称:“thermo”
经理:屏幕管理器
屏幕灯:
id:屏幕灯
名称:“光”
经理:屏幕管理器
屏幕能量:
id:screen_energy
名称:“能源”
经理:屏幕管理器
屏幕天气:
id:screen_天气
名称:“天气”
经理:屏幕管理器
正如你们所看到的,我试图让我的屏幕打开一个actionbar按钮点击,但不知怎的,当我启动它时,我的actionbar不见了。
如果有人能帮我解决这个问题,那就太棒了。

你从来没有将菜单添加到你的应用程序中,你还需要在菜单中添加一个manager属性。试着这样做:

在.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")

...
请注意,我已经删除了build方法

在您的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

在下面的示例中,我们将用菜单替换根小部件Manager,详细解决方案如下:

py-Python脚本 1.构建方法 通过替换以下内容,使类菜单成为根小部件:

def build(self):
    return Manager()
与:

2.菜单类 声明一个变量,类型为ObjectProperty的manager,我们将把它连接到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
5.定义按钮的高度 我们使用以下命令将按钮的高度设置为父级高度的10%(0.1) 大小提示y=0.1

ActionBar:
    size_hint_y: 0.1
    ActionView:
    Button:
        size_hint_y: 0.1
        text: "Nothing"
6.将ScreenManager添加为菜单的子项 我们在按钮后添加管理器作为菜单的子项。因为我们没有指定高度,所以它默认为剩余的可用高度,即0.8(父级高度的80%)

例子 main.py 千伏
#:kivy 1.10.0
:
经理:屏幕管理器
方向:“垂直”
操作栏:
尺寸:0.1
ActionView:
以前的行动:
操作按钮:
正文:“恒温箱”
发布时:应用程序thermostaat()
操作按钮:
文本:“Verlichting”
#我想在点击这个actionbar按钮时切换屏幕
按:root.manager.current='light'
发布时:app.verlichting()
操作按钮:
文本:“能源之路”
发布时:app.energie()
操作按钮:
文本:“Het Weer”
发布时:app.weer()
按钮:
尺寸:0.1
文本:“没有”
背景颜色:1,1,1,0.6
背景_正常:“
经理:
id:屏幕管理器
:
按钮:
文本:“填充1”
#这是一个测试,看看我是否可以通过屏幕切换
按:root.manager.current='light'
:
按钮:
文字:“stuff2”
:
按钮:
文字:“stuff3”
:
按钮:
文字:“stuff4”
:
id:屏幕管理器
屏幕温度:屏幕温度
屏幕灯:屏幕灯
屏幕能量:屏幕能量
屏幕天气:屏幕天气
屏幕温度:
识别号:屏幕
名称:“thermo”
经理:屏幕管理器
屏幕灯:
id:屏幕灯
名称:“光”
经理:屏幕管理器
屏幕能量:
id:screen_energy
名称:“能源”
经理:屏幕管理器
屏幕天气:
id:screen_天气
名称:“天气”
经理:屏幕管理器
输出

感谢您的精彩回复!这解决了我的问题!
    Button:
        size_hint_y: 0.1
        text: "Nothing"
Manager:
    id: screen_manager
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()
#: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