Найти - Пользователи
Полная версия: Нуждаюсь в помощи!
Начало » Python для новичков » Нуждаюсь в помощи!
1
KoshMariK
Здравствуйте! Пытаюсь написать приложение с математическими и логическими задачами. Когда ввожу ответ на задачу, выдаёт 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()
py.user.next
KoshMariK
 AttributeError: 'NoneType' object has no attribute 'ids'
Попробуй там в методе otvet() ids заменить на id.
xam1816
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'
KoshMariK
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
xam1816
у меня работает сейчас проверил на первой задаче
скопируйте вставте полностью
  
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()
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB