设计主菜单,通过功能选择来实现相应程序的运行


前言

老师布置的作业
设计一个主菜单,通过菜单项目选择进入下列5个程序

提示:以下是本篇文章正文内容,下面案例可供参考

一、题目

1.目前我国个人所得税计算公式如下:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
应纳个人所得税税额= (工资薪金所得 -五险一金 - 个税免征额)×适用税率-速算扣除数‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪
个税免征额为5000元/月,2018年10月1日起调整后,也就是2018年实行的7级超额累进个人所得税税率表如下:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
全月应纳税所得额(含税级距) 税率(%) 速算扣除数
不超过3,000元 3 0
超过3,000元至12,000元的部分 10 210
超过12,000元至25,000元的部分 20 1,410
超过25,000元至35,000元的部分 25 2,660
超过35,000元至55,000元的部分 30 4,410
超过55,000元至80,000元的部分 35 7,160
超过80,000元的部分 45 15,160‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
请编写一个个税计算器,用户输入为应发工资薪金所得扣除五险一金后的金额,输出应缴税款和实发工资,结果保留小数点后两位。当输入数字小于0时,输出“error”。

2.第二代居民身份证是依据2003年6月28日第十届全国人大常委会第3次会议通过的《中华人民共和国居民身份证法》实施的。第一代身份证十五位数升为第二代身份证十八位数的一般规则是:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
第一步,在原十五位数身份证的第六位数后面插入19 (1905年1月1日以后出生)或20(2000.1.1-2004.12.31出生),这样身份证号码即为十七位数;
第二步,按照国家规定的统一公式计算出第十八位数,作为校验码放在第二代身份证的尾号。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
校验码计算方法:将身份证前十七位数分别乘以不同系数并求和
S = Sum(Ai * Wi)
Ai:表示第i位置上的身份证号码数字值, i = 0, … , 16
Wi:表示第i位置上的加权因子,Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
S对11取模得到余数0-10,对应的校验码如下:
余数 Y: 0 1 2 3 4 5 6 7 8 9 10
校验码: 1 0 X 9 8 7 6 5 4 3 2
#题目假设所有人均出生于1905年1月1日以后,2005年1月1日以前

输入格式
输入一个15位身份证号‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
输出格式
输出一个18位身份证号

3.数学领域著名的“哥德巴赫猜想”的大致意思是:任何一个大于2的偶数总能表示为两个素数之和。比如:24=5+19,其中5和19都是素数。本实验的任务是设计一个程序,验证20亿以内的偶数都可以分解成两个素数之和。输入一个大于2的正整数,当输入为偶数时,在一行中按照格式“N = p + q”输出N的素数分解,其中p 、 q均为素数且p ≤ q。因为这样的分解可能不唯一(例如24还可以分解为7+17),要求必须输出所有解中p最小的解。当输入为奇数时,输出’Data error!’ 。

4.自幂数是指一个 n 位数,它的每个位上的数字的 n 次幂之和等于它本身,例如:13 + 53+ 3**3 = 153,编程寻找并输出 n 位的自幂数,n 由用户输入,每行输出一个数字。
n为1时,自幂数称为独身数。显然,0,1,2,3,4,5,6,7,8,9都是自幂数。
n为2时,没有自幂数。
n为3时,自幂数称为水仙花数,有4个
n为4时,自幂数称为四叶玫瑰数,共有3个
n为5时,自幂数称为五角星数,共有3个
n为6时,自幂数称为六合数, 只有1个
n为7时,自幂数称为北斗七星数, 共有4个
n为8时,自幂数称为八仙数, 共有3个
n为9时,自幂数称为九九重阳数,共有4个
n为10时,自幂数称为十全十美数,只有1个
‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
输入格式
输入一个大于或等于 3 且小于 7 的正整数 n‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
输出格式
按从小到大的顺序输出 n 位的自幂数,每行一个数

5.相传古代印度国王舍罕要褒赏他的聪明能干的宰相达依尔 (国际象棋发明者),问他需要什么?‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬达依尔回答说:“国王只要在国际象棋的棋盘第一个格子里放一粒麦子,第二个格子里放两粒,第三个格子里放四粒,按此比例以后每一格加一倍,一直放到64格(国际象棋棋盘是8×8=64格),我就感恩不尽,其他的我什么也不要了。”‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
国王想:“这有多少,还不容易!”让人扛来一袋小麦,但不到一会儿全用没了,再来一袋很快又没有了,结果全印度的粮食全部用完还不够,国王纳闷,怎样也算不清这笔账,请你帮国王计算一下,放到第 n (1<= n <=64)格时,共需多少粒麦子,写出程序。

