我正在为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()
答案 0 :(得分: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
中的Calc()
函数。正如您可能看到的那样,numpress
本身会使用您按下的任何数字更新您的显示。
此示例中的最后一个代码块处理计算器的其余操作,您会注意到每个操作都遵循上面创建按钮的模式,分配命令并在UI中定位按钮。根据我上面已经解释过的,你可以看到Calc()
中的每个剩余函数都支配算术运算,或者清除等等。
我意识到这是一面文字,但我希望它有所帮助!如果我一直不清楚或有什么特别的东西你不理解,请告诉我,我会尝试解释它(我不久就学会了!)。
您可能会发现这个Tkinter UI Guide很有用,我从该指南中学到了很多基础知识。
祝你好运
答案 1 :(得分:0)