PY蒟蒻紧急求助
  • 板块灌水区
  • 楼主ming_xin
  • 当前回复5
  • 已保存回复5
  • 发布时间2021/8/7 08:17
  • 上次更新2023/11/4 11:45:48
查看原帖
PY蒟蒻紧急求助
399750
ming_xin楼主2021/8/7 08:17

最近闲着没事干就写了一个计算器的程序,但写着写着就出了一个问题,先看代码:

import tkinter as tk,threading,os
from tkinter.messagebox import*
from tkinter import*
ans=""
show="0"
i=0
records=[]
pd=0
record_final=''
x=0
def qdxs(): #这是什么
    try:
        x=tk.Label(root,text=str(show))
        x.grid(columnspan=5,row=0)
    except:
        print()
def check_limist(): #检测上限
    global ans,i,show
    try:
        while True:
            if len(ans)>15:
                showwarning("超出限制","目前最多仅能容载15个字符")
                i=1
                ans=""
                show="                                 "
                qdxs()
                show="Limist Error"
                qdxs()
    except :
        print()
def number(num): #数字(×
    global ans,show,i,pd
    if i:
        showwarning("有问题","请归零后重新尝试")
    else:
        if show =="0":
            show="                         "
            qdxs()
            show=''
            qdxs()
            ans+=num
            show+=num
            qdxs()
        else:
            ans+=num
            show+=num
            qdxs()
            pd=0

def j(): #加号
    global ans,show,i,pd
    if i:
        showwarning("有问题","请归零后重新尝试")
    else:
        if show =="0":
            show="                         "
            qdxs()
            show=''
            qdxs()
            ans+="+"
            show+="+"
            qdxs()
        else:
            ans+="+"
            show+='+'
            qdxs()
            pd=0
def ji(): #减号
    global ans,show,i,pd
    if i:
        showwarning("有问题","请归零后重新尝试")
    else:
        if show =="0":
            show="                         "
            qdxs()
            show=''
            qdxs()
            ans+="-"
            show+='-'
            qdxs()
        else:
            ans+="-"
            show+='-'
            qdxs()
            pd=0
def c(): #乘号
    global ans,show,i,pd
    if i:
        showwarning("有问题","请归零后重新尝试")
    else:
        if show =="0":
            show="                         "
            qdxs()
            show=''
            qdxs()
            show+='×'
            qdxs()
        else:
            ans+="*"
            show+='×'
            qdxs()
            pd=0
def ch(): #除号
    global ans,show,i
    if i:
        showwarning("有问题","请归零后重新尝试")
    else:
        if show =="0":
            show="                         "
            qdxs()
            show=''
            qdxs()
            ans+="/"
            show+='÷'
            qdxs()
        else:
            ans+="/"
            show+='÷'
            qdxs()
            pd=0
def zx(): #等于号执行操作
    try:
        global ans,show,i,pd,record_final
        if i:
            showwarning("有问题","请归零后重新尝试")
        else:
            record_final=show+"="
            show="                            "
            qdxs()
            show='0'
            qdxs()
            show=str(eval(ans))
            record_final+=show
            qdxs()
            pd=1
            ans=str(eval(ans))
    except SyntaxError:
        if i:
            showwarning("有问题","请归零后重新尝试")
        else:
            showwarning("提示","您的计算式有问题,请归零后重试")
            show="SyntaxError"
            qdxs()
            i=1
            pd=0
    except ZeroDivisionError:
        if i:
            showwarning("有问题","请归零后重新尝试")
        else:
            showwarning("出错啦!","请不要让零作为除数")
            show="MathError"
            qdxs()
            i=1
            pd=0
def gl(): #归零qwq
    global ans,show,i,pd
    ans=""
    show="                              "
    qdxs()
    show='0'
    qdxs()
    i=0
    pd=0
def tw(): #退位符号
    global ans,show,i,pd
    if show=="0" or show=="":
        showwarning("温馨提示","别退位了,无路可退了……")
        i=1
    if i:
        showwarning("有问题","请归零后重新尝试")
    else:
        if show =="0":
            show="                         "
            qdxs()
            show=''
            qdxs()
            ans_str=list(ans)
            show_str=list(show)
            ans_str.pop(-1)
            show_str.pop(-1)
            ans=''.join(ans_str)
            show=''.join(show_str)
            if(ans or show ==""):
                show="                        "
                qdxs()
                ans=''
                show=""
                qdxs()
                ans="0"
                show="0"
                qdxs()
                i=0
                pd=0
            else:
                qdxs()
                i=0
                pd=0
        else:
            ans_str=list(ans)
            show_str=list(show)
            ans_str.pop(-1)
            show_str.pop(-1)
            ans=''.join(ans_str)
            show=''.join(show_str)
            qdxs()
            i=0
            pd=0
