tkinter顶层窗口似乎对某些方法没有反应

2024-05-18 12:04:31 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我希望能起作用的部分代码:

from tkinter import *



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

更多的代码和__init__结尾为:

^{pr2}$

或者:

        top.transient(parent)
        top.mainloop()

Niether代码部分似乎以任何方式更改顶层交互,如果top.mainloop()位于top.transient()或{}之前,也不会发生变化。在

我错过了什么?在


Tags: 方法代码fromimportselfinittkintertop
1条回答
网友
1楼 · 发布于 2024-05-18 12:04:31

transientoverrideredirect与事件处理无关。如果要阻止除顶层之外的所有输入,则需要在顶层窗口中调用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()

相关问题 更多 >