2016-02-11 55 views
3

每个操作系统都有一个活动指示器。 OS X和iOS有一朵点亮并以圆形图案淡化每个踏板的花朵。 Windows有一个旋转蓝盘的东西。 Android有灰色的东西(我认为它也可以是多种其他颜色 - IDK,我没有太多使用Android。)Tkinter的活动指标?

在Tkinter中使用这些图标的最佳方式是什么?有一些内置的小部件提供了这个吗?是否可能有一个变量,我可以指向一个图像小部件来让它显示这个图标(并对它进行动画处理?)

我知道Tkinter提供了一个Progress Bar,它有一个不确定的模式。我不想使用它 - 我需要一些适合小方形区域,而不是长方形区域的东西。第一段描述的活动指标将是完美的。

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

+0

没有答案,但也许这可以帮助MacOS https://gist.github.com/pudquick/f7cefd0d4320e0b648da –

+0

可能你将不得不使用'Canvas'或'Label'来显示图像,但是你必须自己动画(使用'root.after') – furas

+0

@NelelSegura - Huh。这依赖于'AppKit' /'Cocoa'。有没有一种方法可以将'AppKit'的小部件与'Tkinter'的小部件混合?我的印象你不能。 – ArtOfWarfare

回答

0

这应该足够你想要做的事情。我会创建我自己的动画或从互联网框架下载你想要显示的框架。画布更多与用户互动,这就是为什么我使用标签来显示图像...

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().