如何检查tkinter窗口是否存在?

时间:2017-09-04 11:49:58

标签: python python-2.7 tkinter

我在python 2.7中编写了这段代码。在这里,我创建了一个名为message的按钮。每当我点击这个按钮,就会创建一个新窗口。现在我想检查一个条件,如果存在新窗口(在单击按钮后出现),则显示一个弹出窗口,表示存在相同类型的窗口。如果没有相同类型的窗口,则应创建新窗口。

!

1 个答案:

答案 0 :(得分:1)

您可以使用窗口小部件对象的winfo_exists()方法检查是否存在窗口。

但是,您不应该在消息功能中再次调用Tk()。相反,我们有Toplevel用于新的顶层窗口(即对话框)。顶层有一个所有者,可以是Tk根窗口或其他应用程序窗口。通过这种方式,窗口管理器将看到正确的窗口层次结构。

将对话框设置为其父级(dlg.wm_transient(root))的瞬态也是很好的,这样窗口管理器只显示应用程序根目录的任务栏图标,而不是它创建的每个对话框。

修改

下面是一个修改过的示例,展示如何使用Toplevel和wm_transient来实现此目的,同时使用抓取来创建模式对话框并将新对话框放在父窗口小部件的顶部。 (这使用python3就是我所拥有的。)

import tkinter as tk
import tkinter.ttk as ttk

def show_dialog(parent):
    dlg = tk.Toplevel(parent)
    dlg.wm_title("Dialog box")
    dlg.wm_transient(parent)

    frame = ttk.Frame(dlg)
    label = ttk.Label(frame, text="Message:")
    entry = ttk.Entry(frame, width=30)
    button = ttk.Button(frame, text="Comment")

    label.grid(row=0, column=0, columnspan=2, sticky='NEWS')
    entry.grid(row=1, column=0, sticky='NEWS')
    button.grid(row=1, column=1, sticky='NEWS')

    frame.grid_columnconfigure(0, weight=1)
    frame.grid_rowconfigure(2, weight=1)

    frame.grid(row=0, column=0, sticky='NEWS')
    dlg.grid_columnconfigure(0, weight=1)
    dlg.grid_rowconfigure(0, weight=1)

    entry.focus()
    dlg.grab_set()
    dlg.tk.eval('tk::PlaceWindow {0} widget {1}'.format(dlg, parent))

def main():
    root = tk.Tk()
    root.geometry('320x120')
    root.wm_title("Demo application")
    comment_button = ttk.Button(root, text="Comment", command=lambda: show_dialog(root))
    comment_button.pack(anchor=tk.CENTER)
    root.mainloop()

if __name__ == '__main__':
    main()