2013-10-25 2 views
0

У меня есть внешний скрипт, который вызывает функцию drawWorld() этого класса. Я хочу, чтобы рисунок показывался в течение 1-2 секунд, а затем, чтобы закрыть, и элемент управления вернется к основному сценарию. я могу управлять, чтобы окно исчезнет с линиейОкно Tkinter закрывается и поток управления автоматически возвращается

root.after(1000, lambda: root.destroy()) 

, но я не могу вернуть поток к основному сценарию. Я попытался

root.after(1000, lambda: root.quit()) 

, но он не работает.

Это мой код для класса Tkinter:

from Tkinter import Tk, Canvas, Frame, BOTH 

class World(Frame): 

def __init__(self, parent): 
    Frame.__init__(self, parent) 
    self.parent = parent    
    self.parent.title("CliffWorld")   
    self.pack(fill=BOTH, expand=1) 

    canvas = Canvas(self)   

    canvas.create_rectangle(4, 4, 31, 31, 
     outline="#f11", fill="#1f1", width=1) 
    canvas.pack(fill=BOTH, expand=1) 


def drawWorld(): 
    root = Tk() 
    ex = World(root) 
    root.geometry("330x220+300+300") 
    root.after(1000, lambda: root.destroy()) 
    root.after(1000, lambda: root.quit()) 
    root.mainloop() 
+0

Что «Я не могу вернуть поток к главному сценарию» и «но это не сработает». имею в виду? Это крушение? Программа зависает? Вы получаете сообщения об ошибках? Можете ли вы предоставить минимальный сценарий, который иллюстрирует полную проблему - процедурный код, который вызывает эту функцию, а затем пытается продолжить, когда функция завершается? –

+0

Главный сценарий вызывает функцию drawWorld(), поэтому поток управления смещается в эту часть кода. Я использовал root.destroy(), чтобы удалить окно, и оно работает, в то время как root.quit(), который должен покинуть среду tk (и пусть остальная часть скрипта работает), не работает. Прошу прощения за то, что не указал, но я имел в виду, что не работает = не уходит. В основном он остается открытым, пока я не выйду из него вручную (Ctrl-C). Мой внешний код прост: 'import tkWorld tkWorld.drawWorld(); print "end" ' Я не могу добраться до линии печати. Я хочу, чтобы окно tk всплывало и умирало после 1 секунды. – Alvin

+0

Ваш отступ неверен в вашем примере. –

ответ

0

В комментарии на ваш вопрос вы написали, что ваша основная программа только это:

import tkWorld 
tkWorld.drawWorld() 
print "end" 

Когда я использую это в программе , и используйте ваш пример кода (после исправления отступа), он отлично работает. Я вижу, что окно появляется в течение одной секунды, оно уходит, и я посылаю «конец», напечатанный на консоли.

Работает независимо от того, звонки лямбда root.quit() или root.destroy().

from Tkinter import Tk, Canvas, Frame, BOTH 

class World(Frame): 

    def __init__(self, parent): 
     Frame.__init__(self, parent) 
     self.parent = parent    
     self.parent.title("CliffWorld")   
     self.pack(fill=BOTH, expand=1) 

     canvas = Canvas(self)   

     canvas.create_rectangle(4, 4, 31, 31, 
      outline="#f11", fill="#1f1", width=1) 
     canvas.pack(fill=BOTH, expand=1) 


def drawWorld(): 
    root = Tk() 
    ex = World(root) 
    root.geometry("330x220+300+300") 
    root.after(1000, lambda: root.destroy()) 
    root.after(1000, lambda: root.quit()) 
    root.mainloop() 

if __name__ == "__main__": 
    import tkWorld 
    tkWorld.drawWorld() 
    print "end" 
+0

Спасибо, Брайан, я попробовал его с другой машины, и он работает. Теперь я немного обеспокоен тем, что может быть проблемой на моем. В любом случае, спасибо! – Alvin