【问题标题】:Widgets disappear when moving the window rapidly [closed]快速移动窗口时小部件消失[关闭]
【发布时间】:2020-12-31 22:15:10
【问题描述】:

我注意到这种行为,快速移动窗口会使其中的小部件消失。

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) 的自定义标题栏。我有一个带有一些图像的背景标签(图像不是影响因素)和另一个标签。

观察

  • 背景标签中的小部件会随着窗口的快速移动而消失。
  • 小部件在最小化和重新打开时恢复。
  • 如果Toplevel()attributes('-alpha',) 小于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)

我很想知道同样的原因以及如何防止这种情况,非常感谢任何帮助。

【问题讨论】:

  • 那是很多代码。你确定它是复制问题所必需的吗?例如,您可以删除对iconphoto 和其他图像函数的调用吗?你能删除所有的绑定吗?如果您只有一个标签或一个按钮,问题是否仍然存在?请参阅此处了解如何编写minimal reproducible example
  • @BryanOakley 抱歉,我意识到大部分都是不必要的,感谢您的建议,我提供了一个执行相同行为的简短代码
  • 似乎还有很多额外的代码。同样,如果您可以删除图像,那将是最好的。如果删除图像使问题消失,我们就知道根本原因。如果删除图像并没有改变任何东西,那么显然不需要它们来重现问题。
  • @BryanOakley 我确实删除了所有这些,它现在只是一个带有单个标签的普通窗口,请检查重现此问题所需的最低代码部分。
  • 6 个月了,它仍然可以重现吗?我不明白这个问题。这可能是一些渲染问题。

标签: python tkinter tkinter-label


【解决方案1】:

问题在下面一行。

bg_label=tk.Label(root)

您应该将其替换为以下内容:

bg_label=tk.Frame(root)

【讨论】:

  • 你是怎么得出这个结论的?
猜你喜欢
  • 2015-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多