gpt4 book ai didi

python - 撤回时 Tkinter 不更新

转载 作者:行者123 更新时间:2023-11-28 19:04:33 24 4
gpt4 key购买 nike

我有一个程序,当按下键盘上的热键时,它会在屏幕上显示图像。根据按下哪个键,将显示不同的图像。在 3 秒没有输入后,我的根 Tk 得到 withdraw()n 所以屏幕上没有任何东西。

现在,每当我想显示图像时,我都会调用这个函数:

    def drawOverlay(self, index):
self.canvas.itemconfig(self.overlayWidget, image=self.overlayImages[index])
self.deiconify()

问题是我在旧图像被替换之前看到了几毫秒。

虽然我只是在切换图像并遇到 this answer 之后才 deiconify() 我试图找出为什么会有延迟建议使用根的 after() 调用 deiconify()。我试过了,当它仍然不起作用时,我试了一下电话,发现电话是

self.after(1000, self.deiconify())

使旧图像出现恰好 1 秒,然后被新图像替换。

这让我相信 TkCanvaswithdraw()n 时无法更新。有没有办法解决?我宁愿在显示图像之前有一个短暂的延迟,也不愿让旧图像在屏幕上闪烁几帧,但我不知道如何实现这一点。

编辑:所以我是一个白痴,因为括号的缘故,我实际上调用了 deiconify 而不是仅仅将它传递给 after。这确实修复了持续出现的旧图像,但没有修复闪烁。

Edit2:我设法用以下代码重现了这个问题。

按键盘上的任意键将出现一个绿色矩形。等待它消失,然后按另一个键将出现一个红色矩形。

只有有时您才能看到闪光发生,因此请多试几次。当未设置 -transparentcolor 时,我无法重现,但我无法判断这是由于选项问题还是由于渲染时间减少使问题几乎无法察觉。设置 overrideredirect 也更容易看到。

Edit3:我通过使用实际图像进一步简化了代码。即使没有按键或其他事件回调,此代码也会在显示图像之前产生黑色闪光。 -transparentcoloroverrideredirect(True) 似乎对于重现这一点至关重要。之前手动调用 update() 会降低这种情况发生的频率,但仍然会导致在较大的图像上持续闪烁。这表明渲染时间是影响因素之一。

overlay.png

overlayRaw.png

from tkinter import Tk, Canvas
from PIL import ImageTk, Image

TRANSCOLOR = "blue"
IMAGE_SMALL = "overlay.png"
IMAGE_LARGE = "overlayRaw.png"

class Overlay(Tk):
def __init__(self):
Tk.__init__(self)

self.rawImage = Image.open(IMAGE_SMALL)
self.image = ImageTk.PhotoImage(self.rawImage)
self.canvas = Canvas(self, width = self.rawImage.size[0], height = self.rawImage.size[1])
self.canvas.pack()

self.wm_attributes('-transparentcolor', TRANSCOLOR) # If disabled stops the flashes from ocurring even on large images.
self.overrideredirect(True) # If disabled the Windows animation for opening windows plays. Stops the flashing from ocurring

self.withdraw()

self.overlayWidget = self.canvas.create_image(0, 0, image = self.image, anchor = "nw")

self.deiconify() # Flashes Clearly Everytime

## self.update_idletasks()
## self.deiconify() # Only Flashes Sometimes. Always flashes on large images

## self.update()
## self.deiconify() # Only Flashes Sometimes. Always flashes on large images

## self.after(0, self.deiconify) # Flashes Clearly everytime

## self.after(200, self.deiconify) # Only Flashes Sometimes. Always flashes on large images

## self.update()
## self.after(200, self.deiconify) # Flashes Clearly Everytime

o = Overlay()
o.mainloop()

最佳答案

我没有看到太多会导致闪烁的东西。我的建议是在调用 deiconify 之前添加对 self.update 的显式调用。这应该指示 tkinter 重绘 Canvas 上的所有内容。但是,如果您平台上的 tkinter 将绘图推迟到窗口被映射,那将无济于事。

尝试替换这个:

self.after(0,self.deiconify)
self.after(2000, self.hideOverlay)

用这个:

self.update()
self.deiconify()

关于python - 撤回时 Tkinter 不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48526531/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com