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