tkinter使用sys.exit锁定

时间:2014-11-16 22:16:09

标签: python python-2.7 python-3.x tkinter

我在youtube教程中关注: https://www.youtube.com/watch?v=Zf-b2JVZs7g

当我们到达sys.exit(0)

Python shell似乎正在响应,但我创建的窗口锁定而不是关闭。另一个奇怪的事情是,当我运行调试器时,程序按预期运行。

#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. 其他人也遇到同样的问题,而且我看不到任何答案。
  3. 我的猜测是版本问题但是(作为n00b)我不知道问题是什么。

3 个答案:

答案 0 :(得分:1)

将行root.destroy()添加到quitHandler功能。它将清理掉落后的Tkinter进程。我测试了它,这解决了我的问题。

(已移除代码)

更新

来自Terry Jan Reedy的评论:

  

Python关闭的细节已从版本更改为版本,   即使在3.x之内我个人会把root.destroy()但不是   退出处理程序中的sys.exit(),并允许Python正常退出   mainloop()和main()调用return。自从印刷'再见'才不是   打印到gui,可能会失败(如果你用pythonw运行应用程序   windows),我会在main()调用之后放置打印。

所以它会是

def quitHandler():
    root.destroy()

print位于代码的最后。

答案 1 :(得分:0)

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


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

这样可以正常工作。

答案 2 :(得分:0)

你可以很容易地做到这一点:

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

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

如果您使用此代码,则可以自定义底部。