节目结束-Python

Ending the program-Python

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

您是否尝试过使用

import sys
sys.exit()

或直接

raise SystemExit(0)

您在使用 quit 时遇到两个或三个问题。

首先,你放错地方了。如果用户登录失败 3 次,你想退出。但是你的quit()调用是在calcval的末尾,只有在用户成功登录并计算出一个值后才会被调用,所以当然没有用。

其次,你打错电话了。 quit 函数是一个特殊的东西,用于退出交互式解释器。您通常根本不应该在应用程序中使用它(对命令行程序使用 sys.exit()),尤其是在 GUI 应用程序中。 quit 方法 在你调用 mainloop() 的同一个 Tkinter window 上调用,并告诉它退出主循环。

因此,您要做的是在具有 Thank You for using Stock Plus System 文本的 else 块中添加此行:

root.quit()

这可能行不通,这取决于您的平台以及您 运行 您的程序的方式——或者,如果您 运行 来自 IDLE,它也可能导致 IDLE 退出. Tkinter 很挑剔。如果您有第一个问题,请在 quit 之前添加此行;如果您遇到第二个问题,请使用 而不是 quit.

root.destroy()

想了解的,看this thread。简而言之:destroy 销毁任何小部件及其所有子部件。当您在拥有主循环的根小部件上调用它时,它也会结束循环。 quit 向主循环发送一条消息,告诉它销毁它知道的所有小部件,然后终止 Tcl 解释器。通常,仅 quit 应该始终是安全的,但在某些情况下它可能会错过一个小部件并冻结 — 当您在 IDLE 下处于 运行 时,您可能正在共享相同的 Tcl解释器作为 IDLE 本身,因此 quit 也可能会杀死或挂起它。