# please input your code here.
from random import randint
import tkinter
from tkinter import *
from tkinter import messagebox
def main():
root = Tk()# 创建 GUI 主程序
calculator = Label()# 创建主窗口
calculator.pack(fill=BOTH, expand = 1)
addWidgets(calculator) # 调用函数,向窗口上添加功能按钮,以输入数字和运算符
root.title('Calculator')
root.wm_resizable(width = False, height = False) # 禁用窗口缩放
root.mainloop()
def addWidgets(frame):
n1=randint(1,13)
n2=randint(1,13)
n3=randint(1,13)
n4=randint(1,13)
expression = Text(frame, height = 2, width = 28) # 创建表达式输入窗口
number_1 = Button(frame, text=n1, width = 5,command = lambda: input_char(n1, expression))
number_2 = Button(frame, text=n2, width = 5,command = lambda: input_char(n2, expression))
number_3 = Button(frame, text=n3, width = 5,command = lambda: input_char(n3, expression))
number_4 = Button(frame, text=n4, width = 5,command = lambda: input_char(n4, expression))
# 创建数字按钮
btn_add = Button(frame, text = '+', width = 5,command = lambda: input_char('+', expression))
btn_subtract = Button(frame, text = '-', width = 5,command = lambda: input_char('-', expression))
btn_multiply = Button(frame, text = '*', width = 5,command = lambda: input_char('*', expression))
btn_divide = Button(frame, text = '/', width = 5,command = lambda: input_char('/', expression))
btn_equal = Button(frame, text = '=', width = 5,command = lambda: input_char(calcu(expression),expression))# 创建运算符输入按钮
btn_l = Button(frame, text = '(', width = 5,command = lambda: input_char('(', expression))
btn_r = Button(frame, text = ')', width = 5,command = lambda: input_char(')', expression))
btn_delete = Button(frame, text = 'clear', width = 5,command = lambda: expression.delete(0.0,END))
# 使用 grid_configure 函数将组件添加到主窗口上
expression.grid_configure(column = 1, row = 2, columnspan = 4, rowspan = 1)
number_1.grid_configure(column = 1, row = 4)
number_2.grid_configure(column = 2, row = 4)
number_3.grid_configure(column = 3, row = 4)
number_4.grid_configure(column = 4, row = 4)
btn_add.grid_configure(column = 1, row = 7)
btn_subtract.grid_configure(column = 2, row = 7)
btn_multiply.grid_configure(column = 3, row = 7)
btn_divide.grid_configure(column = 4, row = 7)
btn_equal.grid_configure(column = 3, row = 11)
btn_l.grid_configure(column = 1, row = 11)
btn_r.grid_configure(column = 2, row = 11)
btn_delete.grid_configure(column = 4, row = 11)
def input_char(char, expressionview):
expressionview.insert('1.end', char) # 输入按钮对应的字符
def calcu(expressionview):
#计算表达式的值,返回结果的字符串形式。如果表达式不合法,返回错误信息
equal_str = expressionview.get('1.0', '1.end')
expressionview.insert('1.end', '=')
s = []
i = 0
equal_list = []
while i <equal_str.__len__():
if equal_str[i] <= '9' and equal_str[i] >= '0':
tmp = 0
while i <equal_str.__len__() and equal_str[i] <= '9' and equal_str[i] >= '0':
tmp = tmp * 10 + (ord(equal_str[i]) - ord('0'))
i = i + 1
equal_list.append(tmp)
continue
else:
if equal_str[i] == '(':
s.append(equal_str[i])
elif equal_str[i] == ')':
try:
while s[s.__len__()-1] != '(':
equal_list.append(s.pop())
s.pop()
except IndexError:
return 'Invalid expersion!'
elif equal_str[i] == '+' or equal_str[i] == '-':
while s.__len__() >0 and s[s.__len__()-1] != '(':
equal_list.append(s.pop())
s.append(equal_str[i])
elif equal_str[i] == '*' or equal_str[i] == '/':
while s.__len__() >0 and (s[s.__len__()-1] == '*' or s[s.__len__() - 1] == '/'):
equal_list.append(s.pop())
s.append(equal_str[i])
i += 1
while s.__len__() >0:
equal_list.append(s.pop())
# print(equal_list) # print the postfix expression
cnt_num = 0
cnt_op = 0
for item in equal_list:
if type(item) == type(0): # integer.
cnt_num += 1
else:
cnt_op += 1
if cnt_op != cnt_num - 1:
return 'Invalid expersion!'
ans = []
for i in range(0, equal_list.__len__()):
if equal_list[i] == '+':
ans.append(ans.pop(ans.__len__()-2) + ans.pop(ans.__len__()-1))
elif equal_list[i] == '-':
ans.append(ans.pop(ans.__len__()-2) - ans.pop(ans.__len__()-1))
elif equal_list[i] == '*':
ans.append(ans.pop(ans.__len__()-2) * ans.pop(ans.__len__()-1))
elif equal_list[i] == '/':
try:
ans.append(ans.pop(ans.__len__()-2) / ans.pop(ans.__len__()-1))
except ZeroDivisionError:
return 'ZeroDivisionError: division by zero'
else:
ans.append(equal_list[i])
return str(ans[0])
if __name__ == '__main__':
main()
较为常用的GUI工具Tkinter
可以在大多数的Unix平台下使用,
同样可以应用在Windows和Mac系统里。Tk8.0的后续版本可以实现本地窗口风格,并良好地运行在绝大多数平台中。
优点:是Python的内置库,无需额外下载,不存在兼容问题,且又非常详细的说明文档。
缺点:实现效果较为普通。
wxPython
是一个创建桌面GUI应用的跨平台工具包,它的主要开发者是Robin
Dunn。使用wxPython,开发者可以在Windows、Mac和多种Unix系统上开发应用程序。
优点:是一个免费的,可移植的GUI类库,用C++编写,可在Windows,Mac OS
X,GTK,X11等许多平台上使用。可用于多种语言,包括Python,Perl,Ruby等。
缺点:设计的界面美观程度和灵活性较为普通。
PyQT
是Qt框架的Python语言实现,也是最强大的GUI库之一。
PyQt提供了一个设计良好的窗口控件集合,每一个PyQt控件都对应一个Qt控件,因此PyQt的API接口与Qt的API接口很接近,但PyQt不再使用QMake系统和Q_OBJECT宏。
优点:功能非常强大,可以用PyQt5开很漂亮的界面另外它支持可视化界面设计,对新手非常友好,可以通过拖动一些模块就可以完成一些代码才能完成的工作,就跟C++的QT是一样的。
缺点:学习起来有一定难度。
PyGtk
优点:跟PyQt一样,可以实现很不错的效果,但是稍逊于PyQt,并且同样有UI设计工具Glade。
缺点:更适合GNOME平台。
Kivy
优点:是一个开源的Python框架,用于快速开发应用,实现各种当前流行的用户界面,比如多点触摸等等,可以运行于Windows,Linux, MacOS,
Android,
iOS等当前绝大部分主流桌面/移动端操作系统。Kivy基于Python,界面文件和程序文件相互分离的设计思路,设计简洁优雅,语法易学,适合新人入门。
缺点:只有一个中文文档还是特别全面,大多数教程还是英文版本。