如果第三次输入错误的密码,我试图让这个程序直接结束,而不会问“程序是否还在运行,你想要杀死它吗?”尝试使用'quit()',但程序没有响应。请帮帮我。
import Tkinter
global root
global s
# this is the main/root window
root = Tkinter.Tk()
root.title("Stock Plus system")
root.geometry('800x600')
b2Var=Tkinter.StringVar()
s = 1
def win2():
# this is the child window
labelcementin = Tkinter.Label(root,text='Cement quantity in:')
labelcementin.grid(row=1,column=1)
labelhammerin = Tkinter.Label(root,text='Hammer quantity in;')
labelhammerin.grid(row=2,column=1)
labelspannerin = Tkinter.Label(root,text='Spanner quantity in:')
labelspannerin.grid(row=3,column=1)
labelbrickin = Tkinter.Label(root,text='Brick quantity in:')
labelbrickin.grid(row=4,column=1)
labelmirrorin = Tkinter.Label(root,text='Mirror quantity in:')
labelmirrorin.grid(row=5,column=1)
labelcementout = Tkinter.Label(root,text='Cement quantity out:')
labelcementout.grid(row=1,column=3)
labelhammerout = Tkinter.Label(root,text='Hammer quantity out:')
labelhammerout.grid(row=2,column=3)
labelspannerout = Tkinter.Label(root,text='Spanner quantity out:')
labelspannerout.grid(row=3,column=3)
labelbrickout = Tkinter.Label(root,text='Brick quantity out:')
labelbrickout.grid(row=4,column=3)
labelmirrorout = Tkinter.Label(root,text='Mirror quantity out:')
labelmirrorout.grid(row=5,column=3)
def calc_val():
Total_StockIn=int(cementinVar.get())+int(hammerinVar.get())+int(spannerinVar.get())+int(brickinVar.get())+int(mirrorinVar.get())
StockInLabel=Tkinter.Label(root,text='The total stock in is '+str(Total_StockIn))
StockInLabel.grid(row=8,column=2)
Total_Expenses= (int(cementinVar.get())*16)+(int(hammerinVar.get())*10)+(int(spannerinVar.get())*8)+(int(brickinVar.get())*2)+(int(mirrorinVar.get())*22)
ExpensesLabel=Tkinter.Label(root,text='The total expenses is RM ' + str(Total_Expenses))
ExpensesLabel.grid(row=9,column=2)
Total_Income= (int(cementoutVar.get())*18)+(int(hammeroutVar.get())*12)+(int(spanneroutVar.get())*10)+(int(brickoutVar.get())*4)+(int(mirroroutVar.get())*25)
IncomeLabel = Tkinter.Label(root,text = 'The Total income is RM ' +str(Total_Income))
IncomeLabel.grid(row=8, column= 4)
Remaining_Stock =Total_StockIn-(int(cementoutVar.get())+int(hammeroutVar.get())+int(spanneroutVar.get())+int(brickoutVar.get())+int(mirroroutVar.get()))
RemainingLabel = Tkinter.Label(root,text = 'The remaining stock is ' + str(Remaining_Stock))
RemainingLabel.grid(row=9, column = 4)
Total_Profit = (Total_Income) - (Total_Expenses)
ProfitLabel = Tkinter.Label(root,text = 'The total profit is RM ' + str(Total_Profit))
ProfitLabel.grid(row=10, column = 3)
quit()
boxcementin = Tkinter.Entry(root,width=12,textvariable=cementinVar)
boxcementin.grid(row=1, column=2)
boxhammerin = Tkinter.Entry(root,width=12,textvariable=hammerinVar)
boxhammerin.grid(row=2, column=2)
boxspannerin = Tkinter.Entry(root,width=12,textvariable=spannerinVar)
boxspannerin.grid(row=3, column=2)
boxbrickin = Tkinter.Entry(root,width=12,textvariable=brickinVar)
boxbrickin.grid(row=4, column=2)
boxmirrorin = Tkinter.Entry(root,width=12,textvariable=mirrorinVar)
boxmirrorin.grid(row=5, column=2)
boxcementout = Tkinter.Entry(root,width=12,textvariable=cementoutVar)
boxcementout.grid(row=1, column=4)
boxhammerout = Tkinter.Entry(root,width=12,textvariable=hammeroutVar)
boxhammerout.grid(row=2, column=4)
boxspannerout = Tkinter.Entry(root,width=12,textvariable=spanneroutVar)
boxspannerout.grid(row=3, column=4)
boxbrickout = Tkinter.Entry(root,width=12,textvariable=brickoutVar)
boxbrickout.grid(row=4, column=4)
boxmirrorout = Tkinter.Entry(root,width=12,textvariable=mirroroutVar)
boxmirrorout.grid(row=5, column=4)
button = Tkinter.Button(root,text='Calculate',command=calc_val)
button.grid(row=7,column=3)
def textboxvalue():
#For password entry
global s
if (s!=3 ):
Password=b2Var.get()
Username=b1Var.get()
if Password ==('stock123'):
label4=Tkinter.Label(root,text='Welcome to stock plus system, press login again to start using')
label4.grid(row=0,column=3)
Button_1 = Tkinter.Button(root, text="Login", command=win2)
Button_1.grid(row=7,column=3)
else:
s =s+1
label3=Tkinter.Label(root,text='Try again')
label3.grid(row=3,column=1)
else:
label5=Tkinter.Label(root,text='bye')
label5.grid(row=4,column=4)
label6=Tkinter.Label(root,text='Thank You for using Stock Plus System ')
label6.grid(row=5,column=4)
#Widgets in main window
Button_1 = Tkinter.Button(root, text="Login", command=textboxvalue)
Button_1.grid(row=7, column=3)
b1Var = Tkinter.StringVar()
b2Var = Tkinter.StringVar()
box1Label = Tkinter.Label(root,text='Username:')
box1Label.grid(row=1,column=3)
box2Label = Tkinter.Label(root,text='Password:')
box2Label.grid(row=2,column=3)
box1Text = Tkinter.Entry(root,textvariable=b1Var,width=12)
box1Text.grid(row=1, column=4)
box2Text = Tkinter.Entry(root,textvariable=b2Var,width=12,show='*')
box2Text.grid(row=2, column=4)
cementinVar = Tkinter.IntVar()
hammerinVar = Tkinter.IntVar()
spannerinVar = Tkinter.IntVar()
brickinVar = Tkinter.IntVar()
mirrorinVar = Tkinter.IntVar()
cementoutVar = Tkinter.IntVar()
hammeroutVar = Tkinter.IntVar()
spanneroutVar = Tkinter.IntVar()
brickoutVar = Tkinter.IntVar()
mirroroutVar = Tkinter.IntVar()
root.mainloop()
答案 0 :(得分:1)
使用quit
时,您有两个或三个问题。
首先,你把它放在错误的地方。如果用户无法登录三次,您想要退出。但是quit()
调用是在calcval
结束时调用的,只有在用户成功登录并计算出值后才会调用,所以当然它不会有帮助。
其次,你说错了。 quit
函数是用于退出交互式解释器的特殊功能。您通常不应该在应用程序中使用它(对命令行程序使用sys.exit()
),尤其是在GUI应用程序中不使用它。 quit
方法在您调用mainloop()
的同一个Tkinter窗口上调用,并告诉它退出主循环。
所以,你想要做的是在else
文本块Thank You for using Stock Plus System
块中添加这一行:
root.quit()
这可能不起作用,具体取决于您的平台,以及您运行程序的方式 - 或者,如果您从IDLE运行,它可能会导致IDLE退出。 Tkinter很挑剔。如果您遇到第一个问题,请在quit
之前添加此行;如果您遇到第二个问题,请使用而不是 quit
。
root.destroy()
如果您想了解,请参阅this thread。简而言之:destroy
销毁任何小部件及其所有子节点。当你在拥有mainloop的根小部件上调用它时,它也会结束循环。 quit
向mainloop发送一条消息,告诉它销毁它知道的所有小部件然后终止Tcl解释器。通常情况下,quit
应始终是安全的,但在某些情况下,它可能会错过一个小部件并冻结 - 当您在IDLE下运行时,您可能正在共享与IDLE本身相同的Tcl解释器,所以quit
也可以杀死或挂起它。
答案 1 :(得分:0)
您是否已尝试使用
import sys
sys.exit()
或直接
raise SystemExit(0)