我在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)
不适合我,就像它对他有用一样:
我的猜测是版本问题但是(作为n00b)我不知道问题是什么。
答案 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)
如果您使用此代码,则可以自定义底部。