工具:python 3.6 pycharm编辑器
先简单介绍一下使用的Tkinter图形库:
很多人学习python,不知道从何学起。 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。 很多已经做案例的人,却不知道如何去学习更加高深的知识。 那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!??¤ QQ群:961562169
Tk是Python默认的工具集(即图形库),Tkinter是Tk的Python接口,通过Tkinter可以方便地调用Tk进行图形界面开发。 Tk与其他开发库相比,不是最强大的,模块工具也不是非常的丰富。但它非常简单,所提供的功能开发一般的应用也完全够用了,且能在大部分平台上运行。 Python自带的IDEL也是用Tkinter开发的。 Tkinter的不足之处是缺少合适的可视化界面设计工具,需要通过代码来完成窗口设计和元素布局。 Tkinter中提供了较为丰富的控件,完全能满足基本的GUI程序的需求。 由于Tkinter模块已经在Python中内置,所以在使用之前,只需将其导入即可。 两种导入方式为:1.import tkinter as tk—导入tkinter,但没引入任何组件,在使用时需要使用tk前缀,如需要引入按钮,则表示为:tk.Button。
2.from tkinter import* —将tkinter中的所有组件一次性引入。
好了,看代码吧
一. 导入Tkinter模块,并创建一个顶层窗口
import math from tkinter import * root=Tk() root.title("计算器") ''' root.geometry("430x180") root.resizable(width=False, height=False) #可用于固定窗口大小 '''二. 定义鼠标事件(这里是为了美化计算器啦,也可以不要)
def come(event): #当鼠标光圈进入小部件时,部件背景颜色变为橙色 event.widget["background"]= "orange" def go(event): #当鼠标光圈离开小部件时,部件背景颜色恢复 event.widget["background"] = "#%02x%02x%02x" % (240,240,240)#实现RGB和十六进制的换算三.定义输入数字与符号函数
reset=True def bprint(event): global label global reset s=label['text'] num=event.widget['text'] if num in ['C','MC','MR','MS']: label['text']="0" return if num in "=": ##计算表达式 if s[-1]=="√": label['text']=math.sqrt(eval(s[:-1])) return if s[-1]=="%": label['text']=eval(s[:-1])*0.01 s=str(eval(s[:-1])*0.01) return if s[-1]=="x": label['text']=1/eval(s[:-3]) s=str(1/eval(s[:-3])) return else: label['text']=eval(label['text']) ###eval函数可以计算Python表达式,并返回结果 reset=True return if num in "Backspace": ####退格 label['text']=s[:-1] return if s=='0' or reset==True: s="" reset=False label['text']=s+num四. 定义标准计算器按键框
def standard(): show=["MC","MR","MS","M+","M-","Backspace","CE","C","-","√",'7','8','9',"/","%",'4','5','6',"*","1/x",'1','2','3',"-","="] for i in range(5): for j in range(5): t=Button(root,text =show[5*i+j],width =10,height=1) t.grid(row=i+2,column =j,sticky =W,padx =1,pady=1) t.bind("<Enter>",come) t.bind("<Leave>",go) t.bind("<Button-1>",bprint) equal = Button(root,text="=",width =10,height =3) equal.grid(row=6,column =4,sticky =W,padx =1,pady=1,rowspan =2) equal.bind("<Enter>",come) equal.bind("<Leave>",go) equal.bind("<Button-1>",bprint) btn0 = Button(root,text ='0',width =22,height =1) btn0.grid(row=7,column =0,sticky =W,padx =1,pady=1,columnspan =2) #让一个部件占用多个行或列。columnspan指定列数,rowspan指定行数。 btn0.bind("<Enter>",come) btn0.bind("<Leave>",go) btn0.bind("<Button-1>",bprint) dot = Button(root,text =".",width =10,height =1) dot.grid(row=7,column =2,sticky =W,padx =1,pady=1) dot.bind("<Enter>",come) dot.bind("<Leave>",go) dot.bind("<Button-1>",bprint) add = Button(root,text ="+",width =10) add.grid(row=7,column =3,sticky =W,padx =1,pady=1) add.bind("<Enter>",come) add.bind("<Leave>",go) add.bind("<Button-1>",bprint)五. 接下来是主函数
if __name__ == "__main__": #########################################菜单设计 menubar = Menu(root) #创建下拉菜单查看 view_menu = Menu(menubar,tearoff = 0) #tearoff = 0表示菜单不能移除窗口,add_cascade添加菜单标签,add_command添加条目到菜单。 v_mode = IntVar() view_menu.add_radiobutton(label = "标准型",command=standard,variable = v_mode,value = 0) view_menu.add_radiobutton(label = "科学型",variable = v_mode,value = 1) view_menu.add_radiobutton(label = "程序员型",variable =v_mode,value = 2) view_menu.add_radiobutton(label = "统计型",variable = v_mode,value = 3) view_menu.add_separator() h_mode = IntVar() view_menu.add_radiobutton(label = "历史记录",variable = h_mode,value = 0) view_menu.add_radiobutton(label = "数字分组",variable = h_mode,value = 1) menubar.add_cascade(label = "查看(V)",menu = view_menu) #创建下拉菜单编辑 edit = Menu(menubar,tearoff = 0) edit.add_command(label = "复制") edit.add_command(label = "黏贴") menubar.add_cascade(label = "编辑(E)",menu = edit) #创建下拉菜单帮助 helpm = Menu(menubar,tearoff=0) helpm.add_command(label = "查看帮助") helpm.add_command(label = "关于计算器") menubar.add_cascade(label = "帮助(H)",menu= helpm) #显示菜单 root.config(menu = menubar) #####################################计算器显示框 label=Label(root,text="0",background="white",height=2,width=58,anchor="e") label.grid(row=1,columnspan=6,sticky=W) ################################显示标准形式 standard() root.mainloop()六.最后附上我的效果图