Нет экрана с именем «new_screen»

#python-3.x #kivy

#python-3.x #kivy

Вопрос:

У меня возникла проблема, которая заключается в том, что при нажатии кнопки «Получить экран случайного цвета» он должен добавить виджет экрана и переключиться на экран с именем «new_screen». Вместо этого он выдает мне сообщение об ошибке, в котором говорится, что нет экрана с именем «new_screen.

 from kivy.app import App
from kivy.base import runTouchApp
from kivy.lang import Builder
from kivy.properties import ListProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
import time
import random

class FirstScreen(Screen):
    pass

class SecondScreen(Screen):
    pass

class ColourScreen(Screen):
    colour = ListProperty([1., 0., 0., 1.])

class MyScreenManager(ScreenManager):
    def new_colour_screen(self):
        self.add_widget(ColourScreen(name="new_screen",colour=[random.random() for _ in range(3)]   [1]))
        self.current = "new_screen"

root_widget = Builder.load_string('''
#:import FadeTransition kivy.uix.screenmanager.FadeTransition

MyScreenManager:
    transition: FadeTransition()
    FirstScreen:
    SecondScreen:

<FirstScreen>:
    name: 'first'
    BoxLayout:
        orientation: 'vertical'
        Label:
            text: 'first screen!'
            font_size: 30
        Image:
            source: 'colours.png'
            allow_stretch: True
            keep_ratio: False
        BoxLayout:
            Button:
                text: 'goto second screen'
                font_size: 30
                on_release: app.root.current = 'second'
            Button:
                text: 'get random colour screen'
                font_size: 30
                on_release: app.root.new_colour_screen()

<SecondScreen>:
    name: 'second'
    BoxLayout:
        orientation: 'vertical'
        Label:
            text: 'second screen!'
            font_size: 30
        Image:
            source: 'colours2.png'
            allow_stretch: True
            keep_ratio: False
        BoxLayout:
            Button:
                text: 'goto first screen'
                font_size: 30
                on_release: app.root.current = 'first'
            Button:
                text: 'get random colour screen'
                font_size: 30
                on_release: app.root.new_colour_screen()

<ColourScreen>:
    BoxLayout:
        orientation: 'vertical'
        Label:
            text: 'colour {:.2},{:.2},{:.2} screen'.format(*root.colour[:3])
            font_size: 30
        Widget:
            canvas:
                Color:
                    rgba: root.colour
                Ellipse:
                    pos: self.pos
                    size: self.size
        BoxLayout:
            Button:
                text: 'goto first screen'
                font_size: 30
                on_release: app.root.current = 'first'
            Button:
                text: 'get random colour screen'
                font_size: 30
                on_release: app.root.new_colour_screen()

''')

class ScreenManagerApp(App):
    def build(self):
        return root_widget

ScreenManagerApp().run()
  

Комментарии:

1. Кажется, у меня работает. Обратите внимание, что если вы нажмете на свою get random colour screen кнопку более одного раза, вы создадите несколько ColourScreens с одним и тем же name именем. Не очень хорошая идея.

2. Почему он все еще выдает мне ошибку >< есть ли что-нибудь, что я должен проверить?

3. Странно. Попробуйте заменить содержимое вашего new_colour_screen() метода всего одной строкой: self.switch_to(ColourScreen(name="new_screen",colour=[random.random() for _ in range(3)] [1])) .

4. Это работает, еще раз спасибо