最近闲着没事干就写了一个计算器的程序,但写着写着就出了一个问题,先看代码:
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上传到函数之后值改变了,(我主要想创建多个按钮,然后点那个按钮就删除那个)
如果有其他问题的话,欢迎神犇来指点