import tkinter as tk
top_list=[]
def show():
top_list[0].geometry('500x300+200+100')
top_list[0]['bg']='cyan'
top_list[0].deiconify() #显示
print(top_list[0].winfo_id())
root=tk.Tk()
root.geometry('900x800')
tk.Button(root,text='click',command=show).place(x=30,y=20)
for i in range(5):
top=tk.Toplevel(root)
top.geometry('0x0')
top.withdraw() #隐藏
top_list.append(top)
root.mainloop()
import ctypes
import tkinter as tk
import tkinter.messagebox
u32=ctypes.windll.user32
def new_toplevel(root:tk.Tk,switch=[False,None])->None:
if switch[0]:
switch[1].destroy()
else: #窗口还未打开
toplevel=tk.Toplevel()
toplevel.protocol('WM_DELETE_WINDOW',lambda :new_toplevel(root))
switch[1]=toplevel
switch[0]= not switch[0]
root=tk.Tk()
root.geometry('700x600')
tk.Button(root,text='新窗口开关',command=lambda :new_toplevel(root)).pack()
root.mainloop()
创建对话框,可以用toplevel控件,如果不加以限制,会点击一下就会创建一个toplevel对象,这不是我们想要的。
解决办法有很多,最简单的就是用按钮的状态来控制,点击一下,创建后同时把该按钮的装的禁用,当关闭该
toplevel时,在恢复按钮状态即可。这里要注意一点,有个小bug,就是不能直接在按钮对象后面直接pack(),比如
例如:btn=tk.Button(root,text='creat',bg='red').pack() 这样写时,在用btn.config(bg='yellow')或者
btn['bg']='yellow'都不能能用。正确代码如下:一定要注意。tk还有个bug就是创建一个Frame,如果想设置width ,height 只能用place(),pack()不会显示
import tkinter as tk
def new_toplevel():
top=tk.Toplevel(root)
top.protocol('WM_DELETE_WINDOW',lambda :go())
top.geometry('600x400')
top['bg']='yellow'
btn['state']='disabled'
def go():
top.destroy()
btn.config(state='normal')
root=tk.Tk()
root.geometry('700x600')
btn=tk.Button(root,text='新窗口开关',command=new_toplevel)
btn.pack()
root.mainloop()