歌者文明清理员 发表于 2023-6-17 17:12:07

tk toplevel

我用Tkinter创建了两个窗口,一个是tk.Tk(),一个是Toplevel()

现在我想设置当某个名叫 test 的 Toplevel 弹出时,禁用 Tk() 的根窗口。
from tkinter import *

root = Tk()

def create():
    test = Toplevel()
    ## What should I do Here

    msg = Message(top, text="111")
    msg.pack()

Button(root, text="创建顶级窗口", command=create).pack()

mainloop()

isdkz 发表于 2023-6-17 17:14:06

你可以在Toplevel弹出的时候使用root.wait_window(test)来阻止root窗口的操作。下面是你的代码的改进版:

from tkinter import *

root = Tk()

def create():
    test = Toplevel(root)   # 将 root 作为 Toplevel 的父窗口

    msg = Message(test, text="111")   # 确保 Message 的 parent 是 test 而不是 top
    msg.pack()

    root.wait_window(test)   # 这将会使 root 窗口在 test 窗口关闭前无法操作

Button(root, text="创建顶级窗口", command=create).pack()

mainloop()

这段代码的工作原理是:创建了一个名为test的Toplevel窗口,并在test窗口关闭之前阻止root窗口的所有操作。所以,在test窗口打开的时候,你将无法与root窗口进行交互。当你关闭test窗口后, root窗口将再次变得可以操作。

歌者文明清理员 发表于 2023-6-17 17:19:13

isdkz 发表于 2023-6-17 17:14
你可以在Toplevel弹出的时候使用root.wait_window(test)来阻止root窗口的操作。下面是你的代码 ...

没效果

阿奇_o 发表于 2023-6-18 06:14:54

本帖最后由 阿奇_o 于 2023-6-18 06:16 编辑

参考官方文档给出的例子,稍作修改:
from tkinter import Button, Tk, Toplevel, ttk, mainloop
root = Tk()
root.geometry("500x300")
# ttk.Entry(root, ).grid()   # something to interact with

def create():   
    # 参考官方给出的例子:
    def dismiss ():
      dlg.grab_release()
      dlg.destroy()
    dlg = Toplevel(root)
    dlg.geometry("200x100+300+300")
    ttk.Button(dlg, text="Done", command=dismiss).grid()
    dlg.protocol("WM_DELETE_WINDOW", dismiss) # intercept close button
    dlg.transient(root)   # dialog window is related to main
    dlg.wait_visibility() # can't grab until window appears, so we wait
    dlg.grab_set()      # ensure all input goes to our window
    dlg.wait_window()   # block until window is destroyed

Button(root, text="创建顶级窗口", command=create).grid()

mainloop()

ps: 关键是英文注释那几句设置,及其关系。。

liuhongrun2022 发表于 2023-6-21 14:16:05

禁用是指不能按上面的按钮?
页: [1]
查看完整版本: tk toplevel