我正在尝试使用 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]
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