Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 15, 2022 18:57:07

KoshMariK
Зарегистрирован: 2022-10-15
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Нуждаюсь в помощи!

Здравствуйте! Пытаюсь написать приложение с математическими и логическими задачами. Когда ввожу ответ на задачу, выдаёт AttributeError: ‘NoneType’ object has no attribute ‘ids’. Ошибка скорее всего где-то здесь

 class ThirdScreen(Screen):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.my_screen = Builder.load_string('<ThirdScreen>')
        return self.my_screen
    
    def otvet(self, text):
        n = [ '- Устный счёт -', '- Скорость Пети -', '- Пять кружков -', '- Зарплата -']
        otvety = {1 : '1', 2 : '4 часа', 3 : '1 Вечер', 4 : '225 рублей'}
        if text == otvety[n.index(self.my_screen.ids.my_name) + 1]:
            self.manager.current = 'Four'
но я понятия не имею, где именно и как её исправить. Буду рада любой помощи, спасибо.

Вот код целиком:
 import kivy
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder
from kivy.uix.gridlayout import GridLayout
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.textinput import TextInput
Builder.load_string('''
<MainScreen>:
    BoxLayout:
        orientation: 'vertical'
        padding: 90
        spacing: 40
    
        Label:
            text: 'Название приложения'
            font_size: 30
            
        Button:
            size_hint: 1, 0.4
            text: 'Математические задачи'
            on_release:
                root.manager.current = 'Second'
        Button:
            size_hint: 1, 0.4
            text: 'Логические задачи'
            
<SecondScreen>:
    BoxLayout:
        orientation: 'vertical'
        spacing: 20
        
        Button:
            size_hint: 0.2, 0.1
            pos_hint:{'x': 0.01, 'top': 0.1}
            text: '<Назад'
            on_release:
                root.manager.current = 'Main'
        Label:
            size_hint: 1, 0.2
            text: 'Математические задачи'
            font_size: 22
            
        GridLayout:
            rows: 2
            padding: 40
            Button:
                text: '1'
                on_release:
                    root.manager.screens[2].ids.my_name.text = '- Устный счёт -'
                    root.manager.screens[2].ids.my_label.text = root.zadachy[1]
                    root.manager.current = 'Third'
            Button:
                text: '2'
                on_release:
                    root.manager.screens[2].ids.my_name.text = '- Скорость Пети -'
                    root.manager.screens[2].ids.my_label.text = root.zadachy[2]
                    root.manager.current = 'Third'
            Button:
                text: '3'
                on_release:
                    root.manager.screens[2].ids.my_name.text = '- Пять кружков -'
                    root.manager.screens[2].ids.my_label.text = root.zadachy[3]
                    root.manager.current = 'Third'
            
            Button:
                text: '4'
                on_release:
                    root.manager.screens[2].ids.my_name.text = '- Зарплата -'
                    root.manager.screens[2].ids.my_label.text = root.zadachy[4]
                    root.manager.current = 'Third'
<ThirdScreen>:
    BoxLayout:
        orientation: 'vertical'
        
        Button:
            size_hint: 0.2 , 0.1
            pos_hint: {'x': 0.01, 'top': 0.1}
            text: '<Назад'
            on_release:
                root.manager.current = 'Second'
        Label:
            id: my_name
            size_hint: 1, 0.2
            text: 'Название задачи'
            font_size: 20
            
        Label:
            text_size: self.width - 200, None
            id: my_label
            text: ''
        
        TextInput:
            id: my_text
            size_hint: 0.8, 0.1
            pos_hint: {'x': 0.1, 'y': 0.2}
            multiline: False
            on_text:
                root.otvet(self.text)
<FourScreen>:
    BoxLayout:
        Button:
            id: _n
            text: 'Верно!'
            on_release:
                root.manager.current = 'Second' 
''')
class MainScreen(Screen):
    pass
