2014-11-16 3 views
1

Я следовал вместе в YouTube учебник: https://www.youtube.com/watch?v=Zf-b2JVZs7gTkinter замок с sys.exit

Когда мы добрались до sys.exit(0)

Питон оболочка, кажется, реагирует, но окно я создаю замки вверх вместо закрытие. Другое странное, что когда я запускаю отладчик, программа работает как ожидалось.

#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() в обработчике quit, и позволил бы Python нормально выйти после возврата mainloop() и main(). Поскольку печать «до свидания» не печатается на gui и может выйти из строя (если вы запустите приложение с pythonw на окнах), я бы поставил print _after_ вызов main(). –

+0

Спасибо Терри! Я добавил эту информацию в ответ ниже. – twasbrillig

ответ

0

Добавить строку root.destroy() в вашу quitHandler функцию. Он очистит процесс Tkinter, который иначе останется позади. Я тестировал его, и это исправляет проблему для меня.

(код удален)

Update

Из комментария Терри Яна пронзительного в:

Подробной информации о завершении работы Python изменился от версии к версии, даже в 3.x. Я лично поставил бы root.destroy(), но не sys.exit() в обработчике quit, и пусть Python завершится нормально после mainloop() и main() call return. Поскольку печать «прощай» не печатается на 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) 

Если вы используете этот код вы можете настроить дно больше.

Смежные вопросы