2015-08-07 2 views
0

У меня есть ориентированная на объект программа tkinter setup. я инициализирует переменную для хранения Toplevel() в качествеПредотвращение открытия нескольких верхних уровней?

self.toplevel = None 

Затем, когда я создаю фактическое Toplevel окно я просто присвоить его переменной:

self.toplevel = Toplevel() 

Дело в том, ... когда Toplevel() окно закрыто, значение все еще остается в переменной self.toplevel. Как сбросить переменную обратно None после закрытия окна, так что я могу выполнить проверку:

if (self.toplevel == None): 
    self.toplevel = Toplevel() 

Или есть какие-либо другие методы, чтобы предотвратить многократное Toplevel Окна от открытия?

ответ

2

Проверить это How do I handle the window close event in Tkinter?

Присвоить значение None к self.toplevel после Toplevel закрывает usign функции обратного вызова TopCloses. Для этого напишите метод в классе GUI для доступа к атрибуту toplevel и установите его значение None внутри функции обратного вызова.

В главной программе,

def TopCloses(): 
    top.destroy() 
    #Call the setTopLevel method and assign the attribute toplevel value None 
    guiObject.setTopLevel(None) 

top.protocol("WM_DELETE_WINDOW", TopCloses) 
root.mainloop() 
+0

Это предотвратить бы ВСЕ интерпретаторы(), не так ли? Но мне нужно отфильтровать, чтобы одновременно открывать разные уникальные функции Toplevels(), но не те же. –

+0

Я внес некоторые изменения. Он работает сейчас? –

+0

Да! Мне пришлось немного изменить эту идею. я просто добавил функцию в классе: Защиту toplevel_close (Я): self.toplevel_incredients.destroy() self.toplevel_incredients = None Затем протокол к self.toplevel при его создании: self.toplevel.protocol («WM_DELETE_WINDOW», self.toplevel_close) –

1

Вот мое решение:

#somewhere in __init__ make 
self.window = None 
#I took this piece of code from my bigger app and I have a function 
#self.makevariables(), which is called in init, which contains the line above. 
def instructions(self):  
    if self.window == None: #here I check whether it exists, if not make it, else give focus to ok button which can close it 
     self.window = Toplevel(takefocus = True) 
     #some optional options lol 
     self.window.geometry("200x200") 
     self.window.resizable(0, 0) 
     #widgets in the toplevel 
     Label(self.window, text = "NOPE").pack() 
     self.window.protocol("WM_DELETE_WINDOW", self.windowclosed) #this overrides the default behavior when you press the X in windows and calls a function 
     self.okbutton = Button(self.window, text = "Ok", command = self.windowclosed, padx = 25, pady = 5) 
     self.okbutton.pack() 
     self.okbutton.focus() 
     self.okbutton.bind("<Return>", lambda event = None:self.windowclosed()) 
    else: 
     self.okbutton.focus() #You dont need to give focus to a widget in the TopLevel, you can give the focus to the TopLevel, depending how you want it 
     #self.window.focus() works too  
def windowclosed(self): #function to call when TopLevel is removed 
    self.window.destroy() 
    self.window = None 
Смежные вопросы