Python для цикла AttributeError [дубликат] ⇐ Python
-
Anonymous
Python для цикла AttributeError [дубликат]
Я пытаюсь создать приложение-калькулятор на Python с использованием Pygame. Попробовал создать цикл, в котором он рисует кнопки из списка.
screen = pygame.display.set_mode((ширина, высота)) цифры = Кнопки.цифры символы = Кнопки.символы для i в символах, цифрах: Buttons.Button.drawButton(i,screen) #рисуем кнопки Кнопка класса: def __init__(self, x, y, символ): self.x = x #координаты self.y = y self.symbol = символ #+-/* защита drawButton(сам,экран): pygame.draw.rect(экран,белый,(self.x,self.y,100,100)) текст = font_large.render(self.symbol,True,(0,0,0)) screen.blit(текст,(self.x+38,self.y+35)) #цифровые кнопки num_0 = Кнопка (100 500, '0') num_1 = Кнопка (0,100, '1') num_2 = Кнопка(100,100,'2') num_3 = Кнопка(200,100,'3') num_4 = Кнопка (0,200, '4') num_5 = Кнопка (100 200, '5') num_6 = Кнопка (200 200, '6') num_7 = Кнопка (0,300, '7') num_8 = Кнопка(100,300,'8') num_9 = Кнопка (200 300, '9') #кнопки с символами s_plus = Кнопка(300,100,'+') s_minus = Кнопка(300,200,'-') s_div = Кнопка(300,300,'/') s_multi = Кнопка(300,400,'*') s_dot = Кнопка(200 500,'.') s_equals = Кнопка(300,500,'=') символы = [s_dot,s_plus,s_div,s_minus,s_equals,s_multi] числа = [номер_0,номер_1,номер_2,номер_3,номер_4,номер_5,номер_6,номер_7,номер_8,номер_9] Ожидал, что на экране будут нарисованы числа, но выдала следующую ошибку:
Traceback (самый последний вызов — последний): Файл «C:\Users\hsvdg\PycharmProjects\calculator_app\main.py», строка 23, в Buttons.Button.drawButton(i,экран) Файл «C:\Users\hsvdg\PycharmProjects\calculator_app\Buttons.py», строка 17, в drawButton pygame.draw.rect(экран,белый,(self.x,self.y,100,100)) AttributeError: объект «список» не имеет атрибута «x» Вот полный код:
#main импортировать pygame импортировать систему импортировать кнопки pygame.init() ширина, высота = 400, 600 экран = pygame.display.set_mode((ширина, высота)) pygame.display.set_caption("Калькулятор") белый = (255, 255, 255) черный = (0, 0, 0) серый = (200, 200, 200) font_small = pygame.font.Font (нет, 36) font_large = pygame.font.Font (нет, 48) цифры = Кнопки.цифры символы = Кнопки.символы для i в символах, цифрах: Buttons.Button.drawButton(i,screen) #рисуем кнопки # Класс калькулятора Калькулятор классов: защита __init__(сам): самовыражение = "" self.result = "" Защиту add_to_expression (я, значение): self.expression += str(значение) защитаclear_expression(self): самовыражение = "" защита Assessment_expression (сам): пытаться: self.result = str(eval(self.expression)) кроме Исключения: self.result = "Ошибка" Защитный дисплей (сам): pygame.draw.rect(экран, белый, (0, 0, ширина, 100)) pygame.draw.rect(экран, серый, (0, 100, ширина, высота - 100)) text_expression = font_large.render(self.expression, True, черный) text_rect_expression = text_expression.get_rect(center=(ширина // 2, 50)) screen.blit(text_expression, text_rect_expression) text_result = font_large.render(self.result, True, черный) text_rect_result = text_result.get_rect(center=(ширина // 2, 150)) screen.blit(text_result, text_rect_result) калькулятор = Калькулятор() пока правда: для события в pygame.event.get(): если event.type == pygame.QUIT: pygame.quit() sys.exit() если event.type == pygame.KEYDOWN: если event.key == pygame.K_RETURN: калькулятор.evaluate_expression() elif event.key == pygame.K_BACKSPACE: калькулятор.выражение = калькулятор.выражение[:-1] elif event.key == pygame.K_c: калькулятор.clear_expression() elif event.unicode.isdigit() или event.unicode в «+-*/.»: калькулятор.add_to_expression(event.unicode) # Обновление дисплея калькулятор.дисплей() # Экран обновления pygame.display.flip() # Ограничить частоту кадров pygame.time.Clock().тик(30) Класс кнопок:
импортировать pygame pygame.init() белый = (255, 255, 255) черный = (0, 0, 0) серый = (200, 200, 200) font_small = pygame.font.Font (нет, 36) font_large = pygame.font.Font (нет, 48) Кнопка класса: def __init__(self, x, y, символ): self.x = x #координаты self.y = y self.symbol = символ #+-/* защита drawButton(сам,экран): pygame.draw.rect(экран,белый,(self.x,self.y,100,100)) текст = font_large.render(self.symbol,True,(0,0,0)) screen.blit(текст,(self.x+38,self.y+35)) #цифровые кнопки num_0 = Кнопка (100 500, '0') num_1 = Кнопка (0,100, '1') num_2 = Кнопка(100,100,'2') num_3 = Кнопка(200,100,'3') num_4 = Кнопка (0,200, '4') num_5 = Кнопка (100 200, '5') num_6 = Кнопка (200 200, '6') num_7 = Кнопка (0,300, '7') num_8 = Кнопка(100,300,'8') num_9 = Кнопка (200 300, '9') #кнопки с символами s_plus = Кнопка(300,100,'+') s_minus = Кнопка(300,200,'-') s_div = Кнопка(300,300,'/') s_multi = Кнопка(300,400,'*') s_dot = Кнопка(200 500,'.') s_equals = Кнопка(300,500,'=') символы = [s_dot,s_plus,s_div,s_minus,s_equals,s_multi] числа = [номер_0,номер_1,номер_2,номер_3,номер_4,номер_5,номер_6,номер_7,номер_8,номер_9]
Я пытаюсь создать приложение-калькулятор на Python с использованием Pygame. Попробовал создать цикл, в котором он рисует кнопки из списка.
screen = pygame.display.set_mode((ширина, высота)) цифры = Кнопки.цифры символы = Кнопки.символы для i в символах, цифрах: Buttons.Button.drawButton(i,screen) #рисуем кнопки Кнопка класса: def __init__(self, x, y, символ): self.x = x #координаты self.y = y self.symbol = символ #+-/* защита drawButton(сам,экран): pygame.draw.rect(экран,белый,(self.x,self.y,100,100)) текст = font_large.render(self.symbol,True,(0,0,0)) screen.blit(текст,(self.x+38,self.y+35)) #цифровые кнопки num_0 = Кнопка (100 500, '0') num_1 = Кнопка (0,100, '1') num_2 = Кнопка(100,100,'2') num_3 = Кнопка(200,100,'3') num_4 = Кнопка (0,200, '4') num_5 = Кнопка (100 200, '5') num_6 = Кнопка (200 200, '6') num_7 = Кнопка (0,300, '7') num_8 = Кнопка(100,300,'8') num_9 = Кнопка (200 300, '9') #кнопки с символами s_plus = Кнопка(300,100,'+') s_minus = Кнопка(300,200,'-') s_div = Кнопка(300,300,'/') s_multi = Кнопка(300,400,'*') s_dot = Кнопка(200 500,'.') s_equals = Кнопка(300,500,'=') символы = [s_dot,s_plus,s_div,s_minus,s_equals,s_multi] числа = [номер_0,номер_1,номер_2,номер_3,номер_4,номер_5,номер_6,номер_7,номер_8,номер_9] Ожидал, что на экране будут нарисованы числа, но выдала следующую ошибку:
Traceback (самый последний вызов — последний): Файл «C:\Users\hsvdg\PycharmProjects\calculator_app\main.py», строка 23, в Buttons.Button.drawButton(i,экран) Файл «C:\Users\hsvdg\PycharmProjects\calculator_app\Buttons.py», строка 17, в drawButton pygame.draw.rect(экран,белый,(self.x,self.y,100,100)) AttributeError: объект «список» не имеет атрибута «x» Вот полный код:
#main импортировать pygame импортировать систему импортировать кнопки pygame.init() ширина, высота = 400, 600 экран = pygame.display.set_mode((ширина, высота)) pygame.display.set_caption("Калькулятор") белый = (255, 255, 255) черный = (0, 0, 0) серый = (200, 200, 200) font_small = pygame.font.Font (нет, 36) font_large = pygame.font.Font (нет, 48) цифры = Кнопки.цифры символы = Кнопки.символы для i в символах, цифрах: Buttons.Button.drawButton(i,screen) #рисуем кнопки # Класс калькулятора Калькулятор классов: защита __init__(сам): самовыражение = "" self.result = "" Защиту add_to_expression (я, значение): self.expression += str(значение) защитаclear_expression(self): самовыражение = "" защита Assessment_expression (сам): пытаться: self.result = str(eval(self.expression)) кроме Исключения: self.result = "Ошибка" Защитный дисплей (сам): pygame.draw.rect(экран, белый, (0, 0, ширина, 100)) pygame.draw.rect(экран, серый, (0, 100, ширина, высота - 100)) text_expression = font_large.render(self.expression, True, черный) text_rect_expression = text_expression.get_rect(center=(ширина // 2, 50)) screen.blit(text_expression, text_rect_expression) text_result = font_large.render(self.result, True, черный) text_rect_result = text_result.get_rect(center=(ширина // 2, 150)) screen.blit(text_result, text_rect_result) калькулятор = Калькулятор() пока правда: для события в pygame.event.get(): если event.type == pygame.QUIT: pygame.quit() sys.exit() если event.type == pygame.KEYDOWN: если event.key == pygame.K_RETURN: калькулятор.evaluate_expression() elif event.key == pygame.K_BACKSPACE: калькулятор.выражение = калькулятор.выражение[:-1] elif event.key == pygame.K_c: калькулятор.clear_expression() elif event.unicode.isdigit() или event.unicode в «+-*/.»: калькулятор.add_to_expression(event.unicode) # Обновление дисплея калькулятор.дисплей() # Экран обновления pygame.display.flip() # Ограничить частоту кадров pygame.time.Clock().тик(30) Класс кнопок:
импортировать pygame pygame.init() белый = (255, 255, 255) черный = (0, 0, 0) серый = (200, 200, 200) font_small = pygame.font.Font (нет, 36) font_large = pygame.font.Font (нет, 48) Кнопка класса: def __init__(self, x, y, символ): self.x = x #координаты self.y = y self.symbol = символ #+-/* защита drawButton(сам,экран): pygame.draw.rect(экран,белый,(self.x,self.y,100,100)) текст = font_large.render(self.symbol,True,(0,0,0)) screen.blit(текст,(self.x+38,self.y+35)) #цифровые кнопки num_0 = Кнопка (100 500, '0') num_1 = Кнопка (0,100, '1') num_2 = Кнопка(100,100,'2') num_3 = Кнопка(200,100,'3') num_4 = Кнопка (0,200, '4') num_5 = Кнопка (100 200, '5') num_6 = Кнопка (200 200, '6') num_7 = Кнопка (0,300, '7') num_8 = Кнопка(100,300,'8') num_9 = Кнопка (200 300, '9') #кнопки с символами s_plus = Кнопка(300,100,'+') s_minus = Кнопка(300,200,'-') s_div = Кнопка(300,300,'/') s_multi = Кнопка(300,400,'*') s_dot = Кнопка(200 500,'.') s_equals = Кнопка(300,500,'=') символы = [s_dot,s_plus,s_div,s_minus,s_equals,s_multi] числа = [номер_0,номер_1,номер_2,номер_3,номер_4,номер_5,номер_6,номер_7,номер_8,номер_9]
Мобильная версия