我正在为GCSE进行计算,我们的控制评估的任务之一是创建一个带有GUI的计算器.
我能够在没有GUI的情况下编写一个简单的计算器,但我不知道如何用GUI完成它.
下面是我从teampython.wordpress.com获得的代码,我模糊地理解,但如果有人可以向我解释每个步骤,那将会非常有用.
# calc.py - a Python calculator from tkinter import * class Calc(): def __init__(self): self.total = 0 self.current = "" self.new_num = True self.op_pending = False self.op = "" self.eq = False def num_press(self, num): self.eq = False temp = text_box.get() temp2 = str(num) if self.new_num: self.current = temp2 self.new_num = False else: if temp2 == '.': if temp2 in temp: return self.current = temp + temp2 self.display(self.current) def calc_total(self): self.eq = True self.current = float(self.current) if self.op_pending == True: self.do_sum() else: self.total = float(text_box.get()) def display(self, value): text_box.delete(0, END) text_box.insert(0, value) def do_sum(self): if self.op == "add": self.total += self.current if self.op == "minus": self.total -= self.current if self.op == "times": self.total *= self.current if self.op == "divide": self.total /= self.current self.new_num = True self.op_pending = False self.display(self.total) def operation(self, op): self.current = float(self.current) if self.op_pending: self.do_sum() elif not self.eq: self.total = self.current self.new_num = True self.op_pending = True self.op = op self.eq = False def cancel(self): self.eq = False self.current = "0" self.display(0) self.new_num = True def all_cancel(self): self.cancel() self.total = 0 def sign(self): self.eq = False self.current = -(float(text_box.get())) self.display(self.current) sum1 = Calc() root = Tk() calc = Frame(root) calc.grid() root.title("Calculator") text_box = Entry(calc, justify=RIGHT) text_box.grid(row = 0, column = 0, columnspan = 3, pady = 5) text_box.insert(0, "0") numbers = "789456123" i = 0 bttn = [] for j in range(1,4): for k in range(3): bttn.append(Button(calc, text = numbers[i])) bttn[i].grid(row = j, column = k, pady = 5) bttn[i]["command"] = lambda x = numbers[i]: sum1.num_press(x) i += 1 bttn_0 = Button(calc, text = "0") bttn_0["command"] = lambda: sum1.num_press(0) bttn_0.grid(row = 4, column = 1, pady = 5) bttn_div = Button(calc, text = chr(247)) bttn_div["command"] = lambda: sum1.operation("divide") bttn_div.grid(row = 1, column = 3, pady = 5) bttn_mult = Button(calc, text = "x") bttn_mult["command"] = lambda: sum1.operation("times") bttn_mult.grid(row = 2, column = 3, pady = 5) minus = Button(calc, text = "-") minus["command"] = lambda: sum1.operation("minus") minus.grid(row = 3, column = 3, pady = 5) point = Button(calc, text = ".") point["command"] = lambda: sum1.num_press(".") point.grid(row = 4, column = 0, pady = 5) add = Button(calc, text = "+") add["command"] = lambda: sum1.operation("add") add.grid(row = 4, column = 3, pady = 5) neg= Button(calc, text = "+/-") neg["command"] = sum1.sign neg.grid(row = 5, column = 0, pady = 5) clear = Button(calc, text = "C") clear["command"] = sum1.cancel clear.grid(row = 5, column = 1, pady = 5) all_clear = Button(calc, text = "AC") all_clear["command"] = sum1.all_cancel all_clear.grid(row = 5, column = 2, pady = 5) equals = Button(calc, text = "=") equals["command"] = sum1.calc_total equals.grid(row = 5, column = 3, pady = 5) root.mainloop()
MarkyD43.. 10
所以,我会解释你给我最好的代码.该类Calc()
包含此段代码的所有函数.结构意味着主GUI(稍后设置)可以轻松访问每个功能.在Calc()
课堂上,你有你的功能(用def
等等表示).它们包含此代码计算其输出的各种方法.
在课堂之外,我们有Tkinter UI代码.此代码构建您的窗口,其中包含各种按钮和显示.在这种情况下,按钮和文本字段的位置由"网格"方法控制.正如你所看到的,每一次的代码设置了一个对象(这里只Frame
,Button
和Entry
对象),存在相关联.grid(row=x, column=y...etc)
.这指定了UI中每个对象的相对位置.例如,使用网格方法,您可以通过给出第一个对象row = 1,column = 0和第二行= 2,column = 0等来堆叠两个对象.
for循环:
for j in range(1,4): for k in range(3): bttn.append(Button(calc, text = numbers[i])) bttn[i].grid(row = j, column = k, pady = 5) bttn[i]["command"] = lambda x = numbers[i]: sum1.num_press(x) i += 1
可能是用户界面的唯一部分,如果你刚刚开始,就不容易看到.从本质上讲,它所做的就是自动构建按钮(节省您单独编写每个按钮的时间).循环中的前两行(希望)明显地循环指定范围内的值.在该行之下,该行在bttn.append(...
之前设置的calc框架中创建一个按钮对象calc = Frame(root),按钮文本由数字列表给出(字面意思numbers="789456123"
如上).最初,i = 0,因此numbers [i]将返回列表编号中的第一个元素,i = 1的数字[i](下次循环时)将给出8,依此类推.在bttn.grid(row = j, column = k, pady = 5)
使用前面提到的格定位方法,但这里的j和k是通过在环本身(的值给定的行的情况下,值1和4之间的值,且0和2之间- 3列-在的情况下列).如果您运行代码,您可以看到这将定位所有键盘按钮以输入数字.此循环中的最后一行(除了i + = 1,即向i添加1),处理为按钮分配命令.该命令将调用一个相关的函数,在本例中是numpress
函数in Calc()
.正如您可能看到的那样,numpress
本身会根据您按下的数字更新您的显示器.
此示例中的最后一个代码块处理计算器的其余操作,您会注意到每个操作都遵循上面创建按钮的模式,分配命令并在UI中定位按钮.根据我上面已经解释过的,您可能会看到每个剩余的函数都Calc()
支配算术运算,或清除等.
我意识到这是一面文字,但我希望它有所帮助!如果我一直不清楚或有什么特别的你不理解,请告诉我,我会尝试解释它(我不久就学会了自己!).
您可能会发现此Tkinter UI指南很有用,我从该指南中学到了很多基础知识.
祝好运
所以,我会解释你给我最好的代码.该类Calc()
包含此段代码的所有函数.结构意味着主GUI(稍后设置)可以轻松访问每个功能.在Calc()
课堂上,你有你的功能(用def
等等表示).它们包含此代码计算其输出的各种方法.
在课堂之外,我们有Tkinter UI代码.此代码构建您的窗口,其中包含各种按钮和显示.在这种情况下,按钮和文本字段的位置由"网格"方法控制.正如你所看到的,每一次的代码设置了一个对象(这里只Frame
,Button
和Entry
对象),存在相关联.grid(row=x, column=y...etc)
.这指定了UI中每个对象的相对位置.例如,使用网格方法,您可以通过给出第一个对象row = 1,column = 0和第二行= 2,column = 0等来堆叠两个对象.
for循环:
for j in range(1,4): for k in range(3): bttn.append(Button(calc, text = numbers[i])) bttn[i].grid(row = j, column = k, pady = 5) bttn[i]["command"] = lambda x = numbers[i]: sum1.num_press(x) i += 1
可能是用户界面的唯一部分,如果你刚刚开始,就不容易看到.从本质上讲,它所做的就是自动构建按钮(节省您单独编写每个按钮的时间).循环中的前两行(希望)明显地循环指定范围内的值.在该行之下,该行在bttn.append(...
之前设置的calc框架中创建一个按钮对象calc = Frame(root),按钮文本由数字列表给出(字面意思numbers="789456123"
如上).最初,i = 0,因此numbers [i]将返回列表编号中的第一个元素,i = 1的数字[i](下次循环时)将给出8,依此类推.在bttn.grid(row = j, column = k, pady = 5)
使用前面提到的格定位方法,但这里的j和k是通过在环本身(的值给定的行的情况下,值1和4之间的值,且0和2之间- 3列-在的情况下列).如果您运行代码,您可以看到这将定位所有键盘按钮以输入数字.此循环中的最后一行(除了i + = 1,即向i添加1),处理为按钮分配命令.该命令将调用一个相关的函数,在本例中是numpress
函数in Calc()
.正如您可能看到的那样,numpress
本身会根据您按下的数字更新您的显示器.
此示例中的最后一个代码块处理计算器的其余操作,您会注意到每个操作都遵循上面创建按钮的模式,分配命令并在UI中定位按钮.根据我上面已经解释过的,您可能会看到每个剩余的函数都Calc()
支配算术运算,或清除等.
我意识到这是一面文字,但我希望它有所帮助!如果我一直不清楚或有什么特别的你不理解,请告诉我,我会尝试解释它(我不久就学会了自己!).
您可能会发现此Tkinter UI指南很有用,我从该指南中学到了很多基础知识.
祝好运