class SecondScreen(Screen):             
    zadachy = {1 : 'Чему равна одна треть от одной четвёртой от одной пятой от половины от 120?', 2 : 'Петя пошел из лагеря в город. В 12 часов, в N км от лагеря, его догнал велосипедист и подвез его немного. Затем велосипедист высадил Петю в N км от города, и в 14 часов Петя добрался до города. Сколько времени потратит Петя на обратную дорогу пешком, если известно, что скорость велосипедиста в два раза больше скорости Пети?', 3 : 'В школе 5 кружков: политкружок, военный, фотографический, шахматный и хоровой. Политкружок занимается через день, военный - через 2 дня на 3-й; фотографический - каждый 4-й день, шахматный - каждый 5-й день и хоровой - каждый 6-й день. Первого января в школе собрались все 5 кружков, а затем занятия велись в назначенные по плану дни. Сколько в первом квартале было ещё вечеров, когда собирались все 5 кружков, при условии, что год не является високосным?', 4 : 'Заработок Кости за последний месяц вместе со сверхурочными составляет 250 рублей. основная плата на 200 рублей больше, чем сверхурочные. Чему равна основная плата?'} 
class ThirdScreen(Screen):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.my_screen = Builder.load_string('<ThirdScreen>')
        return self.my_screen
    
    def otvet(self, text):
        n = [ '- Устный счёт -', '- Скорость Пети -', '- Пять кружков -', '- Зарплата -']
        otvety = {1 : '1', 2 : '4 часа', 3 : '1 Вечер', 4 : '225 рублей'}
        if text == otvety[n.index(self.my_screen.ids.my_name) + 1]:
            self.manager.current = 'Four'
class FourScreen(Screen):
    pass
class MainApp(App):
    def build(self):
        sm = ScreenManager()
        sm.add_widget(MainScreen(name = 'Main'))
        sm.add_widget(SecondScreen(name = 'Second'))
        sm.add_widget(ThirdScreen(name = 'Third'))
        sm.add_widget(FourScreen(name = 'Four'))
        return sm
    
if __name__ == '__main__':
    MainApp().run()

Отредактировано KoshMariK (Окт. 15, 2022 18:59:20)

Офлайн

#2 Окт. 16, 2022 03:23:25

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9874
Репутация: +  854  -
Профиль   Отправить e-mail  

Нуждаюсь в помощи!

KoshMariK
 AttributeError: 'NoneType' object has no attribute 'ids'
Попробуй там в методе otvet() ids заменить на id.



Отредактировано py.user.next (Окт. 16, 2022 03:24:36)

Офлайн

#3 Окт. 16, 2022 09:55:21

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1359
Репутация: +  119  -
Профиль   Отправить e-mail  

Нуждаюсь в помощи!

KoshMariK
но я понятия не имею, где именно и как её исправить. Буду рада любой помощи, спасибо.
заменить на это
  
class ThirdScreen(Screen):
    def otvet(self, text):
        n = ['- Устный счёт -', '- Скорость Пети -', '- Пять кружков -', '- Зарплата -']
        otvety = {1: '1', 2: '4 часа', 3: '1 Вечер', 4: '225 рублей'}
        if text == otvety[n.index(self.ids.my_name.text) + 1]:
            self.manager.current = 'Four'

Офлайн

#4 Окт. 16, 2022 10:35:06

KoshMariK
Зарегистрирован: 2022-10-15
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Нуждаюсь в помощи!

xam1816
заменить на это
 class ThirdScreen(Screen):
    def otvet(self, text):
        n = ['- Устный счёт -', '- Скорость Пети -', '- Пять кружков -', '- Зарплата -']
        otvety = {1: '1', 2: '4 часа', 3: '1 Вечер', 4: '225 рублей'}
        if text == otvety[n.index(self.ids.my_name.text) + 1]:
            self.manager.current = 'Four'
Теперь выдаёт другую ошибку ValueError: <WeakProxy to <kivy.uix.label.Label object at 0x0000004B901C5580>> is not in list

Офлайн

#5 Окт. 16, 2022 10:42:03

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1359
Репутация: +  119  -
Профиль   Отправить e-mail  

Нуждаюсь в помощи!