def zkh():
    global ans,show,i,pd
    if i:
        showwarning("有问题","请归零后重新尝试")
    else:
        if show =="0":
            show="                         "
            qdxs()
            show=''
            qdxs()
            ans+="("
            show+="("
            qdxs()
        else:
            ans+="("
            show+="("
            qdxs()
            i=0
            pd=0
def ykh():
    global ans,show,i,pd
    if i:
        showwarning("有问题","请归零后重新尝试")
    else:
        if show =="0":
            show="                         "
            qdxs()
            show=''
            qdxs()
            ans+=")"
            show+=")"
            qdxs()
        else:
            ans+=")"
            show+=")"
            qdxs()
            i=0
            pd=0
def mi():
    global ans,show,i,pd
    if i:
        showwarning("有问题","请归零后重新尝试")
    else:
        if show =="0":
            show="                         "
            qdxs()
            show=''
            qdxs()
            ans+="**2"
            show+="^2"
            qdxs()
        else:
            ans+="**2"
            show+="^2"
            qdxs()
            i=0
            pd=0
    
def record(): #Menu中的记录功能
    global records,pd,record_final
    recordfile=open("recordfile.txt","a")
    if pd:
        showinfo("记录","记录成功")
        recordfile.write(record_final+"\n")
        recordfile.close()
        record_final=''
        pd=0
    else:
        showwarning("记录","记录失败,因为只能记录算式+结果,或者您已经记录过了")
def check(recordfile="recordfile.txt"):
    global records,x
    try:
        with open(recordfile) as infile:
            for line in infile:
                account=line.split("\n")
                records.append(account)
        x=len(records)
        showinfo("共%s个记录"%(x),"分别为\n%s\n"%(records))
        records=[]
    except:
        showwarning("出错了!","没有记录文件")
def delete_all():
    try:
        for file_name in os.listdir():
            if file_name=="recordfile.txt":
                os.unlink(file_name)
    except:
        showwarning("出错了!","没有记录文件!")

def delete_some(recordfile="recordfile.txt"):
    global x,records
    btt=[""]
    print(len(btt))
    with open(recordfile) as infile:
        for line in infile:
            account=line.split(",")
            records.append(account)
    x=len(records)
    for i in range(0,x+1):
        btt=btt+[i]
    shelf=tk.Tk()
    shelf.title("删除记录")
    for j in range(x-1,-1,-1):
        s=j
        btt[j]=tk.Button(shelf,text="%s"%(records[j]),command=lambda:delete(s))
        btt[j].grid(row=x-1-int(j),column=0)
    print(id(s))
    #print(btt[j])
    def delete(s):
        global records,pdd
        #print(id(s))
        records.remove(records[s])
        recordfile=open("recordfile.txt","w")
        for i in records:
            recordfile.write(i[0])
        btt[s].destroy()
        showinfo("删除","恭喜您删除成功")
    btt_shelve=tk.Button(shelf,text="退出该界面",command=shelf.destroy)
    btt_shelve.grid(row=x,columnspan=1)
    shelf.mainloop()

def version_intr(): #Menu中的
    showinfo("版本","3.0bete版")
def about_editor():
    showinfo("作者","作者:MINGXIN\n一个什么都不会的小白")
def mMenu(win): #我不知道为什么要写这个
    root=Menu(win)
    win.config(menu=root) #记录功能
    record_level=Menu(root,tearoff=False)
    record_level.add_command(label='记录',command=record,underline=0)
    record_level.add_command(label='查看记录',command=check,underline=0)
    record_level.choices=Menu(record_level,tearoff=False)
    record_level.choices.add_command(label="全部删除",command=delete_all,underline=0)
    record_level.choices.add_command(label="部分删除",command=delete_some,underline=0)
    record_level.add_cascade(label="删除记录",menu=record_level.choices)
    root.add_cascade(label="记录功能",menu=record_level)

    about=Menu(root,tearoff=False) #没用的关于功能,但我还要写
    about.add_command(label="版本介绍",command=version_intr,underline=0)
    about.add_command(label="关于作者",command=about_editor,underline=0)
    root.add_cascade(label="关于",menu=about)
