如何在计算器应用程序中将数字保存在内存中?

时间:2017-07-20 11:45:11

标签: python pygame calculator

我正在制作一个带有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的值?

2 个答案:

答案 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?

因此,当您在函数中指定变量ac时,会将其创建为局部变量。如果您在分配之前尝试使用它,例如:

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个案例。