у меня работает сейчас проверил на первой задаче
скопируйте вставте полностью

  
import kivy
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder
from kivy.uix.gridlayout import GridLayout
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.textinput import TextInput
Builder.load_string('''
<MainScreen>:
    BoxLayout:
        orientation: 'vertical'
        padding: 90
        spacing: 40
        Label:
            text: 'Название приложения'
            font_size: 30
        Button:
            size_hint: 1, 0.4
            text: 'Математические задачи'
            on_release:
                root.manager.current = 'Second'
        Button:
            size_hint: 1, 0.4
            text: 'Логические задачи'
<SecondScreen>:
    BoxLayout:
        orientation: 'vertical'
        spacing: 20
        Button:
            size_hint: 0.2, 0.1
            pos_hint:{'x': 0.01, 'top': 0.1}
            text: '<Назад'
            on_release:
                root.manager.current = 'Main'
        Label:
            size_hint: 1, 0.2
            text: 'Математические задачи'
            font_size: 22
        GridLayout:
            rows: 2
            padding: 40
            Button:
                text: '1'
                on_release:
                    root.manager.screens[2].ids.my_name.text = '- Устный счёт -'
                    root.manager.screens[2].ids.my_label.text = root.zadachy[1]
                    root.manager.current = 'Third'
            Button:
                text: '2'
                on_release:
                    root.manager.screens[2].ids.my_name.text = '- Скорость Пети -'
                    root.manager.screens[2].ids.my_label.text = root.zadachy[2]
                    root.manager.current = 'Third'
            Button:
                text: '3'
                on_release:
                    root.manager.screens[2].ids.my_name.text = '- Пять кружков -'
                    root.manager.screens[2].ids.my_label.text = root.zadachy[3]
                    root.manager.current = 'Third'
            Button:
                text: '4'
                on_release:
                    root.manager.screens[2].ids.my_name.text = '- Зарплата -'
                    root.manager.screens[2].ids.my_label.text = root.zadachy[4]
                    root.manager.current = 'Third'
<ThirdScreen>:
    BoxLayout:
        orientation: 'vertical'
        Button:
            size_hint: 0.2 , 0.1
            pos_hint: {'x': 0.01, 'top': 0.1}
            text: '<Назад'
            on_release:
                root.manager.current = 'Second'
        Label:
            id: my_name
            size_hint: 1, 0.2
            text: 'Название задачи'
            font_size: 20
        Label:
            text_size: self.width - 200, None
            id: my_label
            text: ''
        TextInput:
            id: my_text
            size_hint: 0.8, 0.1
            pos_hint: {'x': 0.1, 'y': 0.2}
            multiline: False
            on_text:
                root.otvet(self.text)
<FourScreen>:
    BoxLayout:
        Button:
            id: _n
            text: 'Верно!'
            on_release:
                root.manager.current = 'Second' 
''')
class MainScreen(Screen):
    pass
class SecondScreen(Screen):
    zadachy = {1: 'Чему равна одна треть от одной четвёртой от одной пятой от половины от 120?',
               2: 'Петя пошел из лагеря в город. В 12 часов, в N км от лагеря, его догнал велосипедист и подвез его немного. Затем велосипедист высадил Петю в N км от города, и в 14 часов Петя добрался до города. Сколько времени потратит Петя на обратную дорогу пешком, если известно, что скорость велосипедиста в два раза больше скорости Пети?',
               3: 'В школе 5 кружков: политкружок, военный, фотографический, шахматный и хоровой. Политкружок занимается через день, военный - через 2 дня на 3-й; фотографический - каждый 4-й день, шахматный - каждый 5-й день и хоровой - каждый 6-й день. Первого января в школе собрались все 5 кружков, а затем занятия велись в назначенные по плану дни. Сколько в первом квартале было ещё вечеров, когда собирались все 5 кружков, при условии, что год не является високосным?',
               4: 'Заработок Кости за последний месяц вместе со сверхурочными составляет 250 рублей. основная плата на 200 рублей больше, чем сверхурочные. Чему равна основная плата?'}
class ThirdScreen(Screen):
    def otvet(self, text):
        n = ['- Устный счёт -', '- Скорость Пети -', '- Пять кружков -', '- Зарплата -']
        otvety = {1: '1', 2: '4 часа', 3: '1 Вечер', 4: '225 рублей'}
        if text == otvety[n.index(self.ids.my_name.text) + 1]:
            self.manager.current = 'Four'
class FourScreen(Screen):
    pass
class MainApp(App):
    def build(self):
        sm = ScreenManager()
        sm.add_widget(MainScreen(name='Main'))
        sm.add_widget(SecondScreen(name='Second'))
        sm.add_widget(ThirdScreen(name='Third'))
        sm.add_widget(FourScreen(name='Four'))
        return sm
if __name__ == '__main__':
    MainApp().run()

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version