[英]Kivy Using a ScreenManager from kv file
I'm writing a kivy program/game. 我在写一个奇异的程序/游戏。 I've made one before, but was only 1 screen in total. 我以前做过一个,但总共只有1个屏幕。 I've started developing a new program with ideas of implementing a Screen Manager
. 我已经开始开发一个新程序,其中包含实现“ Screen Manager
想法。 I managed to build the Screen Manager
inside of the python file, but it wasn't suitable for my long term usage, and I wanted to try my hand at a Screen Manager
from the .kv file
. 我设法在python文件中构建了Screen Manager
,但是它不适合我的长期使用,所以我想从.kv file
尝试一下Screen Manager
。
Any guidance will be greatly appreciated, not sure what I missed. 任何指导将不胜感激,不确定我错过了什么。 I looked at this questionv( Kivy - Screen Manager - Accessing attribute in other class ), and pieced together what I thought was right, but still can't get a screen to load - I feel this is a simple answer and I'm being blind... 我看着这个问题v ( Kivy-屏幕管理器-访问其他类的属性 ),拼凑出我认为正确的内容,但仍然无法加载屏幕-我觉得这是一个简单的答案,我正在盲...
main.py; main.py;
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
class MenuScreen(Screen):
pass
class NewGameScreen(Screen):
pass
class LoadGameScreen(Screen):
pass
class ASCIILifeApp(App):
pass
if __name__ == "__main__":
ASCIILifeApp().run()
ASCIILife.kv; ASCIILife.kv;
#: kivy 1.9
#: import ScreenManager kivy.uix.screenmanager.ScreenManager
#: import Screen kivy.uix.screenmanager.ScreenManager
#: import NewGameScreen screen
#: import LoadGameScreen screen
ScreenManager:
id: screen_manager
#transition: FadeTransition()
MenuScreen:
id: menu_screen
name: 'MenuScreen'
manager: 'screen_manager'
NewGameScreen:
id: newgame_screen
name: 'NewGameScreen'
manager: 'screen_manager'
LoadGameScreen:
id: loadgame_screen
name: 'LoadGameScreen'
manager: 'screen_manager'
<MenuScreen>:
BoxLayout:
orientation: 'vertical'
Label:
text: 'ASCII Life'
font_size: 50
Button:
text: 'New Game'
font_size: 30
on_release: app.root.current = 'newgame'
Button:
text: 'Load Game'
font_size: 30
on_release: app.root.current = 'loadgame'
Button:
text: 'Settings'
font_size: 30
on_release: app.root.current = 'something'
<NewGameScreen>:
BoxLayout:
orientation: 'vertical'
BoxLayout:
orientation: 'vertical'
Label:
text: 'Game Length in Days'
font_size: 30
BoxLayout:
orientation: 'horizontal'
ToggleButton:
text: '100'
state: 'down'
group: 'newgame_days'
font_size: 30
ToggleButton:
text: '200'
group: 'newgame_days'
font_size: 30
BoxLayout:
orientation: 'horizontal'
ToggleButton:
text: '365'
group: 'newgame_days'
font_size: 30
ToggleButton:
text: '3650'
group: 'newgame_days'
font_size: 30
ToggleButton:
text: 'Unlimited'
group: 'newgame_days'
font_size: 30
BoxLayout:
orientation: 'vertical'
size_hint: (1, .5)
Label:
text: 'Difficulty (Score Multiplier)'
font_size: 30
BoxLayout:
orientation: 'horizontal'
ToggleButton:
text: 'Easy (x1)'
state: 'down'
group: 'newgame_difficulty'
font_size: 30
ToggleButton:
text: 'Medium (x2.5)'
group: 'newgame_difficulty'
font_size: 30
ToggleButton:
text: 'Hard (x5)'
group: 'newgame_difficulty'
font_size: 30
<LoadGameScreen>:
BoxLayout:
orientation: 'vertical'
Label:
text: 'load a game'
font_size: 30
Widget:
canvas:
Ellipse:
pos: self.pos
size: self.size
BoxLayout:
Button:
text: 'Menu'
font_size: 30
on_release: app.root.current = 'menu'
Button:
text: 'text'
font_size: 30
Edit: Truncated kv file 编辑:截断的kv文件
The answer was using a builder to build the kv file. 答案是使用构建器来构建kv文件。 Knew it was something simple. 知道这很简单。 File below; 以下文件;
main.py main.py
#!/usr/bin/kivy
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
from kivy.properties import ObjectProperty
class MenuScreen(Screen):
pass
class NewGameScreen(Screen):
pass
class LoadGameScreen(Screen):
pass
class ScreenManager(ScreenManager):
pass
buildKV = Builder.load_file("ASCIILife.kv")
class ASCIILifeApp(App):
def build(self):
return buildKV
if __name__ == "__main__":
ASCIILifeApp().run()
To elaborate on Chazara's findings: 详细阐述Chazara的发现:
Either rename the kv code file according to the naming convension: 无论是根据命名convension重命名KV代码文件:
Kivy looks for a Kv file with the same name as your App class in lowercase, minus “App” if it ends with 'App'. Kivy以小写形式查找与您的App类同名的Kv文件,如果以'App'结尾,请减去“ App”。
From the documentation: how to load kv language 从文档: 如何加载kv语言
Or just make it explicit with the builder function: 或者只是通过builder函数使其明确:
Builder.load_file('path/to/file.kv')
To elaborate on Chazara's findings even more: i tested the code from Chazara with kivy 1.10.1dev0 and Python 3.6; 为了进一步详细说明Chazara的发现:我使用kivy 1.10.1dev0和Python 3.6测试了Chazara的代码; i got an error saying: 我收到一个错误消息:
kivy.uix.screenmanager.ScreenManagerException: No Screen with name "something".
to fix it, i changed in the .kv file 要修复它,我在.kv文件中进行了更改
[...]
Button:
text: 'New Game'
font_size: 30
on_release: app.root.current = 'newgame'
[...]
to: 至:
[...]
Button:
text: 'New Game'
font_size: 30
on_release: app.root.current = 'NewGameScreen'
[...]
it references the name of NewGameScreen given in the ScreenManager 它引用了ScreenManager中给定的NewGameScreen的名称
ScreenManager:
[...]
NewGameScreen:
id: newgame_screen
*name: 'NewGameScreen'*
manager: 'screen_manager'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.