0

我有选择应该加载的备份的代码。它会打开 Toplevel 窗口并让您选择要加载的备份之一。当此窗口打开时,我想阻止对原始窗口的输入,因此返回原始窗口的唯一方法是关闭新的顶层窗口。

我希望能工作的代码部分:

from tkinter import *



class BackupsGui:
    def __init__(self, parent):
        top = Toplevel()
        self.top = top

更多代码并__init__以以下结尾:

        top.update_idletasks()
        top.overrideredirect(True)
        top.mainloop()

或者:

        top.transient(parent)
        top.mainloop()

Niether 代码部分似乎以任何方式更改 Toplevel 交互,也不会更改 if top.mainloop()before top.transient()or top.update_idletasks()

我想念什么?

4

1 回答 1

1

transient并且overrideredirect与事件处理无关。如果你想阻塞除顶层之外的所有输入,你需要在顶层窗口上调用grab_set 。这将导致所有事件都发送到该窗口。

运行以下代码,注意如果不勾选,可以继续新建窗口,更改复选框的值。选中后,下一个窗口会抓取所有事件,从而阻止您与其他窗口进行交互。

import Tkinter as tk

class Example(tk.Frame):
    def __init__(self, root):
        tk.Frame.__init__(self, root)
        self.do_grab = tk.BooleanVar()
        cb = tk.Checkbutton(self, text="New window grabs all events", 
                            variable=self.do_grab, onvalue=True, offvalue=False)
        cb.pack()
        new_button = tk.Button(self, text="New window", command=self.on_click)
        new_button.pack()

    def on_click(self):
        self.top = tk.Toplevel(self)
        button = tk.Button(self.top, text="dismiss", command=self.top.destroy)
        do_grab = self.do_grab.get()

        if do_grab:
            label = tk.Label(self.top, wraplength=200,
                             text="This window grabs all events")
        else:
            label = tk.Label(self.top, wraplength = 200, 
                             text="This window does NOT grab all events")
        label.pack(fill="x")
        button.pack()

        if do_grab:
            self.top.grab_set()

if __name__ == "__main__":
    root = tk.Tk()
    Example(root).pack(side="top", fill="both", expand=True)
    root.mainloop()
于 2013-08-13T22:27:10.363 回答