tkinter 菜单添加事件_【案例】用 tkinter 做一个计算器吧?(版本二)

e1885a13762a84e59a4f644714110d56.png

案例介绍

书接上回,这次我们加入清空键、退格键、括号以及菜单按钮——包括了百分号,数学计算所需要的符号。

我们将要学习:1.无标题小菜单的制作。2.生成/消除子标题框的方法。3.退格键功能的编写。

准备工作

  • Python 3.x

界面模块

将界面扩充为两个部分:扩充之前的主菜单+功能菜单。

c9a68b32d14549953c38eccc7d7c01be.png
版本二 界面

【key points】

  1. 无标题小菜单(功能菜单)的制作。核心代码:root.overrideredirect(True),其功能是消除标题栏,边框。需要注意的是,我为每个按钮事件中都添加了root.destroy()代码,使得每按下一个按钮就可以关闭功能菜单。
  2. 退格键功能。要义是:删除光标前的一个字符,再重新获取 entry 中的内容作为计算表达式,核心代码:
Entry_word.delete(Entry_word.index(tk.INSERT) - 1, Entry_word.index(tk.INSERT))
TEXT_str = Entry_word.get()

3. 括号功能。核心代码:

Entry_word.insert(tk.INSERT, '()')
TEXT_str = Entry_word.get()

代码汇总

 # coding: utf-8
 # !/usr/bin/python
 """
 @File       :   计算器.py
 @Author     :   jiaming
 @Modify Time:   2020/4/26 21:27
 @Contact    :   https://jiaming.blog.csdn.net/
 @Version    :   2.0
 @Desciption :   1. 没有数学计算,百分号
                 2. 光标尾置 done!
                 3. 回退键只能回退最后一个字符 done!
 """
 import tkinter as tk
 ​
 # 文本框中内容
 TEXT_str = ''
 ​
 ​
 def get_value():
     """
     求值
     :return:
     """
     try:
         print('所求表达式:', TEXT_str)
         value = str(eval(TEXT_str))
         return value
     except BaseException:
         print('出错!')
         return ''
 ​
 ​
 def menu():
     """
     菜单
     :return:
     """
     menu = tk.Tk()
     menu.title("菜单")
     menu.geometry('320x145+590+308')
     menu.overrideredirect(True)
     menu_list = [
         'pi', 'e', 'sin', 'cos',
         'tan', 'n!', 'log', 'ln',
         '^', 'sqrt', '%', '',
     ]
 ​
     def btn_command_menu(idx):
         """
         菜单界面
         :param idx:
         :return:
         """
         s = menu_list[idx]
         print("输入:", s)
         menu.destroy()
 ​
     # 放置按钮
     key = 0
     for i in range(0, 3):
         for j in range(0, 4):
             btn = tk.Button(
                 menu,
                 text=menu_list[key],
                 width=10,
                 height=2,
                 relief=tk.GROOVE,
                 command=lambda idx=key: btn_command_menu(idx))
             btn.grid(row=i, column=j)
             key += 1
 ​
     menu.mainloop()
 ​
 ​
 def main():
     """
     绘制计算器界面
     """
     # 界面对象的基本参数设置
     root = tk.Tk()
     root.title("计算器(Version2)")
     root.geometry('335x265+250+250')
     # 设置界面是否可以随意拉伸
     root.resizable(False, False)
 ​
     text_list = [
         'AC', 'BS', '( )', 'menu',
         '7', '8', '9', '+',
         '4', '5', '6', '-',
         '1', '2', '3', '*',
         '.', '0', '=', '/',
     ]
 ​
     # 放置文本框
     Entry_word = tk.Entry(root, width=30, font=('Arial', 15))
     Entry_word.grid(row=0, column=0, columnspan=4)
 ​
     def btn_command(idx=None):
         """
         按钮事件
         :param idx:
         :return:
         """
         global TEXT_str
         # 打印按钮的 text 值
         s = text_list[idx]
         print("输入:", s)
         if s == '=':
             # 按下等号,调用求值函数
             value_str = get_value()
             TEXT_str = ''  # 所求的表达式
             Entry_word.delete(0, tk.END)  # 清空输入框所有内容
             Entry_word.insert(tk.END, value_str)  # 向输入框中插入求得的值 value_str
         elif s == 'menu':
             # 菜单键
             menu()  # 调用菜单界面
         elif s == 'AC':
             TEXT_str = ''  # 所求的表达式
             Entry_word.delete(0, tk.END)  # 清空输入框所有内容
         elif s == 'BS':
             # print(Entry_word.index(tk.INSERT))
             Entry_word.delete(Entry_word.index(tk.INSERT) - 1,
                               Entry_word.index(tk.INSERT))
             TEXT_str = Entry_word.get()
         elif s == '( )':
             Entry_word.insert(tk.INSERT, '()')
             TEXT_str = Entry_word.get()
         else:
             # 其它
             Entry_word.insert(tk.INSERT, s)
             TEXT_str = Entry_word.get()
 ​
     # 放置按钮
     key = 0
     for i in range(1, 6):
         for j in range(0, 4):
             btn = tk.Button(
                 root,
                 text=text_list[key],
                 width=10,
                 height=2,
                 relief=tk.GROOVE,
                 command=lambda idx=key: btn_command(idx))
             btn.grid(row=i, column=j)
             key += 1
 ​
     root.mainloop()
 ​
 ​
 if __name__ == "__main__":
     main()
 ​

运行截图

c92f5cc5fd734ccbe307aa740082d172.png
输入表达式

c164539a2cf5c2558549d67255844a56.png
删除字符

20da7a2d9b6e73b0346694e65f9df12a.png
等号获取结果

后记

以上就是关于如何使用 tkinter 制作一个简易计算器(version 2)的全部内容,接下来,我们会加入数学计算的功能。

92638ab5e86ffa8852e3f361567be39b.gif

欢迎关注我的 CSDN 博客,里面有更多关于 python 的精彩知识分享哦~

CSDN-专业IT技术社区-登录​jiaming.blog.csdn.net
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值