我正在制作一个带有GUI的计算器,但我不知道如何跟踪一个数字,以便我可以在以后用第二个数字来执行操作。
我的代码如下:
def Sum():
Plus = pygame.image.load(os.path.abspath("plus.png"))
screen.blit(Plus,(555,34))
c=a+b
return c
def Sustraction():
Minus = pygame.image.load(os.path.abspath("minus.png"))
screen.blit(Minus,(555,34))
c=a-b
return c
def Multiplication():
Times = pygame.image.load(os.path.abspath("Times.png"))
screen.blit(Times,(555,34))
c=a*b
return c
def Division():
Division = pygame.image.load(os.path.abspath("Division.png"))
screen.blit(Division,(555,34))
c=a/b
return c
def button (msg, x, y, w, h, ic, ac, action=None ):
mouse = pygame.mouse.get_pos()
click = pygame.mouse.get_pressed()
if (x+w > mouse[0] > x) and (y+h > mouse[1] > y):
pygame.draw.rect(CALCULATOR, WHITE, (x, y, w, h))
if (click[0] == 1 and action != None):
if (action == "Sum"):
Sum()
elif (action == "Substraction"):
Substraction()
elif (action == "Multiplication"):
Multiplication()
elif (action == "Division"):
Division()
if (action == "One"):
One()
a=1
return a
elif (action == "Two"):
Two()
a=2
return a
elif (action == "Three"):
Three()
a=3
return a
正如您在我的函数定义中所看到的,当我调用Sum
时,我使用c=a+b
。问题是我不知道如何将a
保留在内存中以将其用于与b
的求和操作,因此我不知道如何输入新值并将其保存在b
。
如果用户在a
中输入新值,我如何存储b
的值?
答案 0 :(得分:0)
首先,您应该尝试使用class。
如果是关于你的问题。只需使用功能参数。 sum函数示例:
def Sum(a, b):
Plus = pygame.image.load(os.path.abspath("plus.png"))
screen.blit(Plus,(555,34))
c=a+b
return c
如果您想“实时”进行,您只能使用1个参数并将结果保留为类成员。
def Sum(a):
Plus = pygame.image.load(os.path.abspath("plus.png"))
screen.blit(Plus,(555,34))
self.result += a
如果不足以阅读Reverse Polish notation
答案 1 :(得分:0)
在Python中,仅在函数内引用的变量是 隐含全球性。如果变量在其中的任何位置分配了值 函数的主体,除非明确指出,否则它被认为是本地的 宣布为全球性的。 - What are the rules for local and global variables in Python?
因此,当您在函数中指定变量a
和c
时,会将其创建为局部变量。如果您在分配之前尝试使用它,例如:
def increment():
c += 1
return c
你会得到UnboundLocalError: local variable 'c' referenced before assignment
例外。
我认为在您的示例中,如果您在执行NameError: name 'a' is not defined
回调之前调用Sum()
,则还会收到button()
异常,因为尚未定义a
。这是因为a
在函数中被引用,但未被赋值 - 因此不会被创建为局部变量,但是在全局命名空间中也找不到它。
最简单的解决方案是使用全局变量。并非每当您想要使用全局变量而不是创建本地变量时,您需要使用global
关键字在本地上下文中显示它:
a = 0
b = 0
c = 0
def sum():
global a, b
Plus = pygame.image.load(os.path.abspath("plus.png"))
screen.blit(Plus,(555,34))
c = a + b
return c
def button(msg, x, y, w, h, ic, ac, action=None):
mouse = pygame.mouse.get_pos()
click = pygame.mouse.get_pressed()
global a
if ....
但是我建议使用class和store值作为属性,例如:
class Calculator:
def __init__(self) -> None:
self.x = 0
self.result = 0
self.screen = ... # Your initialization
self.actions = {
"Sum": self.sum,
"Substraction": self.subtract,
"Multiplication": self.multiply,
"Division": self.divide
}
self.numbers = {
"One": 1,
"Two": 2,
"Three": 3
}
def sum(self, x):
plus = pygame.image.load(os.path.abspath("plus.png"))
self.screen.blit(plus, (555, 34))
self.result += x
def subtract(self, x):
minus = pygame.image.load(os.path.abspath("minus.png"))
self.screen.blit(minus, (555, 34))
self.result -= x
def multiply(self, x):
times = pygame.image.load(os.path.abspath("Times.png"))
self.screen.blit(times, (555, 34))
self.result *= x
def divide(self, x):
division = pygame.image.load(os.path.abspath("Times.png"))
self.screen.blit(division, (555, 34))
if x != 0:
self.result /= x
else:
print("I refuse to divide by 0.")
def button(self, msg, x, y, w, h, ic, ac, action=None):
mouse = pygame.mouse.get_pos()
click = pygame.mouse.get_pressed()
if ((x + w) > mouse[0] > x) and ((y + h) > mouse[1] > y):
pygame.draw.rect(CALCULATOR, WHITE, (x, y, w, h))
if (click[0] == 1) and (action is not None):
if action in self.actions:
self.actions[action]()
elif action in self.numbers:
self.x = self.numbers[action]
在此示例中,我还使用了in
关键字和值字典,这简化了选择,而不是使用if
- elif
个案例。