Создание модального диалогового окна в tkinter - PullRequest
0 голосов
/ 18 мая 2018

Этот вопрос не является дубликатом: см. Ниже.

Я хочу создать модальное диалоговое окно в 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 () (как в этот ответ ) работает, но не является жизнеспособным решением, поскольку блокирует доступ ко всем окнам для всей системы.

1 Ответ

0 голосов
/ 18 мая 2018

Это (по крайней мере, в Windows) проблема, связанная с версией.Чтобы он работал на python2.7, просто добавьте self.focus_force() перед self.grab_set():

def __init__(self, parent):
    tkinter.Toplevel.__init__(self, parent)

    self.transient(parent)
    self.title("Dialog")

    self.focus_force() # added
    self.grab_set()

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