Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Tkinter的循环进度条?_Python_Tkinter_Progress Bar - Fatal编程技术网

Python 使用Tkinter的循环进度条?

Python 使用Tkinter的循环进度条?,python,tkinter,progress-bar,Python,Tkinter,Progress Bar,我想使用Tkinter将循环进度条添加到Python GUI中,但是我没有找到任何关于Tkinter循环进度条的文档 如何在Tkinter中创建循环进度条?这是不可能的吗?Tkinter不支持循环进度条。您必须使用一系列图像或画布上的绘图来绘制自己的图像。没有内置图像,但您可以创建自己的图像。下面是一个在画布上手动绘制和更新图形的示例: try: import Tkinter as tk import tkFont import ttk except ImportErro

我想使用Tkinter将循环进度条添加到Python GUI中,但是我没有找到任何关于Tkinter循环进度条的文档


如何在Tkinter中创建循环进度条?这是不可能的吗?

Tkinter不支持循环进度条。您必须使用一系列图像或画布上的绘图来绘制自己的图像。

没有内置图像,但您可以创建自己的图像。下面是一个在
画布上手动绘制和更新图形的示例:

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)