Python Kivy 覆盖方法

Python Kivy Overwritting method

我尽量减少了示例,但它看起来很空,之后问题也不完全一样。

我想我误解了关于 class 变量和实例变量的事情,但是 Kivy 在这方面没有帮助我:我们创建了很多 class 但从未实例化它们!

当然我希望出现“Screenx 实例已覆盖问题”消息,而我只看到“未覆盖”。

calendrier.py

from kivy.properties import StringProperty
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.clock import Clock

class Menu(Screen):
    pass

class CalculGenerique(Screen):
    question = StringProperty()

    def __init__(self, **kwargs):
        super(CalculGenerique, self).__init__(**kwargs)
        Clock.schedule_once(self.late_init, 0)

    def late_init(self, *largs):
        self.renew_question()

    def renew_question(self):
        self.question = "Not overwritten"

class Screen1(CalculGenerique):
    def renew_question(self):
        self.question = "Screen1 instance has overwritten question"

class Screen2(CalculGenerique):
    def renew_question(self):
        self.question = "Screen2 instance has overwritten question"

class MyScreenManager(ScreenManager):
    pass

class CalendarApp(App):

    def build(self):
        root_widget = Builder.load_file("calendrier.kv")
        return root_widget

if __name__ == "__main__":
    app = CalendarApp()
    app.run()

calendrier.kv

#:import App kivy.app.App

MyScreenManager:
    Menu:
    CalculGenerique:
        name: 'Screen1'
    CalculGenerique:
        name: 'Screen2'

<Menu>:
    name: 'Menu'
    BoxLayout:
        orientation: 'vertical'

        Button:
            text: 'Screen1'
            on_press : app.root.current = 'Screen1'

        Button:
            text: 'Screen2'
            on_press : app.root.current = 'Screen2'

        Button:
            text: 'Quitter l app'
            on_press : App.get_running_app().stop()

<CalculGenerique@Screen>:
    BoxLayout:
        orientation: 'vertical'
        Button:
            text: 'Back to Menu'
            on_press : app.root.current = 'Menu'
        Label:
            text: root.question

您的 'kv' 规则:

MyScreenManager:
    Menu:
    CalculGenerique:
        name: 'Screen1'
    CalculGenerique:
        name: 'Screen2'

创建 CalculGenerique class 的两个实例,但没有 Screen1Screen2 的实例。我认为您只需要将该规则更改为:

MyScreenManager:
    Menu:
    Screen1:
        name: 'Screen1'
    Screen2:
        name: 'Screen2'

一个Screenname属性只是用来标识Screen,并没有指定class.