【发布时间】:2017-06-16 01:51:45
【问题描述】:
我想使用 Tkinter 向我的 Python GUI 添加一个循环进度条,但我没有找到任何有关使用 Tkinter 的循环进度条的文档。
如何在 Tkinter 中创建循环进度条,或者这不可能?
【问题讨论】:
-
据我所知,没有任何内置功能。您应该能够创建自己的 - 例如通过在
Canvas对象上绘制弧线和/或椭圆形。
标签: python tkinter progress-bar
我想使用 Tkinter 向我的 Python GUI 添加一个循环进度条,但我没有找到任何有关使用 Tkinter 的循环进度条的文档。
如何在 Tkinter 中创建循环进度条,或者这不可能?
【问题讨论】:
Canvas 对象上绘制弧线和/或椭圆形。
标签: python tkinter progress-bar
没有内置的,但您可以创建自己的。这是手动绘制和更新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):
"""Increment extent and update arc and label displaying how much completed."""
if self.running:
self.cur_extent = (self.cur_extent + delta) % 360
self.canvas.itemconfigure(self.arc_id, extent=self.cur_extent)
percent = '{:.0f}%'.format(round(float(self.cur_extent) / self.full_extent * 100))
self.canvas.itemconfigure(self.label_id, text=percent)
self.after_id = 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()
这是它运行的一些屏幕截图:
【讨论】:
我没有足够的代表来添加评论,但 martineau 提供的代码目前无法正常工作,您需要更改
if self.running:
self.cur_extent = (self.cur_extent + delta) % 360
self.canvas.itemconfigure(self.arc_id, extent=self.cur_extent)
到
if self.running:
self.extent = (self.extent + delta) % 360
self.cur_extent = (self.extent + delta) % 360
self.canvas.itemconfigure(self.arc_id, extent=self.cur_extent)
【讨论】:
Tkinter 不支持圆形进度条。您必须使用一系列图像或在画布上绘制自己的图像。
【讨论】: