немодальный диалог ткинтер - PullRequest
4 голосов
/ 07 октября 2011

Я использую класс под названием customDialog, основанный на основе http://effbot.org/tkinterbook/tkinter-dialog-windows.htm Стандартный код создает класс, который подклассы Toplevel, и создает модальные диалоги. Я пытаюсь адаптировать код, чтобы он также мог создавать немодальные диалоги. Стандартный код вызывает конструктор Toplevel, создает диалоговое окно, а затем выполняет self.wait_window(self) в конце, который ожидает закрытия диалогового окна. Но у меня ничего не получается.

Моей наивной попыткой было просто пропустить wait_window() (это попытка в моем коде, приведенном ниже). Я пробовал несколько других вещей, но диалог остается модальным, то есть я не могу взаимодействовать с главным окном приложения. Что заставляет его быть модальным? Диалоги содержат виджеты и несколько кнопок, обычно.

class Dialog(Toplevel):

    def __init__(self, parent, title = None,modal=True):
        Toplevel.__init__(self, parent)
        self.transient(parent)
        if title:
            self.title(title)
        self.parent = parent
        self.result = None
        body = Frame(self)
        #register validators
        self.validatePosInt = (body.register(self.OnValidatePosInt),
                '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')

        self.initial_focus = self.body(body)   #this calls the body function which is overridden, and which draws the dialog
        body.grid()
        self.buttonbox()
        self.grab_set()
        if not self.initial_focus:
            self.initial_focus = self
        self.protocol("WM_DELETE_WINDOW", self.cancel)
        self.geometry("+%d+%d" % (parent.winfo_rootx()+50,
                                  parent.winfo_rooty()+50))
        self.initial_focus.focus_set()

        if modal:
            self.wait_window(self)

1 Ответ

5 голосов
/ 07 октября 2011

Удалить строку с надписью self.grab_set().«Захват» означает захват всех событий и направление их в это окно, которое вам не нужно.

Если вы немного углубитесь в веб-страницу, где вы получили код, вы увидите, что онупоминает эту точную строку и почему она есть:

... Далее конструктор создает тело диалога, а затем вызывает grab_set, чтобы сделать диалог модальным

...