Python Tkinter。仅显示窗口的一个副本

Python Tkinter。仅显示窗口的一个副本,python,tkinter,Python,Tkinter,我有一个问题。我有一个在Tkinter上写的程序 import Tkinter as tk import ttk def about_window(): print(root.child_window) if not root.child_window: top2 = tk.Toplevel(root) top2.title("About") top2.resizable(0,0) explanation =

我有一个问题。我有一个在Tkinter上写的程序

import Tkinter as tk
import ttk


def about_window():
    print(root.child_window)

    if not root.child_window:
        top2 = tk.Toplevel(root)
        top2.title("About")
        top2.resizable(0,0)

        explanation = "This program is my test program"

        ttk.Label(top2,justify=tk.LEFT,text=explanation).pack(padx=5,pady=2)
        ttk.Button(top2,text='OK',width=10,command=top2.destroy).pack(pady=8)


root = tk.Tk()
root.resizable(0,0)

root.child_window = None
#print(root.child_window)

root.style = ttk.Style()
# ('clam', 'alt', 'default', 'classic')
root.style.theme_use("clam")

menu = tk.Menu(root)
root.config(menu=menu)

fm = tk.Menu(menu, tearoff=0)
menu.add_cascade(label="Settings",menu=fm)
fm.add_command(label="Preferances")

hm = tk.Menu(menu, tearoff=0)
menu.add_cascade(label="Help",menu=hm)
hm.add_command(label="About", command=about_window)
hm.add_command(label="Exit",command=root.quit)
#

tk.mainloop()
因此,我可以单击“关于”标签,并将看到窗口:

但在Tkinter中是否可以禁用同一窗口的任何下一次启动


我尝试过这个方法,但没有成功。

创建关于窗口模式的最简单方法是在
关于窗口()函数中添加以下行:

top2.focus_set()                                                        
top2.grab_set()    
第一行设置“关于”窗口的焦点


第二行禁止任何其他窗口接受事件。

一种方法是使子窗口过渡到根,以便在关闭子窗口之前,您无法与根进行交互(此处不需要root.child\u窗口):


通过使用类来表示您的程序,另一种方法变得容易多了。它本质上归结为需要一个全局(或类实例的范围)变量。在本例中,我们使用
self.top2
,它可以在方法
about\u window()的内部和外部访问

此方法允许在子窗口打开时与根窗口进行完全交互

import Tkinter as tk
import ttk


class MyProgram():

    def __init__(self):

        self.top2 = None
        self.root = root = tk.Tk()
        root.resizable(0,0)

        root.style = ttk.Style()
        # ('clam', 'alt', 'default', 'classic')
        root.style.theme_use("clam")

        menu = tk.Menu(root)
        root.config(menu=menu)

        fm = tk.Menu(menu, tearoff=0)
        menu.add_cascade(label="Settings",menu=fm)
        fm.add_command(label="Preferances")

        hm = tk.Menu(menu, tearoff=0)
        menu.add_cascade(label="Help",menu=hm)
        hm.add_command(label="About", command=self.about_window)
        hm.add_command(label="Exit",command=root.quit)

    def about_window(self):
        try:
            self.top2.focus_set()
            return
        except Exception:
            pass

        self.top2 = top2 = tk.Toplevel(self.root)
        top2.title("About")
        top2.resizable(0,0)

        explanation = "This program is my test program"

        ttk.Label(top2,justify=tk.LEFT,text=explanation).pack(padx=5,pady=2)
        ttk.Button(top2,text='OK',width=10,command=top2.destroy).pack(pady=8)


MyProgram()
tk.mainloop()
状态(newstate=None)


有两种方法可以做到这一点,您希望用户能够在“关于”打开或没有打开时与您的主窗口进行交互吗?Jkdc,您可以展示两种方法吗?没有成功意味着什么?你有错误吗?尽管有
if
语句,您是否仍有多个窗口?一般模式是正确的:第一次创建窗口,然后使其可见。这是一种非常常见的技术。afaik
transient
更像是提示WM建立子-父关系,因此WM不会在任务栏中显示“关于”窗口,或者在父窗口缩小时最小化“关于”窗口。这可能是一个好主意,但是模态是通过
grab\u set
afaik完成的。
import Tkinter as tk
import ttk


class MyProgram():

    def __init__(self):

        self.top2 = None
        self.root = root = tk.Tk()
        root.resizable(0,0)

        root.style = ttk.Style()
        # ('clam', 'alt', 'default', 'classic')
        root.style.theme_use("clam")

        menu = tk.Menu(root)
        root.config(menu=menu)

        fm = tk.Menu(menu, tearoff=0)
        menu.add_cascade(label="Settings",menu=fm)
        fm.add_command(label="Preferances")

        hm = tk.Menu(menu, tearoff=0)
        menu.add_cascade(label="Help",menu=hm)
        hm.add_command(label="About", command=self.about_window)
        hm.add_command(label="Exit",command=root.quit)

    def about_window(self):
        try:
            self.top2.focus_set()
            return
        except Exception:
            pass

        self.top2 = top2 = tk.Toplevel(self.root)
        top2.title("About")
        top2.resizable(0,0)

        explanation = "This program is my test program"

        ttk.Label(top2,justify=tk.LEFT,text=explanation).pack(padx=5,pady=2)
        ttk.Button(top2,text='OK',width=10,command=top2.destroy).pack(pady=8)


MyProgram()
tk.mainloop()
Returns the window's current state, one of:

    'normal': Displayed normally.

    'iconic': Iconified with the .iconify() method.

    'withdrawn': Hidden; see the .withdraw() method below.