python+tkinter仿制win10标准型计算器(中文版,你们觉得作为一名程序员最大的悲哀是什么

本文介绍了使用Python的tkinter库制作一个仿Win10计算器的过程,包括创建显示框架、放置显示屏、创建按键布局、绑定事件以及处理按钮点击事件。文章详细阐述了双显示屏的实现、按钮布局、按键事件处理以及各种运算的逻辑,如清零、删除、加减乘除、开根号等操作。同时,还展示了如何处理除以零和无效输入等情况。

self.factor2 = “”

self.last_click = “” # 上一次点击

然后进入消息循环

进入消息循环

self.win = tkinter.mainloop()

在主函数调用该类

if name == ‘main’:

TkWindows()

点击运行,就能出现框体了

2.2创建显示框架

定义方法text_frame,创建一个frame框架text_frame,将该框架放置到win窗口中的上部分。

显示屏——双显

def text_frame(self):

text_frame = tkinter.Frame(self.win, width=360, height=190)

text_frame.pack(side=“top”)

frame 第一个参数为要放置的对象,第二个参数是宽度,应与窗口宽度一致,第三个参数是高度。

然后将该方法添加到init里面,就能生成这个框架了。

self.button_frame()

2.3放置显示屏

上显示屏使用的控件是label,下显示屏使用的控件是entry。它们都有一个参数叫textvariable,是用来接收可变对象,说白了就是跟可变对象绑定后,可变对象的值发生改变,显示框的值也发生改变。常见能接收的类型有StringVar() 和 IntVar()。因为我们计算是使用eval函数,里边的表达式是字符串类型的,所以我们的接收类型就使用了StringVar(),其常用的方法有get方法–获取当前显示框的文本,和set方法–设置显示框的值。之后我们会大量使用这两个方法,是不是很简单粗暴?因此在text_frame方法里面添加如下语句。

定义上下层显示屏可变追踪对象用于及时更新数据

self.lower_display = tkinter.StringVar()

self.upper_display = tkinter.StringVar()

设定下层显示的初始值

self.lower_display.set(“0”)

添加完后我们下显示屏默认会显示0,而上显示屏默认显示。

创建上显示屏label

设定上层显示组件, label——可多行显示,不可复制,不可直接通过键盘更改文本内容

self.label = tkinter.Label(text_frame, font=(“loMa”, 14),

textvariable=self.upper_display, bd=0, anchor=“se”, bg=“LightGray”)

  • text_frame: label要放置的对象。我们要把label放置在text_frame框架中。

  • font:字体。里边第一个参数是字体样式,第二个参数是字体大小。

  • textvariable:绑定可变对象。这里我们绑定的是上显示屏,其类型是StringVar()。

  • bd:边框大小。因为我们上下显示屏要看成一个整体,所以不能有边框,这里设置为0。

  • anchor:图形放置的位置。"se"表示东南部。相当于放在右下角了。说到这东西我必须吐槽一下,label明明也有justify属性(对齐方式),我把它修改为向右对齐却一点用都没有还是会居中显示,而entry修改这个属性后又能向右对齐,这给我整无语了。

  • bg:背景色。我为什么用这个颜色呢,因为我win10计算器是在pycharm下打开的,刚好那时候就显示这个色,我就把计算器调成这个颜色了,结果win10计算器颜色会变…想改其他颜色可以参考一下这个老哥@笑待人生原创库 的图片。

另外,要想查看更多tkinter命令可以查阅一下这篇文章。

Python GUI 编程(Tkinter) | 菜鸟教程 | 菜鸟教程")

创建下显示屏entry

设定下层显示组件, entry———单行输入显示,可复制,可直接通过键盘更改文本内容

self.entry = tkinter.Entry(text_frame, font=(“loMa”, 34, “bold”),

textvariable=self.lower_display, bd=0,

cursor=“circle”, justify=“right”, bg=“LightGray”)

这里的参数与label大致相似不再过多解释,在font参数那里多加了“bold”参数,表示加粗字体。下方参数多了个cursor表示鼠标图标,当我们将鼠标放上下显示屏的时候他会变成圆圈。截图截不了鼠标,各位可以自己试下,还是挺好看的。

放置显示屏

创建好显示屏后就要使用布局管理器将他们放入显示框架里面了,使用哪种布局呢?pack?虽然pack很方便,但是这里用不得pack。因为entry没有高度height属性,如果直接使用pack放置的话entry的高度会使用默认高度,很可能达不到你想要的结果。而place布局可以克服这一点,他可以自定义控件初始位置和大小,因此我们选用place布局管理器对上下显示屏进行布局。虽然label有高度属性,但是我们知道,布局管理器在同一容器里面只能使用一种,否则会报错,所以我们就统一使用place布局,并在里边设置起始位置和大小。

设定组件的放置位置及大小, entry没有高度这个属性,而默认高度显示不够美观,因为place布局可以自定义组件的高宽度,所以采用place布局

self.label.place(x=1, y=10, width=359, height=70)

self.entry.place(x=1, y=50, width=359, height=120)

x轴方向稍微空出一个像素会显得柔和些,不会那么突兀。

2.4创建按键框架

定义button_frame方法以及button_frame框架,将其放入到win窗口中的下部分。

按键

def button_frame(self):

button_frame = tkinter.Frame(self.win, width=370, height=270)

button_frame.pack(side=“bottom”)

将方法添加到init里面

self.text_frame()

2.5放置按钮

思路

遍历排列好的按钮字符串,定义行变量和列变量记录该按钮的行列值,列的值每满4个就要清零,行的值就要加一。然后使用grid布局将这些按钮根据此时行列值放置到按钮框架里面。放置的过程同时要绑定事件。事件下一小节会讲,这里就听一下概念就好。

确定按键顺序

我们根据计算器按键的顺序用一个按钮字符串存储起来,因为我们使用了中文字符,有时候一个按键的长度不为1,为了识别长度大于1的情况,我就用了花括号将按钮长度大于1的按钮名括起来。遍历时就能通过识别左右括号来确定里面按钮的值了。而长度为1的按钮直接添加到按钮框架即可。计算器按钮的布局是典型的二维表布局,所以使用grid布局管理器。先初始化变量。

设定计算器按键的顺序, 当按键名称长度大于一时用花括号括起来,方便后续判断

button_str = “%{CE}{清零}{删除}{求倒数}{求平方}{开根号}{除/}789{乘*}456{减-}123{加+}{相反数}0{小数点.}{等于=}”

in

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值