Python tkinter:从主 window 次要 window 一次只打开一个实例
Python tkinter: Open only one instance at a time of secodary window from primary window
有两个 windows PRIMARY 和 SECONDARY,我想在 primary window 上使用按钮小部件打开 secondary window。但问题是,每当我按下该按钮时,辅助 window 就会打开,而辅助 window 是否已经打开并不重要。
我不想要这种行为。我只想一次只允许一个辅助 window 实例。
如果已打开辅助 window,则不应打开新的辅助 window。
我该如何实现?
为了更准确的描述问题,下面给出了一个简单的示例代码。
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()
你可以这样做,
window_2 = None
def secondary_window():
global window_2
if not window_2:
window_2 = Toplevel()
...
不要在代码中使用两次 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()
使用 类 您可以避免全局语句,甚至可以更好地跟踪实例。
有两个 windows PRIMARY 和 SECONDARY,我想在 primary window 上使用按钮小部件打开 secondary window。但问题是,每当我按下该按钮时,辅助 window 就会打开,而辅助 window 是否已经打开并不重要。
我不想要这种行为。我只想一次只允许一个辅助 window 实例。 如果已打开辅助 window,则不应打开新的辅助 window。
我该如何实现?
为了更准确的描述问题,下面给出了一个简单的示例代码。
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()
你可以这样做,
window_2 = None
def secondary_window():
global window_2
if not window_2:
window_2 = Toplevel()
...
不要在代码中使用两次 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()
使用 类 您可以避免全局语句,甚至可以更好地跟踪实例。