Python 为什么我的Kivy Actionbar不见了?
晚上好, 我正在尝试将kivy的actionbar与屏幕管理器结合起来。我已经到了可以在屏幕间切换的地步,但无法让我的actionbar显示出来。我列举了很多例子,但没有一个能帮助我解决问题。我对kivy还比较陌生,所以我已经很长时间没有使用它了。 我想知道是否有人能指出我的问题所在,因为我正试图用一个操作栏构建自己的GUI,让我可以在屏幕之间切换。 这是我的main.py: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
#!/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