Python tkinter:从主窗口一次只打开一个实例

问题描述 投票:0回答:3

有两个窗口 PRIMARY 和 SECONDARY,我想使用主窗口上的按钮小部件打开辅助窗口。但问题是每当我按下那个按钮时,辅助窗口就会打开,辅助窗口是否已经打开并不重要。

我不想要这种行为。我只想一次只允许一个辅助窗口实例。 如果已经打开了一个辅助窗口,则不应打开新的辅助窗口。

我如何做到这一点?

下面给出一个简单的示例代码,更准确的描述问题

from tkinter import *

##############################################################################################

# Function to open secondary window
def fctn_to_open_sec_win():
    secondary_window()


# Secondary window
def secondary_window():
    window = Tk()
    window.title('Secondary window')
    window.geometry('300x200')

    Label(window, text='\n\nThis is the secondary window.\n\n'
                       'There should be only one instance of it at a time.').pack()

    window.mainloop()


# Primary window
def primary_window():
    window = Tk()
    window.title('Primary window')
    window.geometry('400x300')

    Button(window, text='Open Secondary window', command=fctn_to_open_sec_win).pack(pady=(30, 0))

    window.mainloop()

##############################################################################################

if __name__ == '__main__':
    primary_window()
python tkinter window instance
3个回答
4
投票

不要在代码中使用

tk.Tk()
两次,而是使用
tk.Toplevel
。 使用一个标志来实现这个,你也可以使用 tkinter 的 Destroy 事件。

import tkinter as tk

ontop = False

def setflag(event):
    global ontop
    ontop = False

def top():
    global ontop
    if not ontop:
        top = tk.Toplevel()
        top.bind('<Destroy>', setflag)
    ontop = True

root = tk.Tk()
b = tk.Button(root,command=top)
b.pack()

root.mainloop()

使用类,您可以避免全局声明,甚至可以更好地跟踪实例。


1
投票

你可以这样做,

window_2 = None

def secondary_window():
    global window_2
    if not window_2:
        window_2 = Toplevel()
        ...

0
投票

相似的代码,它的工作原理相同,选择对你来说更容易的那个

import tkinter

root = tkinter.Tk()

def open_window():
    global win_opened
    if not 'win_opened' in globals(): win_opened = False
    if win_opened == True: return
    window = tkinter.Tk()
    win_opened = True
    def False_on_close(event): global win_opened ; win_opened = False
    window.bind('<Destroy>', False_on_close)

button = tkinter.Button(root,command=open_window).pack()

root.mainloop()
© www.soinside.com 2019 - 2024. All rights reserved.