Python:用python的tkinter做一个简单的计算器(2)

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_rowconfiguregrid_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)

2.2 定义输入和计算函数


定义 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,则不计算结果。

2.3 绑定键盘事件


我设置的键盘按键及其对应输入内容:

| 输入内容 | 对应按键 |

| — | — |

| 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

这样,界面布置和功能就完成了‘

2.4 循环


将主窗体root放入主循环中:

root.mainloop()

3.全部代码

=========================================================================

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’:

if event.keysym==‘BackSpace’:

a=str(textchange)[0:-1]

textchange=a

elif event.keysym==‘Delete’:

textchange=‘’

else:

textchange=str(textchange)+str(event.char)

la.configure(text=textchange)

show_is()

equal_is=False

else:

text_equal()

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()

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

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=‘’)

root=tk.Tk() #创建窗体

root.geometry(‘250x350’)

root.title(‘计算器’)

root.bind(‘’,bind_print)

equal_is=False #一些变量

textchange=‘’

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’)

btn={} #生成按钮
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)

)]

[外链图片转存中…(img-7RrMn3Jb-1712948470798)]

[外链图片转存中…(img-4eWIPqDW-1712948470799)]

[外链图片转存中…(img-5TYlxvYT-1712948470799)]

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)

img
  • 23
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值