Python for 循环属性错误

问题描述 投票:0回答:1

我正在尝试使用 Pygame 在 Python 中创建一个计算器应用程序。尝试创建一个循环,从列表中绘制按钮。

screen = pygame.display.set_mode((width, height))

numbers = Buttons.numbers
symbols = Buttons.symbols

for i in symbols,numbers:
    Buttons.Button.drawButton(i,screen) #draw the buttons
class Button:
    def __init__(self, x, y, symbol):
        self.x = x #coordinates
        self.y = y
        self.symbol = symbol #+-/*
    def drawButton(self,screen):
        pygame.draw.rect(screen,white,(self.x,self.y,100,100))
        text = font_large.render(self.symbol,True,(0,0,0))
        screen.blit(text,(self.x+38,self.y+35))

#number buttons
num_0 = Button(100,500,'0')
num_1 = Button(0,100,'1')
num_2 = Button(100,100,'2')
num_3 = Button(200,100,'3')
num_4 = Button(0,200,'4')
num_5 = Button(100,200,'5')
num_6 = Button(200,200,'6')
num_7 = Button(0,300,'7')
num_8 = Button(100,300,'8')
num_9 = Button(200,300,'9')

#symbol buttons
s_plus = Button(300,100,'+')
s_minus = Button(300,200,'-')
s_div = Button(300,300,'/')
s_multi = Button(300,400,'*')
s_dot = Button(200,500,'.')
s_equals = Button(300,500,'=')


symbols = [s_dot,s_plus,s_div,s_minus,s_equals,s_multi]
numbers = [num_0,num_1,num_2,num_3,num_4,num_5,num_6,num_7,num_8,num_9]

期望在屏幕上绘制数字,但它给了我以下错误:

Traceback (most recent call last):
  File "C:\Users\hsvdg\PycharmProjects\calculator_app\main.py", line 23, in <module> 
    Buttons.Button.drawButton(i,screen)  
  File "C:\Users\hsvdg\PycharmProjects\calculator_app\Buttons.py", line 17, in drawButton  
    pygame.draw.rect(screen,white,(self.x,self.y,100,100))  
AttributeError: 'list' object has no attribute 'x'

完整代码如下:

#main
import pygame
import sys
import Buttons

pygame.init()

width, height = 400, 600
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption("Calculator")

white = (255, 255, 255)
black = (0, 0, 0)
gray = (200, 200, 200)

font_small = pygame.font.Font(None, 36)
font_large = pygame.font.Font(None, 48)

numbers = Buttons.numbers
symbols = Buttons.symbols

for i in symbols,numbers:
    Buttons.Button.drawButton(i,screen) #draw the buttons

# Calculator class
class Calculator:
    def __init__(self):
        self.expression = ""
        self.result = ""

    def add_to_expression(self, value):
        self.expression += str(value)

    def clear_expression(self):
        self.expression = ""

    def evaluate_expression(self):
        try:
            self.result = str(eval(self.expression))
        except Exception:
            self.result = "Error"

    def display(self):
        pygame.draw.rect(screen, white, (0, 0, width, 100))
        pygame.draw.rect(screen, gray, (0, 100, width, height - 100))

        text_expression = font_large.render(self.expression, True, black)
        text_rect_expression = text_expression.get_rect(center=(width // 2, 50))
        screen.blit(text_expression, text_rect_expression)

        text_result = font_large.render(self.result, True, black)
        text_rect_result = text_result.get_rect(center=(width // 2, 150))
        screen.blit(text_result, text_rect_result)

calculator = Calculator()

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_RETURN:
                calculator.evaluate_expression()
            elif event.key == pygame.K_BACKSPACE:
                calculator.expression = calculator.expression[:-1]
            elif event.key == pygame.K_c:
                calculator.clear_expression()
            elif event.unicode.isdigit() or event.unicode in "+-*/.":
                calculator.add_to_expression(event.unicode)

    # Update display
    calculator.display()

    # Update screen
    pygame.display.flip()

    # Cap the frame rate
    pygame.time.Clock().tick(30)

按钮类:

import pygame

pygame.init()

white = (255, 255, 255)
black = (0, 0, 0)
gray = (200, 200, 200)
font_small = pygame.font.Font(None, 36)
font_large = pygame.font.Font(None, 48)

class Button:
    def __init__(self, x, y, symbol):
        self.x = x #coordinates
        self.y = y
        self.symbol = symbol #+-/*
    def drawButton(self,screen):
        pygame.draw.rect(screen,white,(self.x,self.y,100,100))
        text = font_large.render(self.symbol,True,(0,0,0))
        screen.blit(text,(self.x+38,self.y+35))

#number buttons
num_0 = Button(100,500,'0')
num_1 = Button(0,100,'1')
num_2 = Button(100,100,'2')
num_3 = Button(200,100,'3')
num_4 = Button(0,200,'4')
num_5 = Button(100,200,'5')
num_6 = Button(200,200,'6')
num_7 = Button(0,300,'7')
num_8 = Button(100,300,'8')
num_9 = Button(200,300,'9')

#symbol buttons
s_plus = Button(300,100,'+')
s_minus = Button(300,200,'-')
s_div = Button(300,300,'/')
s_multi = Button(300,400,'*')
s_dot = Button(200,500,'.')
s_equals = Button(300,500,'=')


symbols = [s_dot,s_plus,s_div,s_minus,s_equals,s_multi]
numbers = [num_0,num_1,num_2,num_3,num_4,num_5,num_6,num_7,num_8,num_9]


python list for-loop attributeerror
1个回答
-1
投票

symbols
numbers
是列表。
for i in symbols, numbers:
不会迭代列表中的项目。该循环正好运行 2 次。一次用于
symbols
,一次用于
lists
,因为
symbols,numbers
是一个包含 2 个项目的元组(元组由
,
生成)。
将其替换为
for i in symbols + numbers:
+
运算符连接列表并创建一个新列表,其中包含运算符两侧列表的所有元素。

for i in symbols, numbers:

for i in symbols + numbers:

比较

a = ['A', 'B']
b = [ 1, 2 ]
for i in a, b:
    print(i)
['A', 'B']
[1, 2]

a = ['A', 'B']
b = [ 1, 2 ]
for i in a + b:
    print(i)
A
B
1
2
© www.soinside.com 2019 - 2024. All rights reserved.