2013-08-22 2 views
1

Я не могу уничтожить Toplevel (Tkinter, питон)Tkinter разрушающего Toplevel

В моей программе

1) в начале пользователя нажимает на кнопку, и верхний уровень появится

2) внутри верхнего уровня есть еще несколько виджетов и еще одна кнопка

3), когда пользователь нажимает эту кнопку (второй), то функция (name_of_toplevel.destroy()) Начало работы

4), но затем Terminal пишет мне «NameError: глобальное имя« name_of_toplevel »не определено»

5) но это действительно определено!

6 кнопок) связаны с функциями с методом "связывают"

Текст программы:

from Tkinter import * 


def Begin(event): 
    okno.destroy() 

def QuitAll(event): 
    exit(0) 

def OpenOkno(event): 
    #print "<ButtonRelease-1> really works! Horray!" 
    okno = Toplevel() 
    okno.title('Question') 
    okno.geometry('700x300') 

    Sign = Label(okno,text = 'Quit the program?', font = 'Arial 17') 
    Sign.grid(row = 2, column = 3) 

    OK = Button(okno, text = 'YES', bg = 'yellow', fg = 'blue', font = 'Arial 17') 
    OK.grid(row = 4, column = 2) 

    OK.bind("<ButtonRelease-1>",QuitAll) 


    NO = Button(okno, text = 'NO', bg = 'yellow', fg = 'blue', font = 'Arial 17') 
    NO.grid(row = 4, column = 4) 

    NO.bind("<ButtonRelease-1>",Begin) 




root = Tk() # main window 'program_on_Python' 

root.title('Program_on_Python') 

root.geometry('400x600') 



knpk = Button(root, text = 'click here!', width = 30, height = 5, bg = 'yellow', fg = 'blue', font = 'Arial 17') 
knpk.grid(row = 2, column = 2) 

knpk.bind("<ButtonRelease-1>",OpenOkno) 

root.mainloop() 

пожалуйста, помогите мне, если вы можете

ответ

2

okno не существует вне функции OpenOkno, поэтому попытка получить к ней доступ в другом месте вызовет NameError. Один из способов решения этой проблемы - переместить Begin внутри OpenOkno, где объект okno видна.

def OpenOkno(event): 
    def Begin(event): 
     okno.destroy() 

    #print "<ButtonRelease-1> really works! Horray!" 
    okno = Toplevel() 
    #etc... Put rest of function here 

Вы также можете использовать лямбда-выражение вместо полной функции в качестве аргумента Bind.

NO.bind("<ButtonRelease-1>", lambda event: okno.destroy()) 

Вы также мог бы сделать okno глобальный переменный, так что это будет видно повсюду. Затем вам нужно будет использовать оператор global okno везде, где вам нужно назначить okno.

okno = None 

def QuitAll(event): 
    exit(0) 

def Begin(event): 
    okno.destroy() 

def OpenOkno(event): 

    #print "<ButtonRelease-1> really works! Horray!" 
    global okno 
    #etc... Put rest of function here 
Смежные вопросы