Этот вопрос не является дубликатом: см. Ниже.
Я хочу создать модальное диалоговое окно в tkinter.Другими словами, диалоговое окно, которое, пока оно активно, не позволяет пользователю взаимодействовать с родительским окном.Существует существующий вопрос о том, что SO отвечает на этот вопрос, и есть полный пример , иллюстрирующий концепцию.
Однако создание диалогового окна Toplevel и вызов grab_set () просто не работает ни на Windows 7, ни на Ubuntu 16.04.4 LTS.Пользователь по-прежнему может закрывать, изменять размеры и вообще взаимодействовать с родительским окном.
Существует ли способ создания модального диалогового окна в Tkinter, который действительно работает?
Вотпример минимального использования dialog.grab_set (), который не может предотвратить взаимодействие с родительским окном:
import os
try:
import Tkinter as tkinter
except ImportError:
import tkinter
class MyToplevel(tkinter.Toplevel, object):
def __init__(self, parent):
tkinter.Toplevel.__init__(self, parent)
self.title("Main window")
MyDialog(self)
self.protocol("WM_DELETE_WINDOW", parent.destroy)
class MyDialog(tkinter.Toplevel, object):
def __init__(self, parent):
tkinter.Toplevel.__init__(self, parent)
self.transient(parent)
self.title("Dialog")
self.grab_set()
self.protocol("WM_DELETE_WINDOW", self.destroy)
if __name__ == "__main__":
root = tkinter.Tk()
root.withdraw()
app = MyToplevel(root)
app.mainloop()
Следует отметить, что использование grab_set_global () (как в этот ответ ) работает, но не является жизнеспособным решением, поскольку блокирует доступ ко всем окнам для всей системы.