python - Tkinter 中的事件指示器?

标签 python tkinter activity-indicator

每个操作系统都有一个事件指示器。 OS X 和 iOS 有一朵花,它以圆形图案点亮和淡化每个踏板。 Windows 有一个旋转的蓝色磁盘。 Android 有一个灰色磁盘的东西(我认为它也可以有各种其他颜色 - IDK,我不怎么使用 Android。)

在 Tkinter 中使用这些图标的最佳方式是什么?是否有一些内置的小部件可以提供此功能?是否有一个变量,我可以将图像小部件指向该变量以使其显示此图标(并为其设置动画?)

我知道 Tkinter 提供了一个进度条,它有一个不确定的模式。我不想使用它 - 我需要适合小方形区域的东西,而不是长方形区域。第一段中描述的事件指示器将是完美的。

或者我最好的选择是只滚动我自己的 Canvas 动画吗?

最佳答案

这对于您尝试做的事情应该足够了。我宁愿创建自己的动画或从互联网上逐帧下载您想要显示的动画。 Canvas 更适合与用户交互,这就是为什么我使用标签来显示图像的原因......

import tkinter as tk

class Activity(tk.Label):
    def __init__(self, master = None, delay = 1000, cnf = {}, **kw):
        self._taskID = None
        self.delay = delay
        return super().__init__(master, cnf, **kw)

    # starts the animation
    def start(self):
        self.after(0, self._loop)

    # calls its self after a specific <delay>
    def _loop(self):
        currentText = self["text"] + "."

        if currentText == "....":
            currentText = ""

        self["text"] = currentText

        self._taskID = self.after(self.delay, self._loop)

    # stopps the loop method calling its self
    def stop(self):
        self.after_cancel(self._taskID)
        # Depends if you want to destroy the widget after the loop has stopped
        self.destroy()


class AcitivityImage(Activity):
    def __init__(self, imagename, frames, filetype, master = None, delay = 1000, cnf = {}, **kw):
        self._frames = []
        self._index = 0
        for i in range(frames):
            self._frames.append(tk.PhotoImage(file = imagename+str(i)+'.'+str(filetype)))

        return super().__init__(master, delay, cnf, **kw)

    def _loop(self):
        self["image"] = self._frames[self._index]

        # add one to index if the index is less then the amount of frames
        self._index = (self._index + 1 )% len(self._frames)

        self._taskID = self.after(self.delay, self._loop)


root = tk.Tk()
root.geometry("500x500")

# create a activity image widget
#root.b = AcitivityImage("activity", 3, "png", root)
#root.b.pack()

# create the activity widget
root.a = Activity(root, 500, bg = "yellow")
root.a.pack()

# start the loop
root.a.start()
#root.b.start()

# stop the activity loop after 7 seconds
root.after(7000, root.a.stop)
#root.after(8000, root.b.stop)

root.mainloop().

关于python - Tkinter 中的事件指示器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35352409/

相关文章:

python - 如何在列表中嵌入一个类?

python - 强制对函数调用进行默认重新评估

python - 如何为 tkinter 和 paho-mqtt-client 定位无限循环?

python - 如何使用 Tkinter 改变形状的 alpha?

ios - 事件指示器动画不起作用 - Swift

python - 打开和读取文件

python - 动态生成内容的 html 标签在抓取时不显示文本

python - 使用 StringVar 的跟踪条目对标签没有影响

swift - 带有进度条的点对点多点连接。

multithreading - 新的Delphi TActivityIndi​​cator运行在主线程有什么用?