2016-05-10 10 views
0

Hintergrund: Ich habe gelernt Python - und durch sie - Kivy, indem Sie eine App. Ich habe die .kv-Datei und die Builder.load_string-Methoden verwendet, um meine Grafiken zu erstellen, habe mich aber dafür entschieden, ausschließlich Python zu verwenden und alle meine Layouts in Python zu verschieben.So rufen Sie den Kivy-Bildschirmmanager auf. <property> mit Python

Das Problem: Als ich begann, Bildschirme zu verwenden, konnte ich nicht den richtigen Code an die Schaltflächen binden, um die Bildschirme zu übergehen. Wenn ich die Zeile schreibe, zeigt "self.manager.etc ..." auto-complete eine Liste der gültigen Eigenschaften an, die verwendet werden sollen.

Also nach "Selbst." Es zeigt, dass ich "Manager" und nach "Manager" verwenden kann. es glaubt nicht, dass der Manager des Bildschirms eine Eigenschaft "aktuell" oder "Übergang" hat. Ich muss versagt haben, wie ich den Bildschirm mit dem Manager verbunden habe, aber ich kann nicht ergründen, wie.

class HomePage(Screen): 
    def __init__(self, **kwargs): 
     super(HomePage, self).__init__(**kwargs) 

     layout = FloatLayout() 

     notification = Label(text='upcoming: ....', font_size='16sp', size_hint=(0,0), pos_hint={'center_x':.5, 'top':0.9}) 
     layout.add_widget(notification) 

     button_row=BoxLayout(size_hint_y=.1, spacing=20) 

     profile_button=Label(text='Profile') 
     button_row.add_widget(profile_button) 

     layout.add_widget(button_row) 
     self.add_widget(layout) 

     def transit(): 
      self.manager.current = profile_button # <- this should work, right? 

     profile_button.bind(on_press=transit) 

class ScreenApp(App): 
    def build(self): 
     sm = ScreenManager() 
     sm.add_widget(HomePage(name='home')) 
     return sm 

if __name__ == "__main__": 
    ScreenApp().run() 

Antwort

1

Sie sollten den Übergang

from kivy.uix.screenmanager import Screen, ScreenManager, FadeTransition 

in Ihrer Importe hinzufügen und im Builder

class ScreenApp(App): 
    def build(self): 
     sm = ScreenManager(transition=FadeTransition()) 

wie für die aktuelle übergeben Sie einen zweiten Bildschirm hinzufügen sollte, ihm einen Namen geben und verwenden Sie diesen Namen, um zu diesem Bildschirm zu wechseln.aus https://github.com/kivy/kivy/blob/master/kivy/uix/screenmanager.py

Standardmäßig wird der zuerst hinzugefügte Bildschirm angezeigt. Wenn Sie einen anderen anzeigen möchten, legen Sie einfach die Eigenschaft 'current' fest. sm.current = 'zweite'

Auch eine String-Eigenschaft aktuell ist, können Sie einstellen, es nicht zu einem Label

: attr: current ist: Klasse: ~kivy.properties.StringProperty und Standardwerte Keine.

So Ihren vollständigen Code so etwas wie

sein sollte
from kivy.app import App 
from kivy.uix.boxlayout import BoxLayout 
from kivy.uix.button import Button 
from kivy.uix.floatlayout import FloatLayout 
from kivy.uix.label import Label 
from kivy.uix.screenmanager import Screen, ScreenManager, FadeTransition 


class HomePage(Screen): 
    def __init__(self, **kwargs): 
     super(HomePage, self).__init__(**kwargs) 

     layout = FloatLayout() 

     notification = Label(text='upcoming: ....', font_size='16sp', size_hint=(0,0), pos_hint={'center_x':.5, 'top':0.9}) 
     layout.add_widget(notification) 

     button_row=BoxLayout(size_hint_y=.1, spacing=20) 

     profile_button=Button(text='Profile') # changed to a button 
     button_row.add_widget(profile_button) 
     profile_button.bind(on_press=self.transit) # moved here the bind action 
     layout.add_widget(button_row) 
     self.add_widget(layout) 

    def transit(self, *args): 
     # unintended to become a class method and reference to it with self 
     print "ok" 
     self.manager.current = "screen2" 


class ProfilePage(Screen): 
    def __init__(self, **kwargs): 
     super(ProfilePage, self).__init__(**kwargs) 
     layout = FloatLayout() 
     labelP = Label(text="Profile Page") 
     layout.add_widget(labelP) 
     self.add_widget(layout) 




class ScreenApp(App): 
    def build(self): 
     sm = ScreenManager(transition=FadeTransition()) 
     # create the first screen 
     screen1 = HomePage(name='Home') #your home page 
     screen2 = ProfilePage(name='screen2') # the second screen 
     sm.add_widget(screen1) 
     sm.add_widget(screen2) 
     return sm 

if __name__ == "__main__": 
    ScreenApp().run() 
+0

Ok, ich war in der Lage es mit ein paar Änderungen zum Laufen zu bringen, was Sie hier haben. Neue Frage/Problem, aber in gleicher Weise. Der Manager hat keine .transition-Eigenschaft. Wenn ich also SlideTransition verwende, wird für jeden Übergang nur eine Folie verschoben. Ich weiß, dass es eine ".transition" -Eigenschaft hat, aber mein Compiler denkt wieder, dass es nicht existiert. – jdanaher

+0

Ich konnte die profile_button nicht oberhalb der Transit-Methodendeklaration binden, da der Compiler dachte, Transit existiere zu diesem Zeitpunkt nicht. Und schließlich passierte das Transit-Selbst, wenn es an den Knopf gebunden war, den Knopf anstelle des Bildschirms. Das Entfernen des Selbst und die Verwendung von def transit (* args) funktionierte wie ein Zauber. – jdanaher

+0

EDIT: vergiss, ich habe endlich Zugriff auf die Übergangseigenschaft! – jdanaher