Как закрыть окно Toplevel после завершения вызываемой функции? - PullRequest
2 голосов
/ 09 февраля 2011

Edit: позвольте мне включить мой код, чтобы я мог получить определенную помощь.

import Tkinter

def goPush():
    win2=Tkinter.Toplevel()
    win2.geometry('400x50')
    Tkinter.Label(win2,text="If you have prepared as Help describes select Go otherwise select Go Back").pack()
    Tkinter.Button(win2,text="Go",command=bounceProg).pack(side=Tkinter.RIGHT,padx=5)
    Tkinter.Button(win2, text="Go Back", command=win2.destroy).pack(side=Tkinter.RIGHT)

def bounceProg():
    d=1
    print d
root=Tkinter.Tk()
root.geometry('500x100')
Tkinter.Button(text='Go', command=goPush).pack(side=Tkinter.RIGHT,ipadx=50)
root.mainloop()

Итак, когда вы запускаете программу, она открывает окно с надписью Go. Затем Go открывает окно, которое спрашивает, прочитали ли вы справку (которую я не включил в этот пример кода), и предлагает Go Back (который возвращается) и Go. Когда вы выбираете Go, он вызывает функцию, которая печатает 1. После того, как она напечатает 1, я хочу закрыть окно, возвращаясь к исходному окну, содержащему кнопку Go. Как мне сделать такую ​​вещь?

Ответы [ 3 ]

4 голосов
/ 10 февраля 2011

@ Kosig Это не будет выходить из root. То есть. self.foo = tk.Toplevel(self), а затем self.foo.destroy()

Например:

class Foo(tk.Frame):
    """Foo example"""

    def __init__(self, master=None):
        """Draw Foo GUI"""
        tk.Frame.__init__(self, master)
        self.grid()
        self.draw_window_bar()

    def draw_window_bar(self):
        """Draw bar TopLevel window"""
        self.window_bar = tk.Toplevel(self)
        # Some uber-pythonian code here...
        ask_yes_or_no = messagebox.askyesno('Brian?', 'Romani Ite Domum')
        if not ask_yes_or_no:
            self.window_bar.destroy()

У вас есть один главный объект - Foo. У Foo есть одно главное окно (называемое «рамкой»), которое он получает из tk.Frame. После этого в нем должны быть созданы все окна (рамки) Toplevel. Итак, ваше новое окно здесь self.window_bar, и все его «объекты» находятся там, включая метод его уничтожения (self.window_bar.destroy()). Вы можете вызвать self.window_bar.destroy() из любой части кода, но здесь он вызывается после того, как пользователь нажимает «нет».

3 голосов
/ 10 февраля 2011

Если вы создаете окно верхнего уровня с помощью команды Toplevel, вы уничтожаете его с помощью метода destroy объекта окна. Например:

import Tkinter as tk

class MyToplevel(tk.Toplevel):
    def __init__(self, title="hello, world", command=None):
        tk.Toplevel.__init__(self)
        self.wm_title(title)
        button = tk.Button(self, text="OK", command=lambda toplevel=self: command(toplevel))
        button.pack()

if __name__ == "__main__":
    def go(top):
        print "my work here is done"
        top.destroy()

    app = tk.Tk()
    t = MyToplevel(command=go)
    t.wm_deiconify()
    app.mainloop()
0 голосов
/ 10 февраля 2011

Очевидно, вы просто вызываете quit для корневого объекта, на котором запущен ваш mainloop

edit : Все виджеты Tkinter имеют метод destroy(), который уничтожает этот виджет и его дочерние элементы. Так что вы должны быть в состоянии позвонить на ваш Toplevel

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...