Python - Kivy Screen Manager в файле .py - PullRequest
       12

Python - Kivy Screen Manager в файле .py

0 голосов
/ 20 ноября 2018

Я создаю многоэкранное приложение с Kivy, и я хотел бы использовать ScreenManager для навигации между несколькими экранами. Я видел примеры и документацию о том, как создавать экраны в файле .kv, но я хочу знать, как создавать их в файле .py.

  • Проблема: когда я создаю подклассы экрана, как показано ниже, мое приложение окно возвращает пустой экран.
  • Вопрос: Какой правильный способ создать подклассы Screen в файле .py?

Прямо сейчас у меня определены два подкласса Screen: 'welcomeScreen' и 'functionScreen'. Каждый состоит из макета с некоторыми виджетами.

kivy.require('1.9.1')
import kivy
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.floatlayout import FloatLayout
import kivy.uix.boxlayout
import kivy.uix.button
from kivy.uix.screenmanager import ScreenManager, Screen

class PanelBuilderApp(App):  # display the welcome screen

    def build(self):
        # Create the screen manager and add widgets to the base sm widget
        sm = kivy.uix.screenmanager.ScreenManager()
        sm.add_widget(Screen(name='welcomeScreen'))
        sm.add_widget(Screen(name='functionScreen'))
        # sm.current= 'welcomeScreen'
        return sm

class welcomeScreen(Screen): #welcomeScreen subclass

    def __init__(self, **kwargs): #constructor method
        super(welcomeScreen, self).__init__(**kwargs) #init parent
        welcomePage = FloatLayout()
        box = kivy.uix.boxlayout.BoxLayout(orientation='vertical', size_hint=(0.4, 0.3),
                                           padding=8, pos_hint={'top': 0.5, 'center_x': 0.5})

        welcomeLabel = Label(text='Hello and welcome to the Panel Builder version 1.0.\nApp by John Vorsten\nClick below to continue',
            halign= 'center', valign= 'center', size_hint= (0.4, 0.2), pos_hint= {'top': 1, 'center_x': 0.5})
        welcomeBox = kivy.uix.button.Button(text= 'Click to continue')
        welcomeBox.bind(on_press= self.callback)
        welcomeBox2 = kivy.uix.button.Button(text='not used')

        welcomePage.add_widget(welcomeLabel)
        box.add_widget(welcomeBox)
        box.add_widget(welcomeBox2)
        welcomePage.add_widget(box)
        self.add_widget(welcomePage)

    def callback(instance):
        print('The button has been pressed')
        sm.switch_to(Screen(name= 'functionScreen'))
        # sm.current = Screen(name= 'functionScreen')

class functionScreen(Screen):  #For later function navigation

    def __init__(self, **kwargs): #constructor method
        super(functionScreen, self).__init__(**kwargs) #init parent
        functionPage = kivy.uix.floatlayout.FloatLayout()

        functionLabel = Label(text='Welcome to the function page. Here you will choose what functions to use',
                              halign='center', valign='center', size_hint=(0.4,0.2), pox_hint={'top': 1, 'center_x': 0.5})

        functionPage.add_widget(functionLabel)
        self.add_widget(functionPage)

# sm.add_widget('Name') #Add more names later when you create more screens
# OR#
# for i in ScreenDirectory:
#     sm.add_widget(ScreenDirectory[i])

PanelBuilderApp().run()
if __name__ == '__main__':
    pass

Я понимаю, что могу добавить определения в файл .kv, и, вероятно, я буду делать это по мере роста приложения. Тем не менее, мне нравится быть откровенным, так как я учусь использовать kivy.

1 Ответ

0 голосов
/ 20 ноября 2018

Я думаю, что вы думаете, используя Screen(name='welcomeScreen'), вы используете welcomeScreen, но это не так, если вы хотите использовать welcomeScreen, вы должны использовать его напрямую.

С другой стороны, у вас есть типографскийошибки, которые я исправил, я рекомендую вам следовать руководствам по kivy, очевидно, у вас должна быть надежная база ООП (и я думаю, что у вас ее нет, поэтому ваша задача состоит в ее усилении).

import kivy
kivy.require('1.9.1')
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.screenmanager import ScreenManager, Screen

class PanelBuilderApp(App):  # display the welcome screen
    def build(self):
        sm = ScreenManager()
        sm.add_widget(WelcomeScreen(name='welcomeScreen'))
        sm.add_widget(FunctionScreen(name='functionScreen'))
        return sm

class WelcomeScreen(Screen): #welcomeScreen subclass
    def __init__(self, **kwargs): #constructor method
        super(WelcomeScreen, self).__init__(**kwargs) #init parent
        welcomePage = FloatLayout()
        box = BoxLayout(orientation='vertical', size_hint=(0.4, 0.3),
                                           padding=8, pos_hint={'top': 0.5, 'center_x': 0.5})
        welcomeLabel = Label(text='Hello and welcome to the Panel Builder version 1.0.\nApp by John Vorsten\nClick below to continue',
            halign= 'center', valign= 'center', size_hint= (0.4, 0.2), pos_hint= {'top': 1, 'center_x': 0.5})
        welcomeBox = Button(text= 'Click to continue', on_press=self.callback)
        welcomeBox2 = Button(text='not used')

        welcomePage.add_widget(welcomeLabel)
        box.add_widget(welcomeBox)
        box.add_widget(welcomeBox2)
        welcomePage.add_widget(box)
        self.add_widget(welcomePage)

    def callback(self, instance):
        print('The button has been pressed')
        self.manager.current = 'functionScreen'

class FunctionScreen(Screen):  #For later function navigation
    def __init__(self, **kwargs): #constructor method
        super(FunctionScreen, self).__init__(**kwargs) #init parent
        functionPage = FloatLayout()
        functionLabel = Label(text='Welcome to the function page. Here you will choose what functions to use',
                              halign='center', valign='center', size_hint=(0.4,0.2), pos_hint={'top': 1, 'center_x': 0.5})
        functionPage.add_widget(functionLabel)
        self.add_widget(functionPage)

if __name__ == '__main__':
    PanelBuilderApp().run()

enter image description here

enter image description here

...