python3tkinter试图用一个按钮阻止多个窗口打开

2024-09-30 08:35:37 发布

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

我有一个按钮来打开代码的新窗口,我一直在尝试让这个按钮打开一个名为“最新发布窗口”的新窗口,其中有两件事:

  • 如果“最新发布窗口”未打开,请打开该窗口。在
  • 如果“最新发布窗口”已打开,请将焦点设置在该窗口上,但不要打开新窗口。在

不幸的是,事情变得太复杂了,我一辈子都不知道该怎么做。问题是我不能让代码检测到“最新的发布窗口”是否打开,并根据此更改变量。在

welcome_window = Tk()
welcome_window.title("Games R Us")
welcome_window.geometry("360x350")
welcome_window.configure(bg = "gold")
currentDisplay = 10

newest_release_windowtracker = 0

gui_font_5 = ("Helvetica", 5, "bold")
gui_font_10 = ("Helvetica", 10, "bold")
gui_font_15 = ("Helvetica", 15, "bold")
gui_font_20 = ("Helvetica", 20, "bold")
space_between = (5)
button_variable = IntVar()

def newwindow_newest_release():
    global newest_release_windowtracker
    newest_release_window = Tk()
    newest_release_window.title("Games R Us")

    newest_release_window.geometry("360x350")
    newest_release_window.configure(bg = "greenyellow")
    currentDisplay = 10

    display = Label(newest_release_window, text="Humm, see a new window !", 
    bg ="limegreen")
    display.pack()

    newest_release_window.withdraw()

    if newest_release_windowtracker == 0:
        newest_release_window.deiconify()
        newest_release_windowtracker = 1
    elif newest_release_windowtracker == 1:
        newest_release_window.focus_set()
    elif newest_release_window.winfo_exists == 0:
        newest_release_window = Tk()

ww_newest_release = Button(welcome_window,
        text = "Newest Release", bg = "goldenrod", font = "Helvetica 10", 
        width = 12, command = newwindow_newest_release)

注意:这不是完整的代码,我只是抓住了最重要的部分来说明问题所在。在


Tags: 代码releasetitleguiwindow按钮gamestk
2条回答

您可以设置一个bool来定义窗口是否打开,如果打开了,然后对tkinter.Tk或{}的实例调用lift()方法。在

检查窗口是否存在: 如果在newest_release窗口上方有一个root类,您可以检查hasattr(base_class, 'newest_release')。如果没有,那么您可以将窗口设置为全局变量,这样您就可以在函数外部访问它。然后可以创建如下代码:

if 'newest_release' in globals():
    newest_release.lift()

或者

^{pr2}$

我的方法是用一个变量来存储顶层实例。我首先将该变量初始化为None,因此只能设置一次(通过测试变量是否为None)

当顶层被破坏时(通过绑定WM_DELETE_WINDOW协议),变量被重置回None。在

我还注意到,在代码中,您正在实例化一个新的Tk()对象。Tk()对象只能实例化一次,并且是程序的根。要打开新窗口,应该使用Toplevel对象。在

现在举个例子:

import tkinter as tk


class OptionsWindow(tk.Frame):
    def __init__(self, master=None, **kwargs):
        super().__init__(master, **kwargs)
        pass


class MainWindow(tk.Frame):
    def __init__(self, master=None, **kwargs):
        super().__init__(master, **kwargs)
        self.options_toplevel = None
        tk.Button(self, text='open toplevel', command=self._open_toplevel).pack()

    def _open_toplevel(self, *args):
        if self.options_toplevel is None:
            self.options_toplevel = tk.Toplevel(self.master)
            self.options_toplevel.protocol('WM_DELETE_WINDOW', self.on_tl_close)
            gui = OptionsWindow(self.options_toplevel, width=300, height=300)
            gui.pack()

    def on_tl_close(self, *args):
        self.options_toplevel.destroy()
        self.options_toplevel = None


root = tk.Tk()
gui = MainWindow(root)
gui.pack()
root.mainloop()

相关问题 更多 >

    热门问题