2017-01-30 12 views
1

Ich möchte einen kreisförmigen Fortschrittsbalken zu meiner Python-GUI mit Tkinter hinzufügen, aber ich habe keine Dokumentation für Kreisförmige Fortschrittsbalken mit Tkinter gefunden.Circular Fortschrittsbalken mit Tkinter?

Wie kann ich einen kreisförmigen Fortschrittsbalken in Tkinter erstellen oder ist das nicht möglich?

+1

Soweit ich weiß, gibt es nichts gebaut -im. Sie sollten in der Lage sein, Ihre eigenen zu erstellen - zum Beispiel, indem Sie Bögen und/oder Ovale auf ein "Canvas" -Objekt zeichnen. – martineau

Antwort

3

Es gibt keine eingebauten, aber Sie können eine eigene erstellen. Hier ist ein Beispiel für eine Art und Weise tun, die manuell zieht und aktualisiert die Grafiken auf einem 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() 

Hier einige Screenshots davon läuft:

screenshots of it running

+0

Vielen Dank für Ihr Beispiel. –

+0

Gern geschehen. Der Beispielcode erfüllt möglicherweise nicht genau das, was Sie möchten, sollte aber genügend Hinweise enthalten, damit Sie einen erstellen können, der dies tut. Bitte bedenken Sie, dass Sie meine Antwort aufheben und/oder annehmen, wenn Sie dadurch Ihr Problem lösen konnten. – martineau

1

Tkinter unterstützt keine kreisförmigen Fortschrittsbalken. Sie müssen Ihre eigenen zeichnen, indem Sie eine Reihe von Bildern oder eine Zeichnung auf einer Leinwand verwenden.

+0

dachte ich genauso. Danke trotzdem. –