Форум сайта python.su
Здравствуйте! Пытаюсь написать приложение с математическими и логическими задачами. Когда ввожу ответ на задачу, выдаёт 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)
Офлайн
KoshMariKПопробуй там в методе otvet() ids заменить на id.AttributeError: 'NoneType' object has no attribute 'ids'
Отредактировано py.user.next (Окт. 16, 2022 03:24:36)
Офлайн
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'
Офлайн
xam1816Теперь выдаёт другую ошибку ValueError: <WeakProxy to <kivy.uix.label.Label object at 0x0000004B901C5580>> is not in list
заменить на это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'
Офлайн
у меня работает сейчас проверил на первой задаче
скопируйте вставте полностью
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()
Офлайн