结束程序 - Python

时间:2015-05-06 15:22:51

标签: python tkinter

如果第三次输入错误的密码,我试图让这个程序直接结束,而不会问“程序是否还在运行,你想要杀死它吗?”尝试使用'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()

2 个答案:

答案 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)