mirror of
https://github.com/apprenticeharper/DeDRM_tools
synced 2024-12-26 09:58:55 +01:00
75 lines
2.9 KiB
Python
75 lines
2.9 KiB
Python
import sys
|
|
import tkinter
|
|
import tkinter.constants
|
|
|
|
class ActivityBar(tkinter.Frame):
|
|
|
|
def __init__(self, master, length=300, height=20, barwidth=15, interval=50, bg='white', fillcolor='orchid1',\
|
|
bd=2, relief=tkinter.constants.GROOVE, *args, **kw):
|
|
tkinter.Frame.__init__(self, master, bg=bg, width=length, height=height, *args, **kw)
|
|
self._master = master
|
|
self._interval = interval
|
|
self._maximum = length
|
|
self._startx = 0
|
|
self._barwidth = barwidth
|
|
self._bardiv = length / barwidth
|
|
if self._bardiv < 10:
|
|
self._bardiv = 10
|
|
stopx = self._startx + self._barwidth
|
|
if stopx > self._maximum:
|
|
stopx = self._maximum
|
|
# self._canv = Tkinter.Canvas(self, bg=self['bg'], width=self['width'], height=self['height'],\
|
|
# highlightthickness=0, relief='flat', bd=0)
|
|
self._canv = tkinter.Canvas(self, bg=self['bg'], width=self['width'], height=self['height'],\
|
|
highlightthickness=0, relief=relief, bd=bd)
|
|
self._canv.pack(fill='both', expand=1)
|
|
self._rect = self._canv.create_rectangle(0, 0, self._canv.winfo_reqwidth(), self._canv.winfo_reqheight(), fill=fillcolor, width=0)
|
|
|
|
self._set()
|
|
self.bind('<Configure>', self._update_coords)
|
|
self._running = False
|
|
|
|
def _update_coords(self, event):
|
|
'''Updates the position of the rectangle inside the canvas when the size of
|
|
the widget gets changed.'''
|
|
# looks like we have to call update_idletasks() twice to make sure
|
|
# to get the results we expect
|
|
self._canv.update_idletasks()
|
|
self._maximum = self._canv.winfo_width()
|
|
self._startx = 0
|
|
self._barwidth = self._maximum / self._bardiv
|
|
if self._barwidth < 2:
|
|
self._barwidth = 2
|
|
stopx = self._startx + self._barwidth
|
|
if stopx > self._maximum:
|
|
stopx = self._maximum
|
|
self._canv.coords(self._rect, 0, 0, stopx, self._canv.winfo_height())
|
|
self._canv.update_idletasks()
|
|
|
|
def _set(self):
|
|
if self._startx < 0:
|
|
self._startx = 0
|
|
if self._startx > self._maximum:
|
|
self._startx = self._startx % self._maximum
|
|
stopx = self._startx + self._barwidth
|
|
if stopx > self._maximum:
|
|
stopx = self._maximum
|
|
self._canv.coords(self._rect, self._startx, 0, stopx, self._canv.winfo_height())
|
|
self._canv.update_idletasks()
|
|
|
|
def start(self):
|
|
self._running = True
|
|
self.after(self._interval, self._step)
|
|
|
|
def stop(self):
|
|
self._running = False
|
|
self._set()
|
|
|
|
def _step(self):
|
|
if self._running:
|
|
stepsize = self._barwidth / 4
|
|
if stepsize < 2:
|
|
stepsize = 2
|
|
self._startx += stepsize
|
|
self._set()
|
|
self.after(self._interval, self._step)
|