Ich versuche, einen ScreenManager in einem BoxLayout arbeiten zu lassen, damit ich unter jedem Bildschirm eine feste Toolbox haben kann. Ich habe es geschafft, den ersten Bildschirm zu zeigen (danke an this question), aber wenn ich versuche, auf den anderen Bildschirm zu switchen, stürzt die App ab und sagt, dass es keinen anderen Bildschirm gibt.Switch Screenmanager im Layout
Eigentlich gibt es wirklich keinen anderen Bildschirm: beide Drucke innerhalb des ScreenManagements init zeigt nichts. Und ich weiß nicht warum.
Ohne die Toolbar (nur mit dem ScreeManager (ment) und den notwendigen Verbesserungen im Code, natürlich) funktioniert alles gut.
Ich habe versucht, add_widget zum ScreenManagement und die Screen-Namen wurde ausgefüllt, aber ich konnte nicht zwischen den Bildschirmen wechseln.
Was ich vermisse?
Der letzte Teil des Fehlers:
screen = self.get_screen(value)
File "C:\Python27\lib\site-packages\kivy\uix\screenmanager.py", line 944, in get_screen
raise ScreenManagerException('No Screen with name "%s".' % name)
ScreenManagerException: No Screen with name "init".
7 Windows Python 2.7, Kivy 1.9.1
Hier ist der ClassApp.py:
import kivy
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import ScreenManager, Screen, NoTransition
from kivy.clock import Clock
#just solving my weak GPU issue
from kivy import Config
Config.set('graphics', 'multisamples', '0')
kivy.require('1.9.1')
class Init(Screen):
pass
class Menu(Screen):
pass
class ScreenManagement(ScreenManager):
def __init__(self,**kwargs):
print('before super: ', self.screen_names)
super(ScreenManagement,self).__init__(**kwargs)
print('after super: ', self.screen_names)
def switch_to_menu(self):
self.current = 'menu'
print('going to menu')
def switch_to_init(self):
self.current = 'init'
print('going to init')
class ClassAllScreen(BoxLayout):
sm = ScreenManagement()
sm.transition = NoTransition()
pass
class ClassApp(App):
def build(self):
self.root = ClassAllScreen()
return self.root
if __name__ == '__main__':
ClassApp().run()
Und hier die Klasse .kv:
<Init>: #first Screen
name: 'init'
BoxLayout:
orientation:'vertical'
padding:20
spacing:10
Button:
text:'uppest'
GridLayout:
spacing:10
cols:2
Button:
text:'upper left'
Button:
text:'upper right'
Button:
text:'bottom left'
Button:
text:'bottom right'
Button:
text:'bottomest: go to menu'
on_press:app.root.sm.switch_to_menu()
<Menu>: #second Screen
name: 'menu'
BoxLayout:
orientation:'vertical'
padding:20
spacing:10
GridLayout:
spacing:10
cols:2
Button:
text:'upper left'
Button:
text:'upper right'
Button:
text:'bottom left'
Button:
text:'bottom right'
Button:
text:'bottomy'
Button:
text:'bottomest: go to init'
on_press:app.root.sm.switch_to_init()
<ScreenManagement>: #including both the Screens in ScreenManager
Menu:
Init:
<ClassAllScreen>: #all the display with ScreenManager and "Toolbar"
orientation:'vertical'
ScreenManagement:
BoxLayout:
size_hint_y: None
height: 60
spacing: 5
padding: 5,5,0,5
canvas:
Color:
rgba: .1,.1,.1,1
Rectangle:
pos: self.pos
size: self.size
Button:
text:'1'
size_hint_x: None
width: 60
Button:
text:'2'
size_hint_x: None
width: 60
Button:
text:'3'
size_hint_x: None
width: 60
Danke für die Antwort. Aber obwohl der Ausdruck sagt, dass ich einen Bildschirm namens "Menü" habe, tritt der Fehler immer noch auf: "ScreenManagerException: Kein Bildschirm mit Namen" -Menü "." –
@HenriqueGarcia versuchen Sie es jetzt. Beantworten Sie die Antwort. Habe vergessen die Namen 'self.add_widget (Init (name = "init")) '' – EL3PHANTEN
einzustellen Es wird kein Fehler angezeigt, aber der Bildschirm schaltet nicht um. Der self.current wechselt von 'init' zu 'menu', aber die GUI bleibt gleich. Und warum muss ich den Namen an den Screen-Konstruktor übergeben? Es ist bereits in der kv-Datei eingestellt .... –