Atzin 2018-12-27T09:53:25
I dont have enough rep to add a comment but the code that martineau put up as is, does not currently work and you need to change\n\n if self.running:\n self.cur_extent = (self.cur_extent + delta) % 360\n self.canvas.itemconfigure(self.arc_id, extent=self.cur_extent)\n\n\nto \n\n if self.running:\n self.extent = (self.extent + delta) % 360\n self.cur_extent = (self.extent + delta) % 360\n self.canvas.itemconfigure(self.arc_id, extent=self.cur_extent)\n",
martineau 2017-01-31T06:28:12
There's none built-in, but you can create one of your own. Here's an example of one way of doing it that manually draws and updates the graphics on a Canvas:\ntry:\n import Tkinter as tk\n import tkFont\n import ttk\nexcept ImportError: # Python 3\n import tkinter as tk\n import tkinter.font as tkFont\n import tkinter.ttk as ttk\n\n\nclass CircularProgressbar(object):\n def __init__(self, canvas, x0, y0, x1, y1, width=2, start_ang=0, full_extent=360.):\n self.custom_font = tkFont.Font(family="Helvetica", size=12, weight='bold')\n self.canvas = canvas\n self.x0, self.y0, self.x1, self.y1 = x0+width, y0+width, x1-width, y1-width\n self.tx, self.ty = (x1-x0) / 2, (y1-y0) / 2\n self.width = width\n self.start_ang, self.full_extent = start_ang, full_extent\n # draw static bar outline\n w2 = width / 2\n self.oval_id1 = self.canvas.create_oval(self.x0-w2, self.y0-w2,\n self.x1+w2, self.y1+w2)\n self.oval_id2 = self.canvas.create_oval(self.x0+w2, self.y0+w2,\n self.x1-w2, self.y1-w2)\n self.running = False\n\n def start(self, interval=100):\n self.interval = interval # Msec delay between updates.\n self.increment = self.full_extent / interval\n self.extent = 0\n self.arc_id = self.canvas.create_arc(self.x0, self.y0, self.x1, self.y1,\n start=self.start_ang, extent=self.extent,\n width=self.width, style='arc')\n percent = '0%'\n self.label_id = self.canvas.create_text(self.tx, self.ty, text=percent,\n font=self.custom_font)\n self.running = True\n self.canvas.after(interval, self.step, self.increment)\n\n def step(self, delta):\n """Increment extent and update arc and label displaying how much completed."""\n if self.running:\n self.extent = (self.extent + delta) % 360\n self.canvas.itemconfigure(self.arc_id, extent=self.extent)\n # Update percentage value displayed.\n percent = '{:.0f}%'.format(\n round(float(self.extent) / self.full_extent * 100))\n self.canvas.itemconfigure(self.label_id, text=percent)\n self.canvas.after(self.interval, self.step, delta)\n\n\n def toggle_pause(self):\n self.running = not self.running\n\n\nclass Application(tk.Frame):\n def __init__(self, master=None):\n tk.Frame.__init__(self, master)\n self.grid()\n self.createWidgets()\n\n def createWidgets(self):\n self.canvas = tk.Canvas(self, width=200, height=200, bg='white')\n self.canvas.grid(row=0, column=0, columnspan=2)\n\n self.progressbar = CircularProgressbar(self.canvas, 0, 0, 200, 200, 20)\n\n self.pauseButton = tk.Button(self, text='Pause', command=self.pause)\n self.pauseButton.grid(row=1, column=0)\n self.quitButton = tk.Button(self, text='Quit', command=self.quit)\n self.quitButton.grid(row=1, column=1)\n\n def start(self):\n self.progressbar.start()\n self.mainloop()\n\n def pause(self):\n self.progressbar.toggle_pause()\n\nif __name__ == '__main__':\n app = Application()\n app.master.title('Sample application')\n app.start()\n\nHere's some screenshots of it running:\n",