equal_is
用于判断是否已经计算出结果,textchange
是用于设置输入框的内容。
首先生成窗体:
root=tk.Tk() #创建窗体
root.geometry(‘250x350’)
root.title(‘计算器’)
为了方便,在这里定义一个函数 create_btn
def create_btn(text,col,row,cs,rs,px=(1,1),py=(1,1)): #函数生成按钮
t=text
t=t.replace(‘×’,‘*’)
t=t.replace(‘÷’,‘/’)
t=t.replace(‘x²’,‘**2’)
t=t.replace(‘1/x’,‘**(-1)’) #替换特殊符号
a=tk.Button(root,text=text,width=4,command=lambda:(text_print(t))) #输入内容
a.grid(column=col,row=row,columnspan=cs,rowspan=rs,padx=px,pady=py,sticky=‘nswe’)
return(a)
因为有些按钮的输入的符号并不等于它的文本内容(比如按钮“×”,输入“*”),因此我们用replace
函数来替换掉这些特殊符号。
text_print
是输入内容的函数,这个在后面会定义。
btn={} #生成按钮
btn[‘1’]=create_btn(‘1’,0,5,1,1)
btn[‘2’]=create_btn(‘2’,1,5,1,1)
btn[‘3’]=create_btn(‘3’,2,5,1,1)
btn[‘4’]=create_btn(‘4’,0,4,1,1)
btn[‘5’]=create_btn(‘5’,1,4,1,1)
btn[‘6’]=create_btn(‘6’,2,4,1,1)
btn[‘7’]=create_btn(‘7’,0,3,1,1)
btn[‘8’]=create_btn(‘8’,1,3,1,1)
btn[‘9’]=create_btn(‘9’,2,3,1,1)
btn[‘0’]=create_btn(‘0’,0,6,2,1)
btn[‘.’]=create_btn(‘.’,2,6,1,1)
btn[‘=’]=create_btn(‘=’,4,5,1,2)
btn[‘+’]=create_btn(‘+’,3,6,1,1)
btn[‘-’]=create_btn(‘-’,3,5,1,1)
btn[‘*’]=create_btn(‘×’,3,4,1,1)
btn[‘/’]=create_btn(‘÷’,4,4,1,1)
btn[‘←’]=create_btn(‘←’,1,2,1,1)
btn[‘C’]=create_btn(‘C’,2,2,1,1)
btn[‘(’]=create_btn(‘(’,3,2,1,1)
btn[‘)’]=create_btn(‘)’,4,2,1,1)
btn[‘**2’]=create_btn(‘x²’,3,3,1,1)
btn[‘**(-1)’]=create_btn(‘1/x’,4,3,1,1)
上面是用 create_btn
函数生成每一个按钮。
la=tk.Label(root,text=‘’,bg=‘white’,fg=‘black’,font=(‘宋体’,24),anchor=‘w’,relief=‘flat’) #生成输入框
la.grid(column=0,row=0,columnspan=5,rowspan=1,sticky=‘we’)
lab=tk.Label(root,bg=‘white’,fg=‘grey’,height=1,font=(‘宋体’,22),anchor=‘w’,relief=‘flat’) #生成显示框
lab.grid(column=0,row=1,columnspan=5,rowspan=1,sticky=‘we’)
上面创建两个标签,作为输入框和显示框。
la
是输入框,lab
是显示框(这名字定的有点随意哈不要介意,你们可以定一些喜欢的名字)。
然后定义函数 grid_rowconfigure
和 grid_columnconfigure
,用于自动填充行和列:
def grid_rowconfigure(*rows): #函数填充行。*rows:允许接收多个参数
for i in rows:
root.grid_rowconfigure(i,weight=1)
def grid_columnconfigure(*cols): #函数填充列。*cols:允许接收多个参数
for i in cols:
root.grid_columnconfigure(i,weight=1)
在窗体被改变大小时,按钮会自动填充四周,而输入、显示框只填充左右两边(第2,3,4,5,6行会向竖直方向填充,每一列都会向水平方向填充)。
grid_rowconfigure(2,3,4,5,6)
grid_columnconfigure(0,1,2,3,4)
定义 text_print
函数,当按钮被点击时输入内容,当按钮“=”被点击的时候计算结果:
def text_print(x): #函数按钮输入算式
global textchange,equal_is #声明全局变量
if x!=‘=’:
if x==‘←’:
a=str(textchange)[0:-1]
textchange=a #退格
elif x==‘C’:
textchange=‘’ #清空
else:
textchange=str(textchange)+str(x) #输入
la.configure(text=textchange)
show_is()
equal_is=False #判断格式有无错误
if x==‘=’:
text_equal() #计算结果
show_is
用于判断格式有无错误:
def show_is(): #显示框内容
global textchange #声明全局变量
if textchange!=‘’:
try:
textshow=eval(textchange)
except (SyntaxError,TypeError,NameError):
lab.configure(text=‘错误’) #如果出错了,则显示“错误”
else:
lab.configure(text=textshow) #如果没有出错,则显示结果
else:
lab.configure(text=‘’) #如果输入框为空,那么清空显示框
text_equal
是计算结果的函数:
def text_equal(event=None): #函数计算结果并上到输入框
global textchange,equal_is #声明全局变量
if lab[‘text’]!=‘错误’ and equal_is==False:
textchange=lab[‘text’] #无格式错误时,计算结果
la.configure(text=textchange) #输入框显示结果
lab.configure(text=‘’) #清空显示框
equal_is=True
这里详细说明一下 equal_is
的作用:
因为计算了结果后显示框会清空,为了防止二次计算导致输入框也跟着清空,我们需要判断是否已经计算过结果,这时就用到变量 equal_is
。
当输入内容时,equal_is
变为 True
,计算结果后,equal_is
变为 False
,如果 equal_is == True
,则不计算结果。
我设置的键盘按键及其对应输入内容:
| 输入内容 | 对应按键 |
| — | — |
| 0~9 | 0~9 |
| + | + |
| - | - |
| * | * |
| / | / |
| 退格 | BackSpace |
| 清空 | Delete |
| 计算结果 | Return(Enter键) |
定义一个函数 bind_print
,跟 text_print
有点相似,但有些不一样(原谅我技术差,不知道别的方法,只能重新定义一个函数):
def bind_print(event): #函数键盘事件输入算式
global textchange,equal_is
if event.keysym!=‘Return’:
if event.keysym==‘BackSpace’: #如果按键名等于“BackSpace”(退格键),那么就退格
a=str(textchange)[0:-1]
textchange=a
elif event.keysym==‘Delete’: #清空
textchange=‘’
else:
textchange=str(textchange)+str(event.char) #输入按键内容,char不会获得Ctrl,Shift等特殊按键的文本
la.configure(text=textchange) #显示内容
show_is() #判断是否错误
equal_is=False
else:
text_equal()
如果按下的是特殊按键,除非是退格和回车,否则都不会有反应,
按下字母、数字、符号键的时候,输入按键内容。
接下来就是绑定键盘事件了:
root.bind(‘’,bind_print) #当键盘按下任意键,执行bind_print
这样,界面布置和功能就完成了‘
将主窗体root
放入主循环中:
root.mainloop()
=========================================================================
import tkinter as tk
def create_btn(text,col,row,cs,rs,px=(1,1),py=(1,1)): #函数生成按钮
t=text
t=t.replace(‘×’,‘*’)
t=t.replace(‘÷’,‘/’)
t=t.replace(‘x²’,‘**2’)
t=t.replace(‘1/x’,‘**(-1)’)
a=tk.Button(root,text=text,width=4,command=lambda:(text_print(t)))
a.grid(column=col,row=row,columnspan=cs,rowspan=rs,padx=px,pady=py,sticky=‘nswe’)
return(a)
def grid_rowconfigure(*rows): #函数填充行
for i in rows:
root.grid_rowconfigure(i,weight=1)
def grid_columnconfigure(*cols): #函数填充列
for i in cols:
root.grid_columnconfigure(i,weight=1)
def bind_print(event): #函数键盘事件输入算式
global textchange,equal_is
if event.keysym!=‘Return’:
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)
convert/46506ae54be168b93cf63939786134ca.png)
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)