二、题目代码

代码如下:

import tkinter
from tkinter import *
import math
from tkinter import messagebox


root = Tk()
root.geometry('400x200+100+100')
# root.resizable(False,False)
root.title('>>>计算器<<<')


def func1():
    frame1.grid_forget()
    frame3.grid_forget()
    frame4.grid_forget()
    frame5.grid_forget()
    frame6.grid_forget()
    frame2.grid()

def func2():
    frame1.grid_forget()
    frame2.grid_forget()
    frame4.grid_forget()
    frame5.grid_forget()
    frame6.grid_forget()
    frame3.grid()

def func3():
    frame1.grid_forget()
    frame2.grid_forget()
    frame3.grid_forget()
    frame5.grid_forget()
    frame6.grid_forget()
    frame4.grid()

def func4():
    frame1.grid_forget()
    frame2.grid_forget()
    frame3.grid_forget()
    frame4.grid_forget()
    frame6.grid_forget()
    frame5.grid()

def func5():
    frame1.grid_forget()
    frame2.grid_forget()
    frame3.grid_forget()
    frame4.grid_forget()
    frame5.grid_forget()
    frame6.grid()

def func():
    frame2.grid_forget()
    frame3.grid_forget()
    frame4.grid_forget()
    frame5.grid_forget()
    frame6.grid_forget()
    frame1.grid()
    enter15.delete(0, 'end')
    enter18.delete(0, 'end')
    enter3.delete(0, 'end')
    enter4.delete(0, 'end')
    enter1.delete(0, 'end')
    enter2.delete(0, 'end')
    enter5.delete(0, 'end')
    enter6.delete(0, 'end')
    enter7.delete(0, 'end')
    enter8.delete(0, 'end')
    enter9.delete(0, 'end')




frame1 = tkinter.Frame(root)
frame1.grid()
lab1 = Label(frame1,text='>>欢迎来到计算器菜单<<\n\n>>请选择您需要的功能<<',fg='red',font=('宋体',15),height=5)
lab1.grid(columnspan=3)

func_1 = Button(frame1,text='个税计算器',font=('黑体',12),width=14,height=2)
func_1.grid(row=1,column=0)
func_1.config(command=func1)

func_2 = Button(frame1,text='身份证计算器',font=('黑体',12),width=14,height=2)
func_2.grid(row=1,column=1)
func_2.config(command=func2)

func_3 = Button(frame1,text='哥德巴赫猜想',font=('黑体',12),width=14,height=2)
func_3.grid(row=1,column=2)
func_3.config(command=func3)

func_4 = Button(frame1,text='自幂数',font=('黑体',12),width=14,height=2)
func_4.grid(row=2,column=0,columnspan=2)
func_4.config(command=func4)

func_5 = Button(frame1,text='象棋与粮食',font=('黑体',12),width=14,height=2,command=func5)
func_5.grid(row=2,column=1,columnspan=2)
func_5.config(command=func5)

def func1_1(ev=None):
    s = int(enter5.get())
    if s < 0:
        messagebox.showerror(title="警告", message="error!")
        enter5.delete(0, 'end')
        enter6.delete(0, 'end')
        enter7.delete(0, 'end')
    else:
        s = s - 5000
        m = 0
        if 80000 < s:
            m = (s - 80000) * 0.45 + 15160
        elif 55000 < s <= 80000:
            m = (s - 55000) * 0.35 + 7160
        elif 35000 < s <= 55000:
            m = (s - 35000) * 0.3 + 4410
        elif 25000 < s <= 35000:
            m = (s - 25000) * 0.25 + 2660
        elif 12000 < s <= 25000:
            m = (s - 12000 * 0.2) + 1410
        elif 3000 < s <= 12000:
            m = (s - 3000) * 0.1 + 210
        elif 0 < s <= 3000:
            m = s * 0.03
        n = s + 5000 - m

        enter6.delete(0, 'end')
        enter6.insert(0, m)
        enter7.delete(0, 'end')
        enter7.insert(0, n)


