2017-01-30 189 views
1

我想使用Tkinter將循環進度條添加到我的Python GUI,但是我沒有找到任何Tkinter循環進度條的文檔。使用Tkinter的圓形進度條?

如何在Tkinter中創建循環進度條或者這是不可能的?

+1

據我所知沒有什麼建-在。你應該可以創建你自己的,例如通過在Canvas對象上繪製圓弧和/或橢圓。 – martineau

回答

3

沒有內置的,但你可以創建一個你自己的。下面是做這件事的是手工繪製的一種方式的例子,在Canvas更新顯卡:

try: 
    import Tkinter as tk 
    import tkFont 
    import ttk 
except ImportError: # Python 3 
    import tkinter as tk 
    import tkinter.font as tkFont 
    import tkinter.ttk as ttk 

class CircularProgressbar(object): 
    def __init__(self, canvas, x0, y0, x1, y1, width=2, start_ang=0, full_extent=360): 
     self.custom_font = tkFont.Font(family="Helvetica", size=12, weight='bold') 
     self.canvas = canvas 
     self.x0, self.y0, self.x1, self.y1 = x0+width, y0+width, x1-width, y1-width 
     self.tx, self.ty = (x1-x0)/2, (y1-y0)/2 
     self.width = width 
     self.start_ang, self.full_extent = start_ang, full_extent 
     # draw static bar outline 
     w2 = width/2 
     self.oval_id1 = self.canvas.create_oval(self.x0-w2, self.y0-w2, 
               self.x1+w2, self.y1+w2) 
     self.oval_id2 = self.canvas.create_oval(self.x0+w2, self.y0+w2, 
               self.x1-w2, self.y1-w2) 
     self.running = False 

    def start(self, interval=100): 
     self.interval = interval 
     self.increment = self.full_extent/interval 
     self.extent = 0 
     self.arc_id = self.canvas.create_arc(self.x0, self.y0, self.x1, self.y1, 
              start=self.start_ang, extent=self.extent, 
              width=self.width, style='arc') 
     percent = '0%' 
     self.label_id = self.canvas.create_text(self.tx, self.ty, text=percent, 
               font=self.custom_font) 
     self.running = True 
     self.canvas.after(interval, self.step, self.increment) 

    def step(self, delta): 
     if self.running: 
      self.extent = (self.extent + delta) % 360 
      self.canvas.itemconfigure(self.arc_id, extent=self.extent) 

      self.canvas.delete(self.label_id) 
      percent = '{:.0f}%'.format(round(float(self.extent)/self.full_extent * 100)) 
      self.label_id = self.canvas.create_text(self.tx, self.ty, text=percent, 
                font=self.custom_font) 
     self.canvas.after(self.interval, self.step, delta) 

    def toggle_pause(self): 
     self.running = not self.running 

class Application(tk.Frame): 
    def __init__(self, master=None): 
     tk.Frame.__init__(self, master) 
     self.grid() 
     self.createWidgets() 

    def createWidgets(self): 
     self.canvas = tk.Canvas(self, width=200, height=200, bg='white') 
     self.canvas.grid(row=0, column=0, columnspan=2) 

     self.progressbar = CircularProgressbar(self.canvas, 0, 0, 200, 200, 20) 

     self.pauseButton = tk.Button(self, text='Pause', command=self.pause) 
     self.pauseButton.grid(row=1, column=0) 
     self.quitButton = tk.Button(self, text='Quit', command=self.quit) 
     self.quitButton.grid(row=1, column=1) 

    def start(self): 
     self.progressbar.start() 
     self.mainloop() 

    def pause(self): 
     self.progressbar.toggle_pause() 

if __name__ == '__main__': 
    app = Application() 
    app.master.title('Sample application') 
    app.start() 

下面是它的一些截圖運行:

screenshots of it running

+0

非常感謝您的示例。 –

+0

不客氣。示例代碼可能不完全符合您的要求,但應包含足夠的線索以使您可以創建一個可以執行的代碼。如果它幫助你解決你的問題,請考慮增加投票和/或接受我的答案。 – martineau

1

Tkinter沒有任何對圓形進度條的支持。您必須使用一系列圖像或畫布上的繪圖來繪製自己的圖像。

+0

我也這麼想。不管怎麼說,還是要謝謝你。 –