def initPlkXYChoice(self): labellength = 3 label = tk.Label(self, text="X") label.grid(row=0, column=1) label = tk.Label(self, text="Y") label.grid(row=0, column=2) self.grid_columnconfigure(0, weight=3) self.grid_columnconfigure(1, weight=1) self.grid_columnconfigure(2, weight=1) self.xbuttons = [] self.ybuttons = [] for ii, choice in enumerate(pulsar.plot_labels): label = tk.Label(self, text=choice) label.grid(row=ii + 1, column=0) self.xbuttons.append( tk.Radiobutton(self, variable=self.xvar, value=choice, command=self.updateChoice)) self.xbuttons[ii].grid(row=ii + 1, column=1) self.ybuttons.append( tk.Radiobutton(self, variable=self.yvar, value=choice, command=self.updateChoice)) self.ybuttons[ii].grid(row=ii + 1, column=2)
def initLayout(self): self.choice = tk.StringVar() self.prefit = tk.Radiobutton(self, text='Pre-Fit', command=self.choose, variable=self.choice, value='prefit') self.prefit.select() self.prefit.grid(row=0, column=0) self.postfit = tk.Radiobutton(self, text='Post-Fit', command=self.choose, variable=self.choice, value='postfit') self.postfit.grid(row=0, column=1)
def __init__(self, parent, radio_config, *args, **kwargs): tk.Frame.__init__(self, parent) self.parent = parent self.input_list = [] frame_ops = funcs.extract_args(kwargs, FRAME_KEYS, FRAME_KEY) frame = tk.Frame(self, frame_ops) frame.pack(fill='both', expand=True) label_ops = funcs.extract_args(kwargs, LABEL_KEYS, LABEL_KEY) label = tk.Label(frame, label_ops) tvar = tk.StringVar() label.pack(side='top', fill='x', expand=True) for radio_kwargs in radio_config: radio_ops = funcs.extract_args(radio_kwargs, RADIOBUTTON_KEYS, RADIOBUTTON_KEY) radio_ops['variable'] = tvar this_radio = tk.Radiobutton(frame, radio_ops) this_radio.pack(side='left', fill='x', expand=True) self.input_list.append(this_radio) self.parent.columnconfigure(0, weight=1) self.get = tvar.get self.set = tvar.set # self.state = lambda: change_state(self.entry) self.enable = self._enable self.normal = self._enable self.disable = self._disable self.clear = lambda: funcs.clear(entry)
def __init__(self, parent): tkinter.Frame.__init__(self, parent, borderwidth=2, relief=MYRIDGE) self.button = tkinter.Radiobutton( self, padx=5, pady=5, takefocus=0, indicatoron=tkinter.FALSE, highlightthickness=0, borderwidth=0, selectcolor=self.cget('bg')) self.button.pack()
def get_widget(self, master): frame = FieldContainer(master) for v in self.values: rb = tk.Radiobutton(frame, text=v, value=v, variable=self.var) rb.pack(side=self.side) return frame
def __init__(self, root, option): tk.Frame.__init__(self, root) self.label = tk.Label(self, text=option['prompt']) self.label.grid(row=0, column=0, padx=20) self.state = tk.BooleanVar() self.on_button = tk.Radiobutton(self, text='On', variable=self.state, value=True) self.off_button = tk.Radiobutton(self, text='Off', variable=self.state, value=False) for opt in option['options']: if 'default' in opt: self.state.set(opt['value']) self.on_button.grid(row=0, column=1) self.off_button.grid(row=0, column=2)
def get_widget(self, master): frame = FieldContainer(master) frame.configure(relief=tk.GROOVE, borderwidth=2) inner_frame = FieldContainer(frame) inner_frame.pack() for v in self.values: rb = tk.Radiobutton(inner_frame, text=v, value=v, variable=self.var) rb.pack(side=self.side, anchor=tk.NW) return frame
def createWidgets(self): # Action Button Tk.Button(self, text='Regénération cache', command=self.populate).pack(side=Tk.TOP, fill=Tk.X) # Listbox for thumbcache entries #self.thumblist = ThumbsListbox(self, height=25, width=35) self.thumblist = ThumbsListboxMulti(self, headings=(('index', { 'width': 60, 'anchor': Tk.E }), ('hash', { 'width': 200, 'anchor': Tk.CENTER }), ('size', { 'width': 100, 'anchor': Tk.CENTER })), style='ThumbList.Treeview', height=25) self.thumblist.pack(side=Tk.LEFT, fill=Tk.Y) # radiobuttons self.cachefile = Tk.StringVar() for label, cachefile in THMBC_DBS.items(): Tk.Radiobutton(self, text=label, variable=self.cachefile, value=cachefile, command=self.populate).pack(anchor=Tk.W) self.cachefile.set(THMBC_DBS['256x256']) # checkbox empty self.empty = Tk.BooleanVar() Tk.Checkbutton(self, text='Images vides', variable=self.empty, command=self.populate).pack(anchor=Tk.W)
def __init__(self, odf, plotter): self.f = Figure() # Save reference to the model self.odf = odf # Save reference to the plotter self.plotter = plotter self.leftMask = None self.rightMask = None self.activeLine = None self.root = tk.Tk() self.root.wm_title("PyA Model Explorer") # Make the widgets expand/shrink as window size changes self.root.columnconfigure(0, weight=1) self.root.rowconfigure(0, weight=1) # Bind the mouse wheel if platform.system() == "Linux": self.root.bind("<Button-4>", self._mouseWheel) self.root.bind("<Button-5>", self._mouseWheel) elif platform.system() == "Darwin": self.root.bind("<MouseWheel>", self._onWheel) # for OS X # A frame containing the mpl plot self.plotFrame = tk.Frame() self.plotFrame.pack(fill=tk.BOTH, side=tk.LEFT, expand=True) self.canvas = FigureCanvasTkAgg(self.f, master=self.plotFrame) # A frame containing the box with selected points # and control buttons self.controlFrame = tk.Frame(self.root) self.controlFrame.pack(side=tk.RIGHT, expand=False, fill=tk.BOTH) self.selectedPar = tk.StringVar(self.controlFrame) # Get parameters of model ps = list(self.odf.parameters().keys()) # Set default modification properties # Saves these properties for all parameters self.modProps = {} for p in ps: self.modProps[p] = {"modus":"mul", "modValMul":1.02, "modValAdd":0.01} # Frame containing all parameters self.parameterFrame = tk.Frame(self.controlFrame, height=2, bd=1, relief=tk.SUNKEN) # Dictionaries holding the specific information for each parameter self.singleParameterFrames = {} self.singleParameterEntry = {} self.singleParameterVar = {} self.singleParameterFree = {} # knows whether the parameter is free (value=True) or frozen (=False) # Closures around the functions adapting thaw/freeze def frozenChanged(k): def change(): if self.singleParameterFree[k].get() == True: self.odf.thaw(k) else: self.odf.freeze(k) self._updateDof() return change # define what happens when a value is set to the entered parameter (closures) def hitReturn(k): def change(*args): self.selectedPar.set(k) self.odf[k] = float(self.singleParameterVar[k].get()) self._parameterValueChanged() return change # defines what happens when a parameter's value is changed, but not set yet, i.e., not current (closures) def parameterValueChanged(k): def valueChanged(*args): pp,ll = str(self.singleParameterVar[k].get()).find("."), len(str(self.singleParameterVar[k].get())) if round(self.odf[k],ll-pp-1) != round(self.singleParameterVar[k].get(), ll-pp-1): self.singleParameterEntry[k].configure(bg = "red") else: self.singleParameterEntry[k].configure(bg = "white") return valueChanged # Create an entry for each parameter ## Create a scrollable region ## Check maximum number of characters for parameter names: maxParamLen = 0 for k in sorted(self.odf.parameters().keys()): if len(k) > maxParamLen: maxParamLen = len(k) ## Create an entry for each parameter for k in sorted(self.odf.parameters().keys()): x = tk.Frame(self.parameterFrame, height=2, bd=2, relief=tk.SUNKEN,pady=2) self.singleParameterFrames[k] = x y0 = tk.Radiobutton(x, text=k,variable=self.selectedPar,value=k, width=maxParamLen+1, indicatoron=0) y0.pack(side=tk.LEFT) #y1 = tk.StringVar() y1 = tk.DoubleVar() y1.set(self.odf[k]) y2 = tk.Entry(x, textvariable=y1, width=8) y2.bind('<Return>', hitReturn(k)) self.singleParameterVar[k] = y1 self.singleParameterVar[k].trace('w', parameterValueChanged(k)) self.singleParameterEntry[k]= y2 y2.pack(side=tk.LEFT) self.singleParameterFrames[k].pack() modModus = tk.StringVar() modModus.set(self.modProps[k]["modus"]) self.singleParameterFree[k] = tk.BooleanVar() self.singleParameterFree[k].set(k in self.odf.freeParamNames()) y3 = tk.Radiobutton(x, text="Thawed", value=True,variable=self.singleParameterFree[k], command=frozenChanged(k)) y4 = tk.Radiobutton(x, text="Frozen", value=False,variable=self.singleParameterFree[k], command=frozenChanged(k)) y3.pack(side=tk.RIGHT) y4.pack(side=tk.RIGHT) self.parameterFrame.pack(fill=tk.X, expand=False) # Set of the menu to select the current parameter self.selectedPar.set(ps[0]) # Chi2 frame: self.chi2Frame = tk.Frame(self.controlFrame, borderwidth=10)#, relief=tk.SUNKEN) self.chi2value = tk.DoubleVar() self.chi2value.set(self.plotter.chi2) self.dofValue = tk.IntVar() #self.dofValue.set(len(self.plotter.fitIdx)) #self.dofValue.set(100) self.dofValue.set(len(self.plotter.x) - len(self.odf.freeParameters())-1) self.chi2Label = tk.Label(self.chi2Frame,text="Chi2: ") self.dofLabel = tk.Label(self.chi2Frame,text="dof: ") self.chi2Entry = tk.Entry(self.chi2Frame, textvariable=self.chi2value, bd=2, width=10) self.dofEntry = tk.Entry(self.chi2Frame, textvariable=self.dofValue, bd=2, width=10) self.chi2Label.pack(side=tk.LEFT) self.chi2Entry.pack(side=tk.LEFT) self.dofLabel.pack(side=tk.LEFT) self.dofEntry.pack(side=tk.LEFT) self.chi2Frame.pack() # Frame to bundle mouse-wheel inputs self.mouseWheelFrame = tk.Frame(self.controlFrame, height=2, bd=3, relief=tk.SUNKEN) self.mwmLabel = tk.Label(self.mouseWheelFrame, text="Mouse wheel manipulation") self.mwmLabel.pack() # Modify by multiplication or addition (modModus) self.modModus = tk.StringVar() self.modModus.set("mul") # Entry field and radiobutton to specify factor to be used self.factorFrame = tk.Frame(self.mouseWheelFrame) self.modEntryTextMul = tk.StringVar() self.modEntryFactor = tk.Entry(self.factorFrame, textvariable=self.modEntryTextMul, width=6) self.modEntryFactor.pack(side=tk.LEFT) self.radioMultipli = tk.Radiobutton(self.factorFrame, text="Multiply", value="mul", variable=self.modModus) self.radioMultipli.pack(side=tk.LEFT) self.factorFrame.pack(fill=tk.BOTH) # Entry field and radiobutton to specify step (delta) to be used self.addFrame = tk.Frame(self.mouseWheelFrame) self.modEntryTextAdd = tk.StringVar() self.modEntryAdd = tk.Entry(self.addFrame, textvariable=self.modEntryTextAdd, width=6) self.modEntryAdd.pack(side=tk.LEFT) self.radioAdd = tk.Radiobutton(self.addFrame, text="Add", value="add", variable=self.modModus) self.radioAdd.pack(side=tk.LEFT) self.addFrame.pack(fill=tk.BOTH) # Set text fields for modification factor/step to default self.modEntryTextMul.set(self.modProps[self.selectedPar.get()]["modValMul"]) self.modEntryTextAdd.set(self.modProps[self.selectedPar.get()]["modValAdd"]) self.modEntryTextAdd.trace("w", self._modModeChangedAdd) self.modEntryTextMul.trace("w", self._modModeChangedMul) # Show the frame # self.mouseWheelFrame.grid(row=4, column=0, columnspan=3, pady=10) self.mouseWheelFrame.pack() # React to change in modify Modus self.modModus.trace('w', self._modModusChanged) # React to a change in the active parameter self.selectedPar.trace("w", self._activeParameterChanged) dummyLabel = tk.Label(self.controlFrame) dummyLabel.pack() # Fit button and fit ranges self.fitRangeFrame = tk.Frame(self.controlFrame, bd=3, relief=tk.SUNKEN) self.fit_lo = tk.DoubleVar() self.fit_hi = tk.DoubleVar() self.fit_lo.set(min(plotter.x)) self.fit_hi.set(max(plotter.x)) self.fitRangeLoLim = tk.Entry(self.fitRangeFrame, textvariable=self.fit_lo, width=9, bd=2) self.fitRangeHiLim = tk.Entry(self.fitRangeFrame, textvariable=self.fit_hi, width=9, bd=2) self.fitRangeLabel = tk.Label(self.fitRangeFrame, text="Fit range:") self.fitButton = tk.Button(self.fitRangeFrame, text="Fit", command=self._fitClicked) self.fitButton.pack(side=tk.BOTTOM, fill=tk.X) self.fitRangeLabel.pack(side=tk.LEFT, fill=tk.X) self.fitRangeHiLim.pack(side=tk.RIGHT) self.fitRangeLoLim.pack(side=tk.RIGHT) self.fitRangeFrame.pack(fill=tk.X) #self.fitRangeLoLim.bind('<Return>', self._fitRangeChanged()) self.fit_lo.trace("w", self._fitRangeChanged) self.fit_hi.trace("w", self._fitRangeChanged) self.numberClicked=0 #self.modModus.trace('w', self._modModusChanged) #self.modModus.trace('w', self._modModusChanged) dummyLabel = tk.Label(self.controlFrame) dummyLabel.pack() self.showFrame = tk.Frame(self.controlFrame, bd=3)#, relief=tk.SUNKEN) self.showFrame.pack(side=tk.TOP) self.parSumButton = tk.Button(self.showFrame, text="Parameter summary", command=self._parameterSummaryClicked) self.parSumButton.pack(side=tk.LEFT) self.valSetButton = tk.Button(self.showFrame, text="Value set code", command=self._valueSetClicked) # self.valSetButton.grid(row=7, column=2) self.valSetButton.pack(side=tk.RIGHT) # a tk.DrawingArea # self.canvas.get_tk_widget().grid(column=0, columnspan=7, row=0, rowspan=10) self.canvas.get_tk_widget().pack() self.cid = self.f.canvas.mpl_connect('button_press_event', self._mouseButtonClicked) self.toolbar = NavigationToolbar2TkAgg(self.canvas, self.plotFrame) self.toolbar.update() self.canvas._tkcanvas.pack(side=tk.TOP, fill=tk.BOTH, expand=True) def _quit(): # stops main loop self.root.quit() # this is necessary on Windows to prevent # Fatal Python Error: PyEval_RestoreThread: NULL tstate self.root.destroy() self.quitButton = tk.Button(master=self.controlFrame, text='Quit', command=_quit) self.quitButton.pack(side=tk.BOTTOM) # Plot the model for the first time self._parameterValueChanged() # Whether or not parameter summary exists self.root.parSumWin = None if platform.system() == "Darwin": self.root.bind("<MouseWheel>", self._onWheel) # for OS X
def __init__(self, x, y, yerr=None, mode="gauss", config=None): self.windowTitle = "PyA interactive GV" self.f = Figure() self.a = self.f.add_subplot(111) self._config = {"modelLS":'r--', \ "dataLS":'bp', \ "dataLSerr":'b+', \ "activeCompLS":'k-', \ "inactiveCompLS":'y--', \ "plotIndComps":True, \ "rangeLS":'m--', \ "defaultFreeVoigt":["A", "ad", "al", "mu"], \ "default_alad":0.1, \ "defaultFreeGauss":["A", "sig", "mu"], \ "defaultWheelAdd":0.01, \ "defaultWheelMult": 2} # Modify configuration according to input if config is not None: for k in six.iterkeys(self._config): if k in config: # Value has been modified self._config[k] = config[k] # Tk root self.root = tk.Tk() # Create data plot self._x = x self._y = y self._yerr = yerr if self._yerr is None: self.a.plot(x, y, self._config["dataLS"]) else: self.a.errorbar(x, y, yerr=self._yerr, fmt=self._config["dataLSerr"]) # The input mode determines how clicks on the mouse wheel are # interpreted. self._inputMode = "newComp" # Component count/assignment starts at 1 self._activeComponent = 1 self._compoCount = 0 # Create model and parameter lists self._mode = mode if self._mode == "voigt": self._model = fuf.MultiVoigt1d(1) self._compPars = ["mu", "ad", "al", "A"] elif self._mode == "gauss": self._model = fuf.MultiGauss1d(1) self._compPars = ["mu", "sig", "A"] else: raise(PE.PyAValError("No such mode: " + str(self._mode), \ solution="Choose either 'voigt' or 'gauss'.")) self._model["off"] = 1.0 # List used to cache points used to add component # as long as component is not completely specified self._pointCache = [] # What to consider in the fit self._rangeIndices = np.arange(self._x.size, dtype=np.int) # A frame containing the mpl plot self.plotFrame = tk.Frame() self.plotFrame.pack(fill=tk.BOTH, side=tk.LEFT, expand=True) self.canvas = FigureCanvasTkAgg(self.f, master=self.plotFrame) # A frame containing the box with selected points # and control buttons self.pointFrame = tk.Frame(self.root) self.pointFrame.pack(side=tk.LEFT, fill=tk.BOTH) # Manage active component self.activeCompoFrame = tk.Frame(self.pointFrame) self.activeCompoFrame.pack(side=tk.TOP) self.currentComponentLabel = tk.Label(self.activeCompoFrame, text="Active component") self.currentComponentLabel.pack(side=tk.TOP) # De- and increase no. of active component self.downACB = tk.Button(self.activeCompoFrame, text="-", command=self._downAC) self._acstring = tk.StringVar() self._acstring.set(str(self._activeComponent)) self.ACLabel = tk.Label(self.activeCompoFrame, textvariable=self._acstring) self.upACB = tk.Button(self.activeCompoFrame, text="+", command=self._upAC) self.downACB.pack(side=tk.LEFT) self.ACLabel.pack(side=tk.LEFT) self.upACB.pack(side=tk.RIGHT) # Show and work with parameters self.parameterFrame = tk.Frame(self.pointFrame, relief=tk.RAISED, borderwidth=1) self.parameterFrame.pack(side=tk.TOP) # Headline tk.Label(self.parameterFrame, text="Parameters (active comp.)").pack(side=tk.TOP) # List of parameters to show pars = ["off"] pars.extend(self._compPars) self._parSelect = tk.IntVar() # Frames for individual parameters self._parFrames = [] self._parValues = [] self._parFreeVars = [] for i, p in enumerate(pars): self._parFrames.append(tk.Frame(self.parameterFrame)) self._parFrames[-1].pack(side=tk.TOP) b = tk.Radiobutton(self._parFrames[-1], text="", variable=self._parSelect, value=i) b.pack(side=tk.LEFT, anchor=tk.W) l = tk.Label(self._parFrames[-1], text=("%3s" % p), width=3) l.pack(side=tk.LEFT, anchor=tk.W) self._parValues.append(tk.StringVar()) self._parValues[-1].set("0.0") l = tk.Label(self._parFrames[-1], textvariable=self._parValues[-1], width=10) l.pack(side=tk.LEFT) self._parFreeVars.append(tk.IntVar()) c = tk.Checkbutton(self._parFrames[-1], text="free", variable=self._parFreeVars[-1], \ command=self._freeCheckboxClicked) c.pack(side=tk.LEFT) # Wheel modification self._wheelModFrame = tk.Frame(self.pointFrame, relief=tk.RAISED, borderwidth=1) self._wheelModFrame.pack(side=tk.TOP) # Headline tk.Label(self._wheelModFrame, text="Mouse wheel").pack(side=tk.TOP) self._multAddSelect = tk.IntVar() self._multAddSelect.set(1) multiFrame = tk.Frame(self._wheelModFrame) addFrame = tk.Frame(self._wheelModFrame) multiFrame.pack(side=tk.TOP) addFrame.pack(side=tk.TOP) tk.Radiobutton(multiFrame, text="multiply [%]", variable=self._multAddSelect, value=1, width=9, anchor=tk.W).pack(side=tk.LEFT) tk.Radiobutton(addFrame, text="add", variable=self._multAddSelect, value=2, width=9, anchor=tk.W).pack(side=tk.LEFT) self._multNumber = tk.StringVar() self._addNumber = tk.StringVar() self._multNumber.set(str(self._config["defaultWheelMult"])) self._addNumber.set(str(self._config["defaultWheelAdd"])) self._multNumberEntry = tk.Entry(multiFrame, textvariable=self._multNumber, width=10) self._multNumberEntry.pack(side=tk.RIGHT) self._addNumberEntry = tk.Entry(addFrame, textvariable=self._addNumber, width=10) self._addNumberEntry.pack(side=tk.RIGHT) # Common width if self._mode == "gauss": commonSigFrame = tk.Frame(self.pointFrame) commonSigFrame.pack(side=tk.TOP) self._commonSig = tk.IntVar() c = tk.Checkbutton(commonSigFrame, text="Common width (sig)", variable=self._commonSig, \ command=self._commonSigClicked) c.pack(side=tk.LEFT) # Fit button self._fitButton = tk.Button(self.pointFrame, text="Fit", command=self._fitModel) self._fitButton.pack(side=tk.TOP, fill=tk.X) # Range button self._rangeButton = tk.Button(self.pointFrame, text="Set fit range", command=self._rangeButtonClicked) self._rangeButton.pack(side=tk.TOP, fill=tk.X) # Remove button self.removeButton = tk.Button(master=self.pointFrame, text="Remove component", \ command=self._removeButtonClicked) self.removeButton.pack(side=tk.TOP, fill=tk.X) # a tk.DrawingArea self.canvas.get_tk_widget().pack() self.cid = self.f.canvas.mpl_connect('button_press_event', self._mouseButtonClicked) self.mwe = self.f.canvas.mpl_connect('scroll_event', self._mouseWheel) self.toolbar = NavigationToolbar2TkAgg(self.canvas, self.plotFrame) self.toolbar.update() self.canvas._tkcanvas.pack(side=tk.TOP, fill=tk.BOTH, expand=True) def _quit(): # stops main loop self.root.quit() # this is necessary on Windows to prevent # Fatal Python Error: PyEval_RestoreThread: NULL tstate self.root.destroy() self.quitButton = tk.Button(master=self.pointFrame, text='Quit', command=_quit) self.quitButton.pack(side=tk.BOTTOM, fill=tk.X)
def __init__(self, parent, title, app, player, gameid, **kw): font_name = app.getFont('default') font = tkinter_font.Font(parent, font_name) tkfont = tkinter_font.Font(parent, font) font_metrics = font.metrics() measure = tkfont.measure self.text_height = font_metrics['linespace'] self.text_width = measure('XX.XX.XX') self.items = [] self.formatter = ProgressionFormatter(app, player, gameid) kw = self.initKw(kw) MfxDialog.__init__(self, parent, title, kw.resizable, kw.default) top_frame, bottom_frame = self.createFrames(kw) self.createBitmaps(top_frame, kw) frame = tkinter.Frame(top_frame) frame.pack(expand=True, fill='both', padx=5, pady=10) frame.columnconfigure(0, weight=1) # constants self.canvas_width, self.canvas_height = 600, 250 if parent.winfo_screenwidth() < 800 or \ parent.winfo_screenheight() < 600: self.canvas_width, self.canvas_height = 400, 200 self.xmargin, self.ymargin = 10, 10 self.graph_dx, self.graph_dy = 10, 10 self.played_color = '#ff7ee9' self.won_color = '#00dc28' self.percent_color = 'blue' # create canvas self.canvas = canvas = tkinter.Canvas(frame, bg='#dfe8ff', highlightthickness=1, highlightbackground='black', width=self.canvas_width, height=self.canvas_height) canvas.pack(side='left', padx=5) # dir = os.path.join('images', 'stats') try: fn = app.dataloader.findImage('progression', dir) self.bg_image = loadImage(fn) canvas.create_image(0, 0, image=self.bg_image, anchor='nw') except Exception: pass # tw = max(measure(_('Games/day')), measure(_('Games/week')), measure(_('% won'))) self.left_margin = self.xmargin + tw // 2 self.right_margin = self.xmargin + tw // 2 self.top_margin = 15 + self.text_height self.bottom_margin = 15 + self.text_height + 10 + self.text_height # x0, y0 = self.left_margin, self.canvas_height - self.bottom_margin x1, y1 = self.canvas_width - self.right_margin, self.top_margin canvas.create_rectangle(x0, y0, x1, y1, fill='white') # horizontal axis canvas.create_line(x0, y0, x1, y0, width=3) # left vertical axis canvas.create_line(x0, y0, x0, y1, width=3) t = _('Games/day') self.games_text_id = canvas.create_text(x0 - 4, y1 - 4, anchor='s', text=t) # right vertical axis canvas.create_line(x1, y0, x1, y1, width=3) canvas.create_text(x1 + 4, y1 - 4, anchor='s', text=_('% won')) # caption d = self.text_height x, y = self.xmargin, self.canvas_height - self.ymargin canvas.create_rectangle(x, y, x + d, y - d, outline='black', fill=self.played_color) x += d + 5 canvas.create_text(x, y, anchor='sw', text=_('Played')) x += measure(_('Played')) + 20 canvas.create_rectangle(x, y, x + d, y - d, outline='black', fill=self.won_color) x += d + 5 canvas.create_text(x, y, anchor='sw', text=_('Won')) x += measure(_('Won')) + 20 canvas.create_rectangle(x, y, x + d, y - d, outline='black', fill=self.percent_color) x += d + 5 canvas.create_text(x, y, anchor='sw', text=_('% won')) # right frame right_frame = tkinter.Frame(frame) right_frame.pack(side='left', fill='x', padx=5) self.all_games_variable = var = tkinter.StringVar() var.set('all') b = tkinter.Radiobutton(right_frame, text=_('All games'), variable=var, value='all', command=self.updateGraph, justify='left', anchor='w') b.pack(fill='x', expand=True, padx=3, pady=1) b = tkinter.Radiobutton(right_frame, text=_('Current game'), variable=var, value='current', command=self.updateGraph, justify='left', anchor='w') b.pack(fill='x', expand=True, padx=3, pady=1) label_frame = tkinter.LabelFrame(right_frame, text=_('Statistics for')) label_frame.pack(side='top', fill='x', pady=10) self.variable = var = tkinter.StringVar() var.set('week') for v, t in ( ('week', _('Last 7 days')), ('month', _('Last month')), ('year', _('Last year')), ('all', _('All time')), ): b = tkinter.Radiobutton(label_frame, text=t, variable=var, value=v, command=self.updateGraph, justify='left', anchor='w') b.pack(fill='x', expand=True, padx=3, pady=1) label_frame = tkinter.LabelFrame(right_frame, text=_('Show graphs')) label_frame.pack(side='top', fill='x') self.played_graph_var = tkinter.BooleanVar() self.played_graph_var.set(True) b = tkinter.Checkbutton(label_frame, text=_('Played'), command=self.updateGraph, variable=self.played_graph_var, justify='left', anchor='w') b.pack(fill='x', expand=True, padx=3, pady=1) self.won_graph_var = tkinter.BooleanVar() self.won_graph_var.set(True) b = tkinter.Checkbutton(label_frame, text=_('Won'), command=self.updateGraph, variable=self.won_graph_var, justify='left', anchor='w') b.pack(fill='x', expand=True, padx=3, pady=1) self.percent_graph_var = tkinter.BooleanVar() self.percent_graph_var.set(True) b = tkinter.Checkbutton(label_frame, text=_('% won'), command=self.updateGraph, variable=self.percent_graph_var, justify='left', anchor='w') b.pack(fill='x', expand=True, padx=3, pady=1) self.updateGraph() focus = self.createButtons(bottom_frame, kw) self.mainloop(focus, kw.timeout)