frame2 = tkinter.Frame(root)
frame2.grid()
func_1_lab1 = Label(frame2,text='个税计算器',font=('黑体',12),fg='red',width=14,height=2)
func_1_lab1.grid(row=0,column=1,columnspan=3)
func_1_lab2 = Label(frame2,text='扣除五险一金后',font=('黑体',12),width=14,height=2)
func_1_lab2.grid(row=1,column=0)
enter5 = Entry(frame2,width=18)
enter5.grid(row=1,column=1,columnspan=2)
enter5.bind("<Return>",func1_1)
func_1_lab3 = Label(frame2,text='应缴纳税金:',font=('黑体',12),width=14,height=2)
func_1_lab3.grid(row=2,column=0)
enter6 = Entry(frame2,width=18)
enter6.grid(row=2,column=2,columnspan=2)
func_1_lab4 = Label(frame2,text='实发工资:',font=('黑体',12),width=14,height=2)
func_1_lab4.grid(row=3,column=0)
enter7 = Entry(frame2,width=18)
enter7.grid(row=3,column=2,columnspan=2)
func_1_b1 = Button(frame2,text='计算',font=('宋体',12),width=8,command=func1_1)
func_1_b1.grid(row=4,column=0,columnspan=2)
func_1_b1 = Button(frame2,text='后退',font=('宋体',12),width=8,command=func)
func_1_b1.grid(row=4,column=1,columnspan=2)



def func2_1(ev=None):
    dic = {0: 1, 1: 0, 2: "X", 3: 9, 4: 8, 5: 7, 6: 6, 7: 5, 8: 4, 9: 3, 10: 2}
    n = enter15.get()
    if (n == '') or (len(n) != 15):
        messagebox.showerror(title="警告", message="请输入需要的计算值")
    elif n.isdigit() == False:
        messagebox.showerror(title="警告", message="请输入正确的格式")
    else:
        lst = list(n)
        s = 0
        Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
        if 5 <= int(lst[6] + lst[7]) < 99:
            lst = lst[0:6] + ['1'] + ['9'] + lst[6:]
        if 0 <= int(lst[6] + lst[7]) <= 4:
            lst = lst[0:6] + ['2'] + ['0'] + lst[6:]
        for i in range(0, 17):
            s = s + int(lst[i]) * Wi[i]
        t = s % 11
        lst = lst + [str(dic[t])]
        a = ("").join(map(lambda x: x, lst))
        enter18.delete(0,'end')
        enter18.insert(0,a)

frame3 = tkinter.Frame(root)
frame3.grid()
func_2_lab1 = Label(frame3,text='身份证计算器:',font=('黑体',12),fg='red',width=14,height=2)
func_2_lab1.grid(row=0,column=1,columnspan=3)
func_2_lab2 = Label(frame3,text='15位身份证:',font=('黑体',12),width=14,height=2)
func_2_lab2.grid(row=1,column=0)
enter15 = Entry(frame3,width=18)
enter15.grid(row=1,column=1,columnspan=2)
enter15.bind("<Return>",func2_1)
func_2_lab3 = Label(frame3,text='18位身份证:',font=('黑体',12),width=14,height=2)
func_2_lab3.grid(row=2,column=0)
enter18 = Entry(frame3,width=18)
enter18.grid(row=2,column=2,columnspan=2)
func_2_b1 = Button(frame3,text='计算',font=('宋体',12),width=8,command=func2_1)
func_2_b1.grid(row=3,column=0,columnspan=2)
func_2_b1 = Button(frame3,text='后退',font=('宋体',12),width=8,command=func)
func_2_b1.grid(row=3,column=1,columnspan=2)


def bbsb(n):
    for i in range(2, int(n ** 0.5 + 1)):
        if n % i == 0:
            return False
    return True

def func3_1(ev=None):
    s = ''
    a = int(enter8.get())
    if a % 2 != 0:
        messagebox.showerror(title="警告", message="Data error!")
    else:
        for i in range(2, a):
            if bbsb(i) and bbsb(a - i) and i <= a - i:
                s = "{} = {} + {}".format(a, i, a - i)
                break
        enter9.delete(0, 'end')
        enter9.insert(0, s)


frame4 = tkinter.Frame(root)
frame4.grid()
func_3_lab1 = Label(frame4,text='哥德巴赫猜想',font=('黑体',12),fg='red',width=14,height=2)
func_3_lab1.grid(row=0,column=1,columnspan=3)
func_3_lab2 = Label(frame4,text='输入>2的偶数',font=('黑体',12),width=14,height=2)
func_3_lab2.grid(row=1,column=0)
enter8 = Entry(frame4,width=18)
enter8.grid(row=1,column=1,columnspan=2)
enter8.bind("<Return>",func3_1)
func_3_lab3 = Label(frame4,text='可分解为:',font=('黑体',12),width=14,height=2)
func_3_lab3.grid(row=2,column=0)
enter9 = Entry(frame4,width=18)
enter9.grid(row=2,column=2,columnspan=2)
func_3_b1 = Button(frame4,text='计算',font=('宋体',12),width=8,command=func3_1)
func_3_b1.grid(row=3,column=0,columnspan=2)
func_3_b1 = Button(frame4,text='后退',font=('宋体',12),width=8,command=func)
func_3_b1.grid(row=3,column=1,columnspan=2)