root=tk.Tk()
root.title('非常厉害的计算器')
mMenu(root)
qdxs()
threading_1=threading.Thread(target=check_limist)
threading_1.start() #启动新线程:检测上限
bt1=tk.Button(root,text="1",command=lambda:number('1'))
bt2=tk.Button(root,text="2",command=lambda:number('2'))
bt3=tk.Button(root,text="3",command=lambda:number('3'))
bt4=tk.Button(root,text="4",command=lambda:number('4'))
bt5=tk.Button(root,text="5",command=lambda:number('5'))
bt6=tk.Button(root,text="6",command=lambda:number('6'))
bt7=tk.Button(root,text="7",command=lambda:number('7'))
bt8=tk.Button(root,text="8",command=lambda:number('8'))
bt9=tk.Button(root,text="9",command=lambda:number('9'))
bt0=tk.Button(root,text="0",command=lambda:number('0'))
bt11=tk.Button(root,text="+",command=j)
bt12=tk.Button(root,text="-",command=ji)
bt13=tk.Button(root,text="×",command=c)
bt14=tk.Button(root,text="÷",command=ch)
bt15=tk.Button(root,text="=",command=zx)
bt16=tk.Button(root,text="←",command=tw)
bt17=tk.Button(root,text="(",command=zkh)
bt18=tk.Button(root,text=")",command=ykh)
bt19=tk.Button(root,text="²",command=mi)
bt20=tk.Button(root,text="C",command=gl)
bt1.grid(row=1,column=1,sticky=tk.W,padx=20,pady=20)
bt2.grid(row=1,column=2,sticky=tk.S,padx=20,pady=20)
bt3.grid(row=1,column=3,sticky=tk.N,padx=20,pady=20)

bt4.grid(row=2,column=1,sticky=tk.W,padx=20,pady=20)
bt5.grid(row=2,column=2,sticky=tk.S,padx=20,pady=20)
bt6.grid(row=2,column=3,sticky=tk.N,padx=20,pady=20)

bt7.grid(row=3,column=1,sticky=tk.W,padx=20,pady=20)
bt8.grid(row=3,column=2,sticky=tk.S,padx=20,pady=20)
bt9.grid(row=3,column=3,sticky=tk.N,padx=20,pady=20)

bt0.grid(row=4,column=1,sticky=tk.W,padx=20,pady=20)

bt11.grid(row=1,column=4,sticky=tk.E,padx=20,pady=20)
bt12.grid(row=2,column=4,sticky=tk.E,padx=20,pady=20)
bt13.grid(row=3,column=4,sticky=tk.E,padx=20,pady=20)
bt14.grid(row=4,column=4,sticky=tk.E,padx=20,pady=20)
bt15.grid(row=4,column=3,sticky=tk.N,padx=20,pady=20)
bt16.grid(row=4,column=2,sticky=tk.S,padx=20,pady=20)

bt17.grid(row=1,column=0,sticky=tk.N,padx=20,pady=20)
bt18.grid(row=2,column=0,sticky=tk.N,padx=20,pady=20)
bt19.grid(row=3,column=0,sticky=tk.N,padx=20,pady=20)
bt20.grid(row=4,column=0,sticky=tk.N,padx=20,pady=20)
root.bind("<Return>",lambda event:zx())
tk.mainloop()

出问题的地方主要在

def delete_some(recordfile="recordfile.txt"):
    global x,records
    btt=[""]
    print(len(btt))
    with open(recordfile) as infile:
        for line in infile:
            account=line.split(",")
            records.append(account)
    x=len(records)
    for i in range(0,x+1):
        btt=btt+[i]
    shelf=tk.Tk()
    shelf.title("删除记录")
    for j in range(x-1,-1,-1):
        s=j
        btt[j]=tk.Button(shelf,text="%s"%(records[j]),command=lambda:delete(s))
        btt[j].grid(row=x-1-int(j),column=0)
    print(id(s))
    #print(btt[j])
    def delete(s):
        global records,pdd
        #print(id(s))
        records.remove(records[s])
        recordfile=open("recordfile.txt","w")
        for i in records:
            recordfile.write(i[0])
        btt[s].destroy()
        showinfo("删除","恭喜您删除成功")
    btt_shelve=tk.Button(shelf,text="退出该界面",command=shelf.destroy)
    btt_shelve.grid(row=x,columnspan=1)
    shelf.mainloop()

这一段的主要问题在于将s上传到函数之后值改变了,(我主要想创建多个按钮,然后点那个按钮就删除那个)

如果有其他问题的话,欢迎神犇来指点

2021/8/7 08:17
加载中...