2014-11-16 43 views
1

鎖定了我在YouTube的教程中的以下內容: https://www.youtube.com/watch?v=Zf-b2JVZs7g的Tkinter與sys.exit

當我們到了sys.exit(0)

Python的外殼似乎是迴應,但窗口創建鎖起來,而不是收盤。另一個奇怪的是,當我運行調試器時,程序按預期運行。

#Python 2.7.8 
#Idle 2.7.8 
#Tkinter 8.5.15 

import sys 
import Tkinter 
import turtle 
from Tkinter import * 


def main(): 
    root = Tk() 

    root.title("Draw!") 
    root.geometry("800x800") 

    cv = Canvas(root, width=600, height=600) 
    cv.pack(side=LEFT) 

    t = turtle.RawTurtle(cv) 
    screen = t.getscreen() 
    screen.setworldcoordinates(0,0,600,600) 

    frame = Frame(root) 
    frame.pack(side = RIGHT, fill = BOTH) 
    screen.tracer(0) 


    def quitHandler(): 
     print ("Goodbye") 
     sys.exit(0) 
     ##raise SystemExit 
     ##exit() 


    quitButton = Button(frame, text="Quit", command = quitHandler) 
    quitButton.pack(side=BOTTOM) 

    def clickHandler(x,y): 
     t.goto(x,y) 
     screen.update() 

    screen.onclick(clickHandler) 

    def dragHandler(x,y): 
     t.goto(x,y) 
     screen.update() 

    t.ondrag(dragHandler) 


    root.mainloop() 

if __name__ == "__main__": 
    main() 

在視頻的評論有兩件事情,伸出我,但喜歡爲他工作我想不通爲什麼sys.exit(0)不是爲我工作:

  1. 他使用Python 3
  2. 其他人都有這個相同的問題,並沒有任何答案,我可以看到。

我的猜測是這是一個版本問題,但(作爲n00b)我不知道問題是什麼。

+1

Python關機_have_的細節從版本更改爲版本,甚至在3.x之內。我個人會在退出處理程序中放入root.destroy()而不是sys.exit(),並且會在mainloop()和main()調用返回後讓Python正常退出。由於打印'再見'不會打印到GUI,並可能失敗(如果您在Windows上使用pythonw運行應用程序),我會在main()調用後打印_after_。 –

+0

謝謝Terry!我在下面的答案中添加了這些信息。 – twasbrillig

回答

0

將行root.destroy()添加到您的quitHandler函數中。它將清理那些被遺留下來的Tkinter進程。我測試了它,併爲我解決了這個問題。

(代碼刪除)

更新

從特里揚蘆葦叢的評論:

的Python關機的細節已經從版本更改爲版本, 甚至在3.x的我個人會在退出處理程序中放入root.destroy()而不是 sys.exit(),並且會在返回 mainloop()和main()調用之後讓Python正常退出。因爲打印'再見'不會打印到gui,並且可能會失敗(如果您使用pythonw在 窗口中運行應用程序),我會在main()調用後打印。

因此,這將是

def quitHandler(): 
    root.destroy() 

print在代碼的最後一刻。

+0

只是爲了清楚,這是一個版本問題?或者爲什麼他的工作和我的工作都沒有。還有其他的東西對我來說不起作用。 – d6stringer

+0

他在Mac上,因此Tkinter將在Windows上完全不同。不包括root.destroy會導致不可預知的行爲,所以不同的實現會產生不同的結果。有時程序會自動清理完畢。但他應該包括它。 – twasbrillig

+0

我想我忘了問你使用的是什麼操作系統。 – twasbrillig

0
def quitHandler(): 
print ("Goodbye") 
root.destroy() 
sys.exit(0) 


quitButton = Button(frame, text="Quit", command = quitHandler) 
quitButton.pack(side=BOTTOM) 

這將工作正常。

0

你可以做到這一點很容易像這樣:

def quit(): 
     import sys;sys.exit() 

widget = Button(root,text="Quit",width=1,fg="red",command=quit).grid(row=1,column=1) 

如果您使用此代碼,你可以定製你的底了。