【问题标题】:How to create a fade out effect in Tkinter? My code crashes如何在 Tkinter 中创建淡出效果?我的代码崩溃
【发布时间】:2014-03-19 11:26:27
【问题描述】:

我正在通过 overrideredirect 在 Tkinter 中构建一个带有自定义窗口的应用程序。我已将我自己设计的 X 按钮绑定到下面的函数。使用我的按钮关闭应用程序工作正常,它确实淡出,但几秒钟后窗口重新出现,卡在一个循环中(这就是它的样子)并崩溃。它应该只是退出,这是在我添加淡出循环之前它所做的。有人可以告诉我为什么程序会重新出现然后崩溃,或者在关闭应用程序时提供更好的淡出效果替代方案(我知道有更复杂的工具包,但在这种情况下我需要使用 Tkinter)?

谢谢

def CloseApp(event):
if InProgress==False: #InProgress boolean defined elsewhere in program
    if tkMessageBox.askokcancel("Quit","Do you really wish to quit?"):
        n=1
        while n != 0:
            n -= 0.1
            QuizWindow.attributes("-alpha", n)
            time.sleep(0.02)                                  
        Window.destroy() #I've also tried using the quit() method, not that it would make a difference
else:
    if tkMessageBox.askokcancel("Quit"," If you quit now you will lose your progress and have to start again. Are you sure you want to quit?"):
        n=1
        while n != 0:
            n -= 0.1
            QuizWindow.attributes("-alpha", n)
            time.sleep(0.02)
        Window.destroy() 

【问题讨论】:

  • 如果您能够提供任何屏幕截图或错误代码(如果有),那么人们最终可能会更容易帮助您。因为它可以更好地指示问题可能是什么。
  • 没有错误代码。省去制作视频的麻烦,在应用程序运行时,按下关闭按钮会导致窗口淡出。然后 5 秒后,窗口重新出现并且没有响应。在 Windows 7 下,它是白屏,点击时 Windows 返回“pythonw.exe 无响应”。

标签: python tkinter


【解决方案1】:

你有两个问题。首先,您永远不应该与浮点数进行精确比较。浮点数学是不精确的,n 实际上可能永远不会是0.0000000...

其次,你不应该在 GUI 程序中调用time.sleep。如果您想每 0.02 秒运行一次,请使用 after

这是一个例子:

import Tkinter as tk

class Example(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        b = tk.Button(self, text="Click to fade away", command=self.quit)
        b.pack()
        self.parent = parent

    def quit(self):
        self.fade_away()

    def fade_away(self):
        alpha = self.parent.attributes("-alpha")
        if alpha > 0:
            alpha -= .1
            self.parent.attributes("-alpha", alpha)
            self.after(100, self.fade_away)
        else:
            self.parent.destroy()

if __name__ == "__main__":
    root = tk.Tk()
    Example(root).pack(fill="both", expand=True)
    root.mainloop()

【讨论】:

  • 嗨。你能解释一下你的代码吗?我不明白 self.parent.attributes("-alpha") 是什么。
  • @HoseongJeon:self.parent 是根窗口。 .attributes 是窗口的文档化方法。 "-alpha"- 是要更改的属性的名称,alpha 是新值。
  • 完美!正是我想要的。让我们看看这是否可以扩展到我正在进行的 GUI 开发中的工具提示“样式”。 Oakley 先生,我注意到您是 Python 相关帖子的主要回复者,您是“人”吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-04
  • 2014-01-09
  • 2013-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多