class CoordsCanvas(object): def __init__(self, parent, **kwargs): self._canvas = Canvas(parent, **kwargs) self._canvas.pack(fill=BOTH, expand=YES) self._canvas.bind("<Double-Button-1>", self.on_double_click) self._canvas.bind("<Shift-Button-1>", self.on_shift_button_click) self._canvas.bind("<Control-Button-1>", self.on_ctrl_button_click) self._canvas.bind("<Alt-Button-1>", self.on_alt_button_click) self._canvas.bind("<Option-Button-1>", self.on_alt_button_click) self._canvas.bind("<Double-Button-1>", self.on_double_click) self._canvas.bind("<ButtonPress-1>", self.on_button_press) self._canvas.bind("<ButtonRelease-1>", self.on_button_release) self._event_receiver = None self._dragger = Dragger() def on_double_click(self, _): if hasattr(self._event_receiver, 'zoom_in'): self._event_receiver.zoom_in() def on_shift_button_click(self, _): if hasattr(self._event_receiver, 'zoom_out'): self._event_receiver.zoom_out() def on_ctrl_button_click(self, event): if hasattr(self._event_receiver, 'add'): self._event_receiver.add(event.x, event.y) def on_alt_button_click(self, event): if hasattr(self._event_receiver, 'remove'): self._event_receiver.remove(event.x, event.y) def on_button_press(self, event): self._dragger.start(event.x, event.y) def on_button_release(self, event): if hasattr(self._event_receiver, 'move'): self._dragger.drag_to( event.x, event.y, self._event_receiver.move) def create_circle(self, x, y, r, **kwargs): return self._canvas.create_oval(x-r, y-r, x+r, y+r, **kwargs) def create_text(self, x, y, **kwargs): return self._canvas.create_text(x, y, **kwargs) def get_width(self): return self._canvas.winfo_reqwidth() def get_height(self): return self._canvas.winfo_reqheight() def set_event_receiver(self, receiver): self._event_receiver = receiver def destroy(self, item): self._canvas.delete(item) def destroy_all(self): self._canvas.delete("all")
class CoordsCanvas(object): def __init__(self, parent, **kwargs): self._canvas = Canvas(parent, **kwargs) self._canvas.pack(fill=BOTH, expand=YES) self._canvas.bind("<Double-Button-1>", self.on_double_click) self._canvas.bind("<Shift-Button-1>", self.on_shift_button_click) self._canvas.bind("<Control-Button-1>", self.on_ctrl_button_click) self._canvas.bind("<Alt-Button-1>", self.on_alt_button_click) self._canvas.bind("<Option-Button-1>", self.on_alt_button_click) self._canvas.bind("<Double-Button-1>", self.on_double_click) self._canvas.bind("<ButtonPress-1>", self.on_button_press) self._canvas.bind("<ButtonRelease-1>", self.on_button_release) self._event_receiver = None self._dragger = Dragger() def on_double_click(self, _): if hasattr(self._event_receiver, 'zoom_in'): self._event_receiver.zoom_in() def on_shift_button_click(self, _): if hasattr(self._event_receiver, 'zoom_out'): self._event_receiver.zoom_out() def on_ctrl_button_click(self, event): if hasattr(self._event_receiver, 'add'): self._event_receiver.add(event.x, event.y) def on_alt_button_click(self, event): if hasattr(self._event_receiver, 'remove'): self._event_receiver.remove(event.x, event.y) def on_button_press(self, event): self._dragger.start(event.x, event.y) def on_button_release(self, event): if hasattr(self._event_receiver, 'move'): self._dragger.drag_to(event.x, event.y, self._event_receiver.move) def create_circle(self, x, y, r, **kwargs): return self._canvas.create_oval(x - r, y - r, x + r, y + r, **kwargs) def create_text(self, x, y, **kwargs): return self._canvas.create_text(x, y, **kwargs) def get_width(self): return self._canvas.winfo_reqwidth() def get_height(self): return self._canvas.winfo_reqheight() def set_event_receiver(self, receiver): self._event_receiver = receiver def destroy(self, item): self._canvas.delete(item) def destroy_all(self): self._canvas.delete("all")
class ProgressBar: def __init__(self, master=None, orientation="horizontal", min=0, max=100, width=100, height=18, doLabel=1, appearance="sunken", fillColor="blue", background="gray", labelColor="yellow", labelFont="Verdana", labelText="", labelFormat="%d%%", value=0, bd=2): # preserve various values self.master=master self.orientation=orientation self.min=min self.max=max self.width=width self.height=height self.doLabel=doLabel self.fillColor=fillColor self.labelFont= labelFont self.labelColor=labelColor self.background=background self.labelText=labelText self.labelFormat=labelFormat self.value=value self.frame=Frame(master, relief=appearance, bd=bd) self.canvas=Canvas(self.frame, height=height, width=width, bd=0, highlightthickness=0, background=background) self.scale=self.canvas.create_rectangle(0, 0, width, height, fill=fillColor) self.label=self.canvas.create_text(self.canvas.winfo_reqwidth() / 2, height / 2, text=labelText, anchor="c", fill=labelColor, font=self.labelFont) self.update() self.canvas.pack(side='top', fill='x', expand='no') def updateProgress(self, newValue, newMax=None): if newMax: self.max = newMax self.value = newValue self.update() def update(self): # Trim the values to be between min and max value=self.value if value > self.max: value = self.max if value < self.min: value = self.min # Adjust the rectangle if self.orientation == "horizontal": self.canvas.coords(self.scale, 0, 0, float(value) / self.max * self.width, self.height) else: self.canvas.coords(self.scale, 0, self.height - (float(value) / self.max*self.height), self.width, self.height) # Now update the colors self.canvas.itemconfig(self.scale, fill=self.fillColor) self.canvas.itemconfig(self.label, fill=self.labelColor) # And update the label if self.doLabel: if value: if value >= 0: pvalue = int((float(value) / float(self.max)) * 100.0) else: pvalue = 0 self.canvas.itemconfig(self.label, text=self.labelFormat % pvalue) else: self.canvas.itemconfig(self.label, text='') else: self.canvas.itemconfig(self.label, text=self.labelFormat % self.labelText) self.canvas.update_idletasks()
class TkProgessBar(Frame): """ TkListboxMulticolumn component which can display multi-sortable listbox """ def __init__(self, master, cnf={}, **kw): """ Construct a listbox widget with one or many column and label field for header Valid resource names: background, bd, bg, borderwidth, class, colormap, fg, font, foreground, height, highlightbackground, """ Frame.__init__(self, master) self._value = kw.get('value', 0.0) # Create canvas for drawing in self._canvas = Canvas( self, bg=kw.get('bg', 'white'), width=kw.get('width', 300), height=kw.get('height', 20), relief=kw.get('relief', 'sunken'), border=kw.get('border', 1) ) self._canvas.pack(fill='both', expand='yes') # Drawing a rectangle self._rect = self._canvas.create_rectangle( 0, 0, 0, self._canvas.winfo_reqheight(), fill=kw.get('fillcolor', 'blue'), width=0 ) # Drawing a text area self._text = self._canvas.create_text( self._canvas.winfo_reqwidth()/2, self._canvas.winfo_reqheight()/2, text='', fill=kw.get('textcolor', 'gray') ) self.bind('<Configure>', self._update_coords) def _update_coords(self, event): '''Updates the position of the text and 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._canvas.update_idletasks() self._canvas.coords(self._text, self._canvas.winfo_width()/2, self._canvas.winfo_height()/2) self._canvas.coords(self._rect, 0, 0, self._canvas.winfo_width()*self._value, self._canvas.winfo_height()) self._canvas.update_idletasks() def get(self, first, last=None): """ return percent and text value """ return self._value, self._canvas.itemcget(self._text, 'text') def set(self, value=0.0, text=None): ''' Set different values. ''' #make the value failsafe: if value < 0.0: value = 0.0 elif value > 1.0: value = 1.0 self._value = value if text == None: #if no text is specified use the default percentage string: text = str(int(round(100 * value))) + ' %' self._canvas.coords(self._rect, 0, 0, self._canvas.winfo_width()*value, self._canvas.winfo_height()) self._canvas.itemconfigure(self._text, text=text) self._canvas.update_idletasks()
class ProgressBar: def __init__(self, master=None, orientation="horizontal", min=0, max=100, width=100, height=18, doLabel=1, appearance="sunken", fillColor="blue", background="gray", labelColor="yellow", labelFont="Verdana", labelText="", labelFormat="%d%%", value=0, bd=2): # preserve various values self.master = master self.orientation = orientation self.min = min self.max = max self.width = width self.height = height self.doLabel = doLabel self.fillColor = fillColor self.labelFont = labelFont self.labelColor = labelColor self.background = background self.labelText = labelText self.labelFormat = labelFormat self.value = value self.frame = Frame(master, relief=appearance, bd=bd) self.canvas = Canvas(self.frame, height=height, width=width, bd=0, highlightthickness=0, background=background) self.scale = self.canvas.create_rectangle(0, 0, width, height, fill=fillColor) self.label = self.canvas.create_text(self.canvas.winfo_reqwidth() / 2, height / 2, text=labelText, anchor="c", fill=labelColor, font=self.labelFont) self.update() self.canvas.pack(side='top', fill='x', expand='no') def updateProgress(self, newValue, newMax=None): if newMax: self.max = newMax self.value = newValue self.update() def update(self): # Trim the values to be between min and max value = self.value if value > self.max: value = self.max if value < self.min: value = self.min # Adjust the rectangle if self.orientation == "horizontal": self.canvas.coords(self.scale, 0, 0, float(value) / self.max * self.width, self.height) else: self.canvas.coords( self.scale, 0, self.height - (float(value) / self.max * self.height), self.width, self.height) # Now update the colors self.canvas.itemconfig(self.scale, fill=self.fillColor) self.canvas.itemconfig(self.label, fill=self.labelColor) # And update the label if self.doLabel: if value: if value >= 0: pvalue = int((float(value) / float(self.max)) * 100.0) else: pvalue = 0 self.canvas.itemconfig(self.label, text=self.labelFormat % pvalue) else: self.canvas.itemconfig(self.label, text='') else: self.canvas.itemconfig(self.label, text=self.labelFormat % self.labelText) self.canvas.update_idletasks()