我注意到这种行为,快速移动窗口会使其中的小部件消失。
import tkinter as tk
hidden=tk.Tk()
hidden.attributes('-alpha',0.0)
root=tk.Toplevel(hidden)
bg_label=tk.Label(root)
bg_label.pack()
label=tk.Label(bg_label,text='Example')
label.pack(padx=100,pady=100)
hidden.mainloop()
描述
基本上我有一个透明窗口作为主Tk()
实例,这样我就可以在任务栏中看到它,因为我overrideredirect(True)
在其父窗口上使用了自定义标题栏。我有一个带有一些图像的背景标签(图像不是影响因素)和另一个标签。
观察结果
- 背景标签中的小部件会随着窗口的快速移动而消失。
- 小部件在最小化和重新打开时恢复。
attributes('-alpha',)
如果的Toplevel()
小于 1 ,则不会发生这种情况。
额外的
以下是实际代码(重现行为不需要它们)
这是上面示例的代码
from gui import *
hidden=tk.Tk()
hidden.attributes('-alpha',0.0)
root=tk.Toplevel(hidden)
screen_height=root.winfo_screenheight()
req_height=screen_height//2
req_width=req_height*16//9
root.geometry(f'{req_width}x{req_height+32}+100+100')
tb=TitleBar(root,hidden,fg='white',bg='black',font=('Arial',10))
tb.pack()
img_path=os.path.join('data','images')
bg_image=Image.open(os.path.join(img_path,'example.png'))
bg_image=ImageTk.PhotoImage(bg_image.resize((req_width,req_height),Image.ANTIALIAS))
bg_label=tk.Label(root,bd=0,image=bg_image)
bg_label.pack(fill='both',expand=True)
teacher_button_image=Image.open(os.path.join(img_path,'teacher_button.png'))
teacher_button_image=ImageTk.PhotoImage(teacher_button_image.resize((100,32),Image.ANTIALIAS))
teacher_label=tk.Label(bg_label,image=teacher_button_image)
teacher_label.pack(pady=(200,0))
hidden.mainloop()
这是相关的部分gui.py
import tkinter as tk
from tkinter import ttk
from PIL import Image,ImageTk
import os
import webbrowser
class TitleBar:
def __init__(self,parent,hidden,icon=None,title='App',width=10,bg=None,fg=None,font=None,iconlink=None):
def get_pos(event):
xwin = self.parent.winfo_x()
ywin = self.parent.winfo_y()
startx = event.x_root
starty = event.y_root
ywin = ywin - starty
xwin = xwin - startx
def move_window(event):
self.parent.geometry('+{0}+{1}'.format(event.x_root+xwin, event.y_root+ywin))
self.title_frame.bind('<B1-Motion>',move_window)
def on_iconify(event):
if self.parent.state()=='normal':
self.parent.withdraw()
else:
on_deiconify(None)
def on_deiconify(event):
self.parent.deiconify()
def dest(evrnt):
self.parent.destroy()
self.hidden.destroy()
def on_enter_close(event):
self.close_label.config(image=self.close_title_button_hover)
def on_leave_close(event):
self.close_label.config(image=self.close_title_button)
def on_enter_minimise(event):
self.minimise_label.config(image=self.minimise_title_button_hover)
def on_leave_minimise(event):
self.minimise_label.config(image=self.minimise_title_button)
def icon_link(event):
if self.iconlink:
webbrowser.open(self.iconlink)
self.width=width
self.parent=parent
self.hidden=hidden
self.icon=icon
self.iconlink=iconlink
self.close_title_button=ImageTk.PhotoImage(close_title_button.resize((self.width,self.width),Image.ANTIALIAS))
self.close_title_button_hover=ImageTk.PhotoImage(close_title_button_hover.resize((self.width,self.width),Image.ANTIALIAS))
self.minimise_title_button_hover=ImageTk.PhotoImage(minimise_title_button_hover.resize((self.width,self.width),Image.ANTIALIAS))
self.minimise_title_button=ImageTk.PhotoImage(minimise_title_button.resize((self.width,self.width),Image.ANTIALIAS))
self.title_frame=tk.Frame(self.parent,bg=bg)
if icon:
self.logo_icon=ImageTk.PhotoImage(Image.open(self.icon).resize((self.width+10,self.width+10),Image.ANTIALIAS))
self.logo_label=tk.Label(self.title_frame,image=self.logo_icon,bd=0,bg=bg,cursor='hand2')
self.logo_label.pack(side='left',padx=(10,5))
self.logo_label.bind('<Button-1>',icon_link)
self.title_label=tk.Label(self.title_frame,text=title,bg=bg,fg=fg,font=font)
self.title_label.pack(side='left')
self.close_label=tk.Label(self.title_frame,image=self.close_title_button,bd=0,bg=bg)
self.close_label.pack(side='right',ipadx=10,ipady=11)
self.close_label.bind('<Button-1>',dest)
self.close_label.bind('<Enter>',on_enter_close)
self.close_label.bind('<Leave>',on_leave_close)
self.minimise_label=tk.Label(self.title_frame,image=self.minimise_title_button,bd=0,bg=bg)
self.minimise_label.pack(side='right',ipadx=10,ipady=11)
self.minimise_label.bind('<Button-1>',on_iconify)
self.minimise_label.bind('<Enter>',on_enter_minimise)
self.minimise_label.bind('<Leave>',on_leave_minimise)
self.title_frame.bind('<Button-1>',get_pos)
self.title_label.bind('<Button-1>',get_pos)
self.hidden.bind('<Map>',on_deiconify)
self.hidden.bind('<Unmap>',on_iconify)
def pack(self):
self.parent.overrideredirect(True)
self.parent.geometry('+100+100')
self.title_frame.pack(side='top',anchor='e',fill='x')
if self.icon:
self.parent.iconphoto(False,self.logo_icon)
self.hidden.iconphoto(False,self.logo_icon)
我很想知道同样的原因以及如何防止这种情况,非常感谢任何帮助。