def func4_1(ev=None):
    try:
        n = int(enter3.get())
    except:
        messagebox.showerror(title="警告", message="请输入需要的计算值")
    else:
        enter4.delete(0, 'end')
        for i in range(int(math.pow(10, n - 1)), int(math.pow(10, n))):
            num = 0
            for j in str(i):
                num += int(math.pow(int(j), n))
            if (i == num):
                enter4.insert(0, i)
                enter4.insert(0,' ')

frame5 = tkinter.Frame(root)
frame5.grid()
func_4_lab1 = Label(frame5,text='自幂数:',font=('黑体',12),fg='red',width=14,height=2)
func_4_lab1.grid(row=0,column=1,columnspan=3)
func_4_lab2 = Label(frame5,text='输入位数:',font=('黑体',12),width=14,height=2)
func_4_lab2.grid(row=1,column=0)
enter3 = Entry(frame5,width=18)
enter3.grid(row=1,column=1,columnspan=2)
enter3.bind("<Return>",func4_1)                                                        #enter1绑定回车键
func_4_lab3 = Label(frame5,text='该位自幂数为:',font=('黑体',12),width=14,height=2)
func_4_lab3.grid(row=2,column=0)
enter4 = Entry(frame5,width=18)
enter4.grid(row=2,column=2,columnspan=2)
func_4_b1 = Button(frame5,text='计算',font=('宋体',12),width=8,command=func4_1)
func_4_b1.grid(row=3,column=0,columnspan=2)
func_4_b1 = Button(frame5,text='后退',font=('宋体',12),width=8,command=func)
func_4_b1.grid(row=3,column=1,columnspan=2)




def func5_1(ev=None):
    try:
        sum = 0
        x = int(enter1.get())
    except:
        messagebox.showerror(title="警告", message="请输入正确的计算值")
    else:
        if x in range(1,65):
            sum = 2 ** x - 1
            enter2.delete(0, 'end')
            enter2.insert(0, sum)
        else:
            messagebox.showerror(title="警告", message="请输入正确的计算值")


frame6 = tkinter.Frame(root)
frame6.grid()
func_5_lab1 = Label(frame6,text='象棋与粮食',font=('黑体',12),fg='red',width=14,height=2)
func_5_lab1.grid(row=0,column=1,columnspan=3)
func_5_lab2 = Label(frame6,text='输入象棋格数:',font=('黑体',12),width=14,height=2)
func_5_lab2.grid(row=1,column=0)
enter1 = Entry(frame6,width=18)
enter1.grid(row=1,column=1,columnspan=2)
enter1.bind("<Return>",func5_1)                                                        #enter1绑定回车键
func_5_lab3 = Label(frame6,text='共有大米数量:',font=('黑体',12),width=14,height=2)
func_5_lab3.grid(row=2,column=0)
enter2 = Entry(frame6,width=18)
enter2.grid(row=2,column=2,columnspan=2)
func_2_b1 = Button(frame6,text='计算',font=('宋体',12),width=8,command=func5_1)
func_2_b1.grid(row=3,column=0,columnspan=2)
func_2_b1 = Button(frame6,text='后退',font=('宋体',12),width=8,command=func)
func_2_b1.grid(row=3,column=1,columnspan=2)


root.mainloop()

三、效果展示

界面展示
功能展示报错展示

总结

这次题目的五个小功能并不是很难,主要的对于python的tkinter库的运用,tkinter方便好用,但是做出的界面还是不够美观,略显呆板,应当是笔者的水平太低了
各个控件的放置笔者算是熟练,在此次作业取得的收获主要是学会了如何解决各个功能转换时界面出现的问题
如:
各项frame会堆积到一起

def func4():
    frame1.grid_forget()
    frame2.grid_forget()
    frame3.grid_forget()
    frame4.grid_forget()
    frame6.grid_forget()
    frame5.grid()

特意建立一个函数取消非现有功能的frame

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值