def createFrames(self, kw): bottom_frame = ttk.Frame(self._frame, relief='flat', borderwidth=4) bottom_frame.pack(side='bottom', fill='both', expand=False) if kw.separator: separator = ttk.Separator(self._frame) separator.pack(side='bottom', fill='x') top_frame = ttk.Frame(self._frame) top_frame.pack(side='top', fill='both', expand=1) return top_frame, bottom_frame
def __init__(self, parent, title=None, input_options=None): tk.Toplevel.__init__(self, parent) self.transient(parent) self.input_options = input_options if title: self.title(title) self.parent = parent self.result = None body = ttk.Frame(self) self.initial_focus = self.body(body) body.pack(padx=5, pady=5) self.buttonbox() self.grab_set() if not self.initial_focus: self.initial_focus = self self.protocol("WM_DELETE_WINDOW", self.cancel) self.geometry("+%d+%d" % (parent.winfo_rootx() + 50, parent.winfo_rooty() + 50)) self.initial_focus.focus_set() self.wait_window(self)
def __init__(self, app, parent, title, **kw): self._url = kw['url'] 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) # self.button = kw.default frame = ttk.Frame(top_frame) frame.pack(fill='both', expand=True, padx=kw.padx, pady=kw.pady) msg = ttk.Label(frame, text=kw.text, justify=kw.justify, width=kw.width) msg.pack(fill='both', expand=True) # font_name = msg.lookup('TLabel', 'font') font_name = 'TkDefaultFont' font = tkinter_font.Font(parent, name=font_name, exists=True) font = font.copy() font.configure(underline=True) url_label = ttk.Label(frame, text=kw.url, font=font, foreground='blue', cursor='hand2') url_label.pack() from pysollib.options import calcCustomMouseButtonsBinding url_label.bind(calcCustomMouseButtonsBinding('<{mouse_button1}>'), self._urlClicked) # focus = self.createButtons(bottom_frame, kw) self.mainloop(focus, kw.timeout)
def __init__(self, top, row, column, columnspan): self.top = top self._show = True self._widgets = [] self._tooltips = [] # self._row = row self._column = column self._columnspan = columnspan self._label_column = 0 # self.padx = 1 self.label_relief = 'sunken' self.top_frame = ttk.Frame(self.top) self.top_frame.grid(row=self._row, column=self._column, columnspan=self._columnspan, sticky='ew') self.frame = ttk.Frame(self.top_frame) self.frame.pack(side='left', expand=True, fill='both', padx=0, pady=1)
def body(self, master): self.results = None # in case we cancel this gets returned self.results = None # in case we cancel this gets returned self.vars = {} self.widgets = {} self.values = {} colortables = [ ('Jet (blue to red)',matplotlib.cm.jet), ('Gray', matplotlib.cm.gray), ('Heat (black-red-yellow)', matplotlib.cm.gist_heat), ('Copper (black to tan)',matplotlib.cm.copper), ('Stern',matplotlib.cm.gist_stern), ('Prism (repeating rainbow)', matplotlib.cm.prism)] self.colortables = dict(colortables) lf = ttk.LabelFrame(master, text='WebbPSF Advanced Options') r=1 fr2 = ttk.Frame(lf) self.values['force_coron'] = ['regular propagation (MFT)', 'full coronagraphic propagation (FFT/SAM)'] self._add_labeled_dropdown("force_coron", lf, label='Direct imaging calculations use', values=self.values['force_coron'], default = self.values['force_coron'][ 1 if self.input_options['force_coron'] else 0] , width=30, position=(r,0), sticky='W') r+=1 self.values['no_sam'] = ['semi-analytic method if possible', 'basic FFT method always'] self._add_labeled_dropdown("no_sam", lf, label='Coronagraphic calculations use', values=self.values['no_sam'], default=self.values['no_sam'][ 1 if self.input_options['no_sam'] else 0] , width=30, position=(r,0), sticky='W') r+=1 self._add_labeled_dropdown("parity", lf, label='Output pixel grid parity is', values=['odd', 'even', 'either'], default=self.input_options['parity'], width=10, position=(r,0), sticky='W') lf.grid(row=1, sticky='E,W', padx=10,pady=5) lf = ttk.LabelFrame(master, text='PSF Display Options') r=0 self._add_labeled_dropdown("psf_scale", lf, label=' Display scale:', values=['log','linear'],default=self.input_options['psf_scale'], width=5, position=(r,0), sticky='W') r+=1 self._add_labeled_entry("psf_vmin", lf, label=' Min scale value:', value="%.2g" % self.input_options['psf_vmin'], width=7, position=(r,0), sticky='W') r+=1 self._add_labeled_entry("psf_vmax", lf, label=' Max scale value:', value="%.2g" % self.input_options['psf_vmax'], width=7, position=(r,0), sticky='W') r+=1 self._add_labeled_dropdown("psf_normalize", lf, label=' Normalize PSF to:', values=['Total', 'Peak'], default=self.input_options['psf_normalize'], width=5, position=(r,0), sticky='W') r+=1 self._add_labeled_dropdown("psf_cmap", lf, label=' Color table:', values=[a[0] for a in colortables], default=self.input_options['psf_cmap_str'], width=20, position=(r,0), sticky='W') lf.grid(row=2, sticky='E,W', padx=10,pady=5) return self.widgets['force_coron']# return widget to have initial focus
def __init__(self, parent, **kw): if 'resolution' in kw: self.resolution = kw['resolution'] del kw['resolution'] else: self.resolution = 1 if 'from_' in kw: kw['from_'] //= self.resolution if 'to' in kw: kw['to'] //= self.resolution if 'variable' in kw: self.variable = kw['variable'] del kw['variable'] else: self.variable = None value = None if 'value' in kw: value = kw['value'] del kw['value'] elif self.variable: value = self.variable.get() self.value = value self.command = command = None if 'command' in kw: command = kw['command'] kw['command'] = self._scale_command if 'label' in kw: self.label_text = kw['label'] width = len(self.label_text) + 4 # width = None del kw['label'] else: self.label_text = None width = 3 # create widgets side = 'left' # 'top' self.frame = ttk.Frame(parent) self.label = ttk.Label(self.frame, anchor='w', width=width, padding=(5, 0)) self.label.pack(side=side, expand=False, fill='x') self.scale = ttk.Scale(self.frame, **kw) self.scale.pack(side=side, expand=True, fill='both', pady=4) if self.variable: self.variable.trace('w', self._trace_var) if value is not None: self._set_text(self._round(value)) if self.variable: self.variable.set(value) self.command = command
def __init__(self, parent, title, app, manager, key=None, **kw): 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) # if key is None: key = manager.getSelected() self.app = app self.manager = manager self.key = key self.table_color = app.opt.colors['table'] if self.TreeDataHolder_Class.data is None: self.TreeDataHolder_Class.data = self.TreeData_Class(manager, key) # self.top.wm_minsize(400, 200) if self.top.winfo_screenwidth() >= 800: w1, w2 = 200, 400 else: w1, w2 = 200, 300 font = app.getFont("default") padx, pady = 4, 4 frame = ttk.Frame(top_frame) frame.pack(fill='both', expand=True, padx=kw.padx - padx, pady=kw.pady - pady) self.tree = self.Tree_Class(self, frame, key=key, default=kw.default, font=font, width=w1) self.tree.frame.pack(side="left", fill='both', expand=False, padx=padx, pady=pady) self.preview = MfxScrolledCanvas(frame, width=w2, hbar=0, vbar=0) self.preview.pack(side="right", fill='both', expand=True, padx=padx, pady=pady) self.preview.canvas.preview = 1 # create a preview of the current state self.preview_key = -1 self.updatePreview(key) # focus = self.createButtons(bottom_frame, kw) focus = self.tree.frame self.mainloop(focus, kw.timeout)
def make_expts_part(self, parent, part_name): """Make a component frame for the experiment editor.""" frame = ttk.Frame(parent) self.make_label(frame, part_name) if isinstance(self.template_expt[part_name], collections.Mapping): # This is actually a related group of fields self.expts_boxes[part_name] = boxes = {} self.make_expts_fields(frame, self.template_expt[part_name], boxes) else: textbox = T.Text(frame, width=100, height=5, wrap='word') textbox.grid(row=1, column=0, sticky='nesw') textbox.insert('1.0', self.template_expt[part_name]) self.expts_boxes[part_name] = textbox frame.pack(side='top', fill='x', expand=True)
def make_stim_frame(self, parent): """Create fields to edit the stimulus details. TODO: At present this restricts you to the same number of stimuli as the template. """ frame = ttk.Frame(parent) part_name = 'stimulus_details' self.make_label(frame, part_name) self.expts_boxes[part_name] = [] for stim in self.template_expt['stimulus_details']: boxes = {} self.expts_boxes[part_name].append(boxes) self.make_expts_fields(frame, stim, boxes) frame.pack(side='top', fill='x', expand=True)
def buttonbox(self): # add standard button box. override if you don't want the # standard buttons box = ttk.Frame(self) w = ttk.Button(box, text="OK", width=10, command=self.ok, default=tk.ACTIVE) w.pack(side=tk.LEFT, padx=5, pady=5) w = ttk.Button(box, text="Cancel", width=10, command=self.cancel) w.pack(side=tk.LEFT, padx=5, pady=5) self.bind("<Return>", self.ok) self.bind("<Escape>", self.cancel) box.pack()
def make_expts_fields(self, frame, template, boxes): """Create a related group of fields for an experiment section.""" for i, field in enumerate(template): self.make_label(frame, field, row=i + 1, sticky='ne') if isinstance(template[field], collections.Mapping): # Another nesting level! boxes[field] = {} subframe = ttk.Frame(frame) for j, subfield in enumerate(template[field]): self.make_label(subframe, subfield, row=j, sticky='e') boxes[field][subfield] = ttk.Entry(subframe, width=40) boxes[field][subfield].grid(row=j, column=1, sticky='w') subframe.grid(row=i + 1, column=1, sticky='we') else: boxes[field] = ttk.Entry(frame, width=70) boxes[field].grid(row=i + 1, column=1, sticky='w')
def __init__(self, parent, title, app, **kw): 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) self.app = app # self.update_stats_var = tkinter.BooleanVar() self.update_stats_var.set(app.opt.update_player_stats != 0) self.confirm_var = tkinter.BooleanVar() self.confirm_var.set(app.opt.confirm != 0) self.win_animation_var = tkinter.BooleanVar() self.win_animation_var.set(app.opt.win_animation != 0) # frame = ttk.Frame(top_frame) frame.pack(expand=True, fill='both', padx=5, pady=10) widget = ttk.Label(frame, text=_("\nPlease enter your name"), takefocus=0) widget.grid(row=0, column=0, columnspan=2, sticky='ew', padx=0, pady=5) # w = kw.get("e_width", 30) # width in characters names = self.app.getAllUserNames() self.player_var = ttk.Combobox(frame, width=w, values=tuple(names)) self.player_var.current(names.index(app.opt.player)) self.player_var.grid(row=1, column=0, sticky='ew', padx=0, pady=5) # widget = ttk.Checkbutton(frame, variable=self.confirm_var, text=_("Confirm quit")) widget.grid(row=2, column=0, columnspan=2, sticky='ew', padx=0, pady=5) widget = ttk.Checkbutton(frame, variable=self.update_stats_var, text=_("Update statistics and logs")) widget.grid(row=3, column=0, columnspan=2, sticky='ew', padx=0, pady=5) # widget = ttk.Checkbutton(frame, variable=self.win_animation_var, # text="Win animation") # widget.pack(side='top', padx=kw.padx, pady=kw.pady) frame.columnconfigure(0, weight=1) # self.player = self.player_var.get() self.confirm = self.confirm_var.get() self.update_stats = self.update_stats_var.get() self.win_animation = self.win_animation_var.get() # focus = self.createButtons(bottom_frame, kw) self.mainloop(focus, kw.timeout)
def make_people_tab(self, parent): """Build the people tab and add it to the parent.""" frame = ttk.Frame(parent) # Choosing who to edit ttk.Label(frame, text='Edit person:').grid(row=0, column=0, sticky='e') person_list = ttk.Combobox(frame, state='readonly', width=10, values=sorted( self.metadata['people'].keys())) person_list.bind('<<ComboboxSelected>>', lambda e: self.update_people_tab(person_list.get())) person_list.grid(row=0, column=1, sticky='w') # Section for adding new people ttk.Label(frame, text='New person:').grid(row=2, column=0, sticky='e') new_person_var = T.StringVar() ttk.Entry(frame, textvariable=new_person_var, width=10).grid(row=2, column=1, sticky='w') # TODO: Make hitting return in the Entry click the Add button # TODO: Make the Add button stick next to the Entry box ttk.Button(frame, text='Add', command=lambda: self.add_person(new_person_var.get( ), person_list)).grid(row=2, column=2, sticky='w') # Fields to edit current person widgets = self.session_widgets = {} ttk.Label(frame, text='Full name:').grid(row=0, column=4, sticky='e') widgets['name'] = ttk.Entry(frame) widgets['name'].grid(row=0, column=5, sticky='w') ttk.Label(frame, text='ORCID:').grid(row=1, column=4, sticky='e') widgets['orcid'] = ttk.Entry(frame) widgets['orcid'].grid(row=1, column=5, sticky='w') ttk.Label(frame, text='SCOPUS ID:').grid(row=2, column=4, sticky='e') widgets['scopus_id'] = ttk.Entry(frame) widgets['scopus_id'].grid(row=2, column=5, sticky='w') if self.metadata['people']: person_list.set(person_list['values'][0]) self.update_people_tab(person_list.get()) # Resize support frame.rowconfigure('all', weight=0) frame.columnconfigure(0, weight=2) frame.columnconfigure(3, weight=1) frame.columnconfigure(6, weight=2) parent.add(frame, text='People') return frame
def _createLabel(self, name, expand=False, width=0, tooltip=None): frame = ttk.Frame(self.frame, borderwidth=1, relief=self.label_relief) frame.grid(row=0, column=self._label_column, sticky='nsew', padx=self.padx) if expand: self.frame.grid_columnconfigure(self._label_column, weight=1) self._label_column += 1 setattr(self, name + '_frame', frame) self._widgets.append(frame) label = ttk.Label(frame, width=width, anchor='center') label.pack(expand=True, fill='both') setattr(self, name + '_label', label) self._widgets.append(label) if tooltip: b = MfxTooltip(label) self._tooltips.append(b) b.setText(tooltip) return label
def make_session_tab(self, parent): """Build a tab for setting session properties.""" frame = ttk.Frame(parent) ttk.Label(frame, text='Description:').grid(row=2, column=0, sticky='e') desc = ttk.Entry(frame, width=70) desc.grid(row=2, column=1, sticky='w') ttk.Label(frame, text='Researcher:').grid(row=0, column=0, sticky='e') researcher = ttk.Combobox(frame, state='readonly', values=sorted( self.metadata['people'].keys())) researcher.bind( '<<ComboboxSelected>>', lambda e: self.update_session( person=researcher.get(), expt=experiment, desc=desc)) researcher.grid(row=0, column=1, sticky='w') self.session_researcher_box = researcher ttk.Label(frame, text='Experiment:').grid(row=1, column=0, sticky='e') experiment = ttk.Combobox(frame, state='readonly', values=sorted( self.metadata['experiments'].keys())) experiment.bind( '<<ComboboxSelected>>', lambda e: self.update_session(person=researcher.get(), expt=experiment.get())) experiment.grid(row=1, column=1, sticky='w') self.session_experiment_box = experiment if 'last_session' not in self.metadata: self.metadata['last_session'] = T.StringVar() self.metadata['last_session'].set(researcher['values'][0]) last_person = self.metadata['last_session'].get() researcher.set(last_person) self.update_session(person=researcher.get(), desc=desc, expt=experiment) # Resize support & add to tabs frame.rowconfigure('all', weight=0) frame.columnconfigure('all', weight=1) parent.add(frame, text='This session') return frame
def __init__(self, parent, title, app, **kw): 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 = ttk.Frame(top_frame) frame.pack(expand=True, fill='both', padx=5, pady=10) frame.columnconfigure(0, weight=1) self.fonts = {} row = 0 for fn, title in ( # ('default', _('Default')), ('sans', _('HTML: ')), ('small', _('Small: ')), ('fixed', _('Fixed: ')), ('canvas_default', _('Tableau default: ')), ('canvas_fixed', _('Tableau fixed: ')), ('canvas_large', _('Tableau large: ')), ('canvas_small', _('Tableau small: ')), ): font = app.opt.fonts[fn] self.fonts[fn] = font ttk.Label(frame, text=title, anchor='w').grid(row=row, column=0, sticky='we') if font: title = ' '.join( [str(i) for i in font if i not in ('roman', 'normal')]) elif font is None: title = 'Default' label = ttk.Label(frame, font=font, text=title) label.grid(row=row, column=1, padx=8) b = ttk.Button( frame, text=_('Change...'), width=10, command=lambda label=label, fn=fn: self.selectFont(label, fn)) b.grid(row=row, column=2) row += 1 # focus = self.createButtons(bottom_frame, kw) self.mainloop(focus, kw.timeout)
def __init__(self, dialog, parent, app, player, gameid, **kw): ttk.Frame.__init__(self, parent) self.oval_width = 120 self.oval_height = 60 left_label = ttk.Label(self, image=app.gimages.logos[5]) left_label.pack(side='left', expand=True, fill='both') self.right_frame = ttk.Frame(self) self.right_frame.pack(side='right', expand=True) self.dialog = dialog self.app = app self.parent = parent self.player = player or _("Demo games") # self._calc_tabs() # won, lost = app.stats.getStats(player, gameid) self.createPieChart(app, won, lost, _("Total")) won, lost = app.stats.getSessionStats(player, gameid) self.createPieChart(app, won, lost, _("Current session"))
def __init__(self, app, parent, title=None, images=None, color="blue", width=300, height=25, show_text=1, norm=1): self.parent = parent self.percent = 0 self.top = makeToplevel(parent, title=title) self.top.wm_protocol("WM_DELETE_WINDOW", self.wmDeleteWindow) self.top.wm_group(parent) self.top.wm_resizable(False, False) self.top.config(cursor="watch") # self.frame = ttk.Frame(self.top, relief='flat', borderwidth=0) self.progress = ttk.Progressbar(self.frame, maximum=100, length=250) # style = ttk.Style(self.progress) # style.configure('TProgressbar', background=color) if images: self.f1 = ttk.Label(self.frame, image=images[0]) self.f1.pack(side='left', ipadx=8, ipady=4) self.progress.pack(side='left', expand=True, fill='x') self.f2 = ttk.Label(self.frame, image=images[1]) self.f2.pack(side='left', ipadx=8, ipady=4) else: self.progress.pack(expand=True, fill='x') self.frame.pack(expand=True, fill='both') if 1: setTransient(self.top, None, relx=0.5, rely=0.5) else: self.update(percent=0) self.norm = norm self.steps_sum = 0
def __init__(self, dialog, parent, app, player, **kw): ttk.Frame.__init__(self, parent) # self.dialog = dialog self.app = app self.CHAR_H = self.dialog.font_metrics['linespace'] self.CHAR_W = self.dialog.tkfont.measure('M') # self.player = player self.sort_by = 'name' self.tree_items = [] self.tree_tabs = None self.games = {} # tree_itemid: gameid # frame = ttk.Frame(self) frame.pack(fill='both', expand=True, padx=10, pady=10) vsb = ttk.Scrollbar(frame) vsb.grid(row=0, column=1, sticky='ns') self.tree = ttk.Treeview(frame, columns=self.COLUMNS, selectmode='browse') self.tree.grid(row=0, column=0, sticky='nsew') self.tree.config(yscrollcommand=vsb.set) vsb.config(command=self.tree.yview) frame.rowconfigure(0, weight=1) frame.columnconfigure(0, weight=1) hsb = ttk.Scrollbar(frame, orient='horizontal') hsb.grid(row=1, column=0, sticky='ew') self.tree.config(xscrollcommand=hsb.set) hsb.config(command=self.tree.xview) bind(self.tree, '<<TreeviewSelect>>', self.treeviewSelected) # self.formatter = TreeFormatter(self.app, self.tree, self, self.dialog.heading_tkfont, self.CHAR_W, self.CHAR_H) self.createHeader(player) bind(self.tree, '<Map>', self.mapEvent)
def __init__(self, dialog, parent, app, player, gameid, **kw): ttk.Frame.__init__(self, parent) self.mapped = False self.dialog = dialog self.app = app self.player = player self.gameid = gameid self.items = [] self.formatter = ProgressionFormatter(app, player, gameid) frame = ttk.Frame(self) frame.pack(expand=True, fill='both', padx=5, pady=10) frame.columnconfigure(0, weight=1) # constants w = dialog.tkfont.measure('M') * 42 w = max(w, 500) w = min(w, 600) self.canvas_width, self.canvas_height = w, 325 cond = parent.winfo_screenwidth() < 800 or \ parent.winfo_screenheight() < 600 if cond: 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', bd=0, highlightthickness=1, highlightbackground='black', width=self.canvas_width, height=self.canvas_height) canvas.pack(side='left', padx=5) # right frame right_frame = ttk.Frame(frame) right_frame.pack(side='left', fill='x', padx=5) self.all_games_variable = var = tkinter.StringVar() var.set('all') b = ttk.Radiobutton(right_frame, text=_('All games'), variable=var, value='all', command=self.updateGraph) b.pack(fill='x', expand=True, padx=3, pady=1) b = ttk.Radiobutton(right_frame, text=_('Current game'), variable=var, value='current', command=self.updateGraph) b.pack(fill='x', expand=True, padx=3, pady=1) label_frame = ttk.LabelFrame(right_frame, text=_('Statistics for')) label_frame.pack(side='top', fill='x', pady=5) 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 = ttk.Radiobutton(label_frame, text=t, variable=var, value=v, command=self.updateGraph) b.pack(fill='x', expand=True, padx=3, pady=1) label_frame = ttk.LabelFrame(right_frame, text=_('Show graphs')) label_frame.pack(side='top', fill='x', pady=5) self.played_graph_var = tkinter.BooleanVar() self.played_graph_var.set(True) b = ttk.Checkbutton(label_frame, text=_('Played'), command=self.updateGraph, variable=self.played_graph_var) b.pack(fill='x', expand=True, padx=3, pady=1) self.won_graph_var = tkinter.BooleanVar() self.won_graph_var.set(True) b = ttk.Checkbutton(label_frame, text=_('Won'), command=self.updateGraph, variable=self.won_graph_var) b.pack(fill='x', expand=True, padx=3, pady=1) self.percent_graph_var = tkinter.BooleanVar() self.percent_graph_var.set(True) b = ttk.Checkbutton(label_frame, text=_('% won'), command=self.updateGraph, variable=self.percent_graph_var) b.pack(fill='x', expand=True, padx=3, pady=1) label_frame = ttk.LabelFrame(right_frame, text=_('Date format')) label_frame.pack(side='top', fill='x', pady=5) self.date_format = tkinter.StringVar() self.date_format.set(self.app.opt.date_format) b = ttk.Radiobutton(label_frame, text=_('MM-DD'), command=self.updateDateFormat, variable=self.date_format, value='%m-%d') b.pack(fill='x', expand=True, padx=3, pady=1) b = ttk.Radiobutton(label_frame, text=_('DD-MM'), command=self.updateDateFormat, variable=self.date_format, value='%d-%m') b.pack(fill='x', expand=True, padx=3, pady=1) # self.createGraph() bind(canvas, '<Map>', self.createGraph)
def __init__(self, parent, title, app, gameid, top, **kw): 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) cnf = {'master': top_frame, 'padding': (4, 1), } frame = ttk.Frame(**cnf) frame.pack(expand=True, fill='both', padx=10, pady=10) frame.columnconfigure(0, weight=1) cnf['master'] = frame cnf['text'] = _('N') label = ttk.Label(**cnf) label.grid(row=0, column=0, sticky='ew') if gameid == 'all': cnf['text'] = _('Game') label = ttk.Label(**cnf) label.grid(row=0, column=1, sticky='ew') cnf['text'] = _('Game number') label = ttk.Label(**cnf) label.grid(row=0, column=2, sticky='ew') cnf['text'] = _('Started at') label = ttk.Label(**cnf) label.grid(row=0, column=3, sticky='ew') cnf['text'] = _('Result') label = ttk.Label(**cnf) label.grid(row=0, column=4, sticky='ew') row = 1 for i in top: # N cnf['text'] = str(row) label = ttk.Label(**cnf) label.grid(row=row, column=0, sticky='ew') if gameid == 'all': name = app.getGameTitleName(i.gameid) if name is None: name = _("** UNKNOWN %d **") % i.gameid cnf['text'] = name label = ttk.Label(**cnf) label.grid(row=row, column=1, sticky='ew') # Game number cnf['text'] = '#'+str(i.game_number) label = ttk.Label(**cnf) label.grid(row=row, column=2, sticky='ew') # Start time t = time.strftime( '%Y-%m-%d %H:%M', time.localtime(i.game_start_time)) cnf['text'] = t label = ttk.Label(**cnf) label.grid(row=row, column=3, sticky='ew') # Result if isinstance(i.value, float): # time s = format_time(i.value) else: # moves s = str(i.value) cnf['text'] = s label = ttk.Label(**cnf) label.grid(row=row, column=4, sticky='ew') row += 1 focus = self.createButtons(bottom_frame, kw) self.mainloop(focus, kw.timeout)
def __init__(self, parent, title, cardset, images, **kw): 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 = ttk.Frame(top_frame) frame.pack(fill="both", expand=True, padx=5, pady=10) # # row = 0 info_frame = ttk.LabelFrame(frame, text=_('About cardset')) info_frame.grid(row=row, column=0, columnspan=2, sticky='ew', padx=0, pady=5, ipadx=5, ipady=5) row += 1 styles = nationalities = year = None if cardset.si.styles: styles = '\n'.join([CSI.STYLE[i] for i in cardset.si.styles]) if cardset.si.nationalities: nationalities = '\n'.join([CSI.NATIONALITY[i] for i in cardset.si.nationalities]) if cardset.year: year = str(cardset.year) frow = 0 for n, t in ( # ('Version:', str(cardset.version)), (_('Type:'), CSI.TYPE[cardset.type]), (_('Styles:'), styles), (_('Nationality:'), nationalities), (_('Year:'), year), # (_('Number of cards:'), str(cardset.ncards)), (_('Size:'), '%d x %d' % (cardset.CARDW, cardset.CARDH)), ): if t is not None: label = ttk.Label(info_frame, text=n, anchor='w', justify='left') label.grid(row=frow, column=0, sticky='nw', padx=4) label = ttk.Label(info_frame, text=t, anchor='w', justify='left') label.grid(row=frow, column=1, sticky='nw', padx=4) frow += 1 if images: try: from random import choice im = choice(images) f = os.path.join(cardset.dir, cardset.backname) self.back_image = loadImage(file=f) # store the image label = ttk.Label(info_frame, image=im, padding=5) label.grid(row=0, column=2, rowspan=frow+1, sticky='ne') label = ttk.Label(info_frame, image=self.back_image, padding=(0, 5, 5, 5)) # left margin = 0 label.grid(row=0, column=3, rowspan=frow+1, sticky='ne') info_frame.columnconfigure(2, weight=1) info_frame.rowconfigure(frow, weight=1) except Exception: pass if USE_PIL: padx = 4 pady = 0 settings_frame = ttk.LabelFrame(frame, text=_('Settings')) settings_frame.grid(row=row, column=0, columnspan=2, sticky='ew', padx=0, pady=5, ipadx=5, ipady=5) row += 1 var = tkinter.IntVar() self.x_offset = PysolScale( settings_frame, label=_('X offset:'), from_=5, to=40, resolution=1, orient='horizontal', variable=var, value=cardset.CARD_XOFFSET, # command=self._updateScale ) self.x_offset.grid(row=0, column=0, sticky='ew', padx=padx, pady=pady) var = tkinter.IntVar() self.y_offset = PysolScale( settings_frame, label=_('Y offset:'), from_=5, to=40, resolution=1, orient='horizontal', variable=var, value=cardset.CARD_YOFFSET, # command=self._updateScale ) self.y_offset.grid(row=1, column=0, sticky='ew', padx=padx, pady=pady) row += 1 # bg = top_frame["bg"] bg = 'white' text_w = tkinter.Text(frame, bd=1, relief="sunken", wrap="word", padx=4, width=64, height=16, bg=bg) text_w.grid(row=row, column=0, sticky='nsew') sb = ttk.Scrollbar(frame) sb.grid(row=row, column=1, sticky='ns') text_w.configure(yscrollcommand=sb.set) sb.configure(command=text_w.yview) frame.columnconfigure(0, weight=1) frame.rowconfigure(1, weight=1) # text = '' fn = os.path.join(cardset.dir, "COPYRIGHT") try: with open(fn, "rt") as fh: text = fh.read() except Exception: pass if text: text_w.config(state="normal") text_w.insert("insert", text) text_w.config(state="disabled") # focus = self.createButtons(bottom_frame, kw) # focus = text_w self.mainloop(focus, kw.timeout)
def __init__(self, parent, title, app, manager, key=None, **kw): 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) # if key is None: key = manager.getSelected() self.manager = manager self.key = key self.app = app self.cardset_values = None # padx, pady = kw.padx, kw.pady padx, pady = 5, 5 if self.TreeDataHolder_Class.data is None: self.TreeDataHolder_Class.data = self.TreeData_Class(manager, key) # self.top.wm_minsize(400, 200) if self.top.winfo_screenwidth() >= 800: w1, w2 = 240, 400 else: w1, w2 = 200, 300 paned_window = ttk.PanedWindow(top_frame, orient='horizontal') paned_window.pack(expand=True, fill='both') left_frame = ttk.Frame(paned_window) right_frame = ttk.Frame(paned_window) paned_window.add(left_frame) paned_window.add(right_frame) font = app.getFont("default") self.tree = self.Tree_Class(self, left_frame, key=key, default=kw.default, font=font, width=w1) self.tree.frame.grid(row=0, column=0, sticky='nsew', padx=padx, pady=pady) if USE_PIL: # var = tkinter.DoubleVar() var.set(app.opt.scale_x) self.scale_x = PysolScale( left_frame, label=_('Scale X:'), from_=0.5, to=4.0, resolution=0.1, orient='horizontal', variable=var, value=app.opt.scale_x, command=self._updateScale) self.scale_x.grid( row=1, column=0, sticky='ew', padx=padx, pady=pady) # var = tkinter.DoubleVar() var.set(app.opt.scale_y) self.scale_y = PysolScale( left_frame, label=_('Scale Y:'), from_=0.5, to=4.0, resolution=0.1, orient='horizontal', variable=var, value=app.opt.scale_y, command=self._updateScale) self.scale_y.grid( row=2, column=0, sticky='ew', padx=padx, pady=pady) # self.auto_scale = tkinter.BooleanVar() self.auto_scale.set(app.opt.auto_scale) check = ttk.Checkbutton( left_frame, text=_('Auto scaling'), variable=self.auto_scale, takefocus=False, command=self._updateAutoScale ) check.grid(row=3, column=0, columnspan=2, sticky='ew', padx=padx, pady=pady) # self.preserve_aspect = tkinter.BooleanVar() self.preserve_aspect.set(app.opt.preserve_aspect_ratio) self.aspect_check = ttk.Checkbutton( left_frame, text=_('Preserve aspect ratio'), variable=self.preserve_aspect, takefocus=False, # command=self._updateScale ) self.aspect_check.grid(row=4, column=0, sticky='ew', padx=padx, pady=pady) self._updateAutoScale() # left_frame.rowconfigure(0, weight=1) left_frame.columnconfigure(0, weight=1) # self.preview = MfxScrolledCanvas(right_frame, width=w2) self.preview.setTile(app, app.tabletile_index, force=True) self.preview.pack(fill='both', expand=True, padx=padx, pady=pady) self.preview.canvas.preview = 1 # create a preview of the current state self.preview_key = -1 self.preview_images = [] self.scale_images = [] self.updatePreview(key) # focus = self.createButtons(bottom_frame, kw) focus = self.tree.frame self.mainloop(focus, kw.timeout)
def __init__(self, top, menubar, dir, size=0, relief='flat', compound='none'): from pysollib.options import calcCustomMouseButtonsBinding self.top = top self.menubar = menubar self.side = -1 self._tooltips = [] self._widgets = [] self.dir = dir self.size = size self.compound = compound self.orient = 'horizontal' # self.frame = ttk.Frame(top, class_='Toolbar', relief=TkSettings.toolbar_relief, borderwidth=TkSettings.toolbar_borderwidth) # for label, f, t in ( (n_("New"), self.mNewGame, _("New game")), (n_("Restart"), self.mRestart, _("Restart the\ncurrent game")), (None, None, None), (n_("Open"), self.mOpen, _("Open a\nsaved game")), (n_("Save"), self.mSave, _("Save game")), (None, None, None), (n_("Undo"), self.mUndo, _("Undo last move")), (n_("Redo"), self.mRedo, _("Redo last move")), (n_("Autodrop"), self.mDrop, _("Auto drop cards")), (n_("Shuffle"), self.mShuffle, _("Shuffle tiles")), (n_("Pause"), self.mPause, _("Pause game")), (None, None, None), (n_("Statistics"), self.mPlayerStats, _("View statistics")), (n_("Rules"), self.mHelpRules, _("Rules for this game")), (None, None, None), (n_("Quit"), self.mQuit, _("Quit %s") % TITLE), ): if label is None: sep = self._createSeparator() sep.bind(calcCustomMouseButtonsBinding("<{mouse_button3}>"), self.rightclickHandler) elif label == 'Pause': self._createButton(label, f, check=True, tooltip=t) else: self._createButton(label, f, tooltip=t) self.pause_button.config(variable=menubar.tkopt.pause) self.popup = MfxMenu(master=None, label=n_('Toolbar'), tearoff=0) createToolbarMenu(menubar, self.popup) position = len(self._widgets) self.frame.rowconfigure(position, weight=1) self.frame.columnconfigure(position, weight=1) # self._createLabel("player", label=n_('Player'), tooltip=_("Player options")) # self.player_label.bind( calcCustomMouseButtonsBinding("<{mouse_button1}>"), self.mOptPlayerOptions) self.frame.bind(calcCustomMouseButtonsBinding("<{mouse_button3}>"), self.rightclickHandler) # self.setCompound(compound, force=True)
def __init__(self, parent, title, init_font, **kw): # print init_font 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) self.font_family = 'Helvetica' self.font_size = 12 self.font_weight = 'normal' self.font_slant = 'roman' if init_font is not None: assert 2 <= len(init_font) <= 4 assert isinstance(init_font[1], int) self.font_family, self.font_size = init_font[:2] if len(init_font) > 2: if init_font[2] in ['bold', 'normal']: self.font_weight = init_font[2] elif init_font[2] in ['italic', 'roman']: self.font_slant = init_font[2] else: raise ValueError('invalid font style: ' + init_font[2]) if len(init_font) > 3: if init_font[3] in ['bold', 'normal']: self.font_weight = init_font[3] elif init_font[2] in ['italic', 'roman']: self.font_slant = init_font[3] else: raise ValueError('invalid font style: ' + init_font[3]) # self.family_var = tkinter.StringVar() self.weight_var = tkinter.BooleanVar() self.weight_var.set(self.font_weight == 'bold') self.slant_var = tkinter.BooleanVar() self.slant_var.set(self.font_slant == 'italic') self.size_var = tkinter.IntVar() self.size_var.set(self.font_size) # frame = ttk.Frame(top_frame) frame.pack(expand=True, fill='both', padx=5, pady=10) frame.columnconfigure(0, weight=1) # frame.rowconfigure(1, weight=1) self.entry = ttk.Entry(frame) self.entry.grid(row=0, column=0, columnspan=2, sticky='news') self.entry.insert('end', _('abcdefghABCDEFGH')) self.list_box = tkinter.Listbox(frame, width=36, exportselection=False) sb = ttk.Scrollbar(frame) self.list_box.configure(yscrollcommand=sb.set) sb.configure(command=self.list_box.yview) self.list_box.grid(row=1, column=0, sticky='news') # rowspan=4 sb.grid(row=1, column=1, sticky='ns') bind(self.list_box, '<<ListboxSelect>>', self.fontupdate) # self.list_box.focus() cb1 = ttk.Checkbutton(frame, text=_('Bold'), command=self.fontupdate, variable=self.weight_var) cb1.grid(row=2, column=0, columnspan=2, sticky='we') cb2 = ttk.Checkbutton(frame, text=_('Italic'), command=self.fontupdate, variable=self.slant_var) cb2.grid(row=3, column=0, columnspan=2, sticky='we') sc = PysolScale(frame, from_=6, to=40, resolution=1, label=_('Size:'), orient='horizontal', command=self.fontupdate, variable=self.size_var) sc.grid(row=4, column=0, columnspan=2, sticky='news') # font_families = list(tkinter_font.families()) font_families.sort() selected = -1 n = 0 self.list_box.insert('end', *font_families) for font in font_families: if font.lower() == self.font_family.lower(): selected = n break n += 1 if selected >= 0: self.list_box.select_set(selected) self.list_box.see(selected) # focus = self.createButtons(bottom_frame, kw) self.mainloop(focus, kw.timeout) self.font = (self.font_family, self.font_size, self.font_slant, self.font_weight)
def __init__(self, parent, title, app, **kw): self.app = app 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) # self.saved_opt = app.opt.copy() self.sound = tkinter.BooleanVar() self.sound.set(app.opt.sound != 0) self.sound_mode = tkinter.BooleanVar() self.sound_mode.set(app.opt.sound_mode != 0) self.sample_volume = tkinter.IntVar() self.sample_volume.set(app.opt.sound_sample_volume) self.music = tkinter.BooleanVar() self.music.set(app.opt.music != 0) self.music_volume = tkinter.IntVar() self.music_volume.set(app.opt.sound_music_volume) self.samples = [ ('areyousure', _('Are You Sure'), tkinter.BooleanVar()), ('deal', _('Deal'), tkinter.BooleanVar()), ('dealwaste', _('Deal waste'), tkinter.BooleanVar()), ('turnwaste', _('Turn waste'), tkinter.BooleanVar()), ('startdrag', _('Start drag'), tkinter.BooleanVar()), ('drop', _('Drop'), tkinter.BooleanVar()), ('droppair', _('Drop pair'), tkinter.BooleanVar()), ('autodrop', _('Auto drop'), tkinter.BooleanVar()), ('flip', _('Flip'), tkinter.BooleanVar()), ('autoflip', _('Auto flip'), tkinter.BooleanVar()), ('move', _('Move'), tkinter.BooleanVar()), ('nomove', _('No move'), tkinter.BooleanVar()), ('undo', _('Undo'), tkinter.BooleanVar()), ('redo', _('Redo'), tkinter.BooleanVar()), ('autopilotlost', _('Autopilot lost'), tkinter.BooleanVar()), ('autopilotwon', _('Autopilot won'), tkinter.BooleanVar()), ('gamefinished', _('Game finished'), tkinter.BooleanVar()), ('gamelost', _('Game lost'), tkinter.BooleanVar()), ('gamewon', _('Game won'), tkinter.BooleanVar()), ('gameperfect', _('Perfect game'), tkinter.BooleanVar()), ('extra', _('Other'), tkinter.BooleanVar()), ] # frame = ttk.Frame(top_frame) frame.pack(expand=True, fill='both', padx=5, pady=5) frame.columnconfigure(1, weight=1) # row = 0 w = ttk.Checkbutton(frame, variable=self.sound, text=_("Sound enabled")) w.grid(row=row, column=0, columnspan=2, sticky='ew') # if os.name == "nt" and pysolsoundserver: row += 1 w = ttk.Checkbutton(frame, variable=self.sound_mode, text=_("Use DirectX for sound playing"), command=self.mOptSoundDirectX) w.grid(row=row, column=0, columnspan=2, sticky='ew') # if app.audio.CAN_PLAY_MUSIC: # and app.startup_opt.sound_mode > 0: row += 1 ttk.Label(frame, text=_('Sample volume:'), anchor='w').grid(row=row, column=0, sticky='ew') w = PysolScale( frame, from_=0, to=128, resolution=1, orient='horizontal', takefocus=0, length="3i", # label=_('Sample volume'), variable=self.sample_volume) w.grid(row=row, column=1, sticky='w', padx=5) row += 1 w = ttk.Checkbutton(frame, variable=self.music, text=_("Music enabled")) w.grid(row=row, column=0, columnspan=2, sticky='ew') row += 1 ttk.Label(frame, text=_('Music volume:'), anchor='w').grid(row=row, column=0, sticky='ew') w = PysolScale( frame, from_=0, to=128, resolution=1, orient='horizontal', takefocus=0, length="3i", # label=_('Music volume'), variable=self.music_volume) w.grid(row=row, column=1, sticky='w', padx=5) else: # remove "Apply" button kw.strings[1] = None # frame = ttk.LabelFrame(top_frame, text=_('Enable samples')) frame.pack(expand=True, fill='both', padx=5, pady=5) frame.columnconfigure(0, weight=1) frame.columnconfigure(1, weight=1) # row = 0 col = 0 for n, t, v in self.samples: v.set(app.opt.sound_samples[n]) w = ttk.Checkbutton(frame, text=t, variable=v) w.grid(row=row, column=col, sticky='ew', padx=3, pady=1) if col == 1: col = 0 row += 1 else: col = 1 # top_frame.columnconfigure(1, weight=1) # focus = self.createButtons(bottom_frame, kw) self.mainloop(focus, kw.timeout)
def createFrame(self, kw): width = kw.get("width") height = kw.get("height") self.frame = ttk.Frame(self.parent, width=width, height=height)
def __init__(self): self._root = tk.Tk() self._root.title('Loopy Upload Client') #self._root.geometry('500x300') self._root.resizable(width=False, height=False) self._root.grid_columnconfigure(0, weight=1) self._root.grid_rowconfigure(0, weight=1) self._frame = ttk.Frame(self._root) self._frame.columnconfigure(1, weight=1) self._frame.columnconfigure(1, weight=3) self._u_thread = None self._u_error = None self._auth_ok = False self._auth_ok_message = 'Ready' self._progress = 0 def _label_entry(_lbl, _txt, _row, is_password=False, width=None, **gridpos): l = ttk.Label(self._frame, text=_lbl) l.grid(column=0, row=_row, sticky='W', padx=5, pady=5, **gridpos) sv = tk.StringVar() sv.set(_txt or '') sve = ttk.Entry(self._frame, textvariable=sv, show="*" if is_password else None, width=width) sve.grid(column=1, row=_row, padx=5, pady=5, sticky="EW", **gridpos) return sv, sve self._url, self._urle = _label_entry( 'Loopy URL', 'https://app.loopb.io/file-upload', 1) self._api_key, self._api_keye = _label_entry('API Key', '', 2, width=32) self._email, self._emaile = _label_entry('Email (optional)', '', 3) self._c_button = ttk.Button(self._frame, text='Connect', state='enabled') self._c_button.grid(column=1, row=4, sticky='E', padx=5, pady=5) self._c_button.configure(command=self._connect_button_clicked) self._u_button = ttk.Button(self._frame, text='Select & Upload', state='disabled') self._u_button.grid(column=1, row=5, sticky='E', padx=5, pady=5) self._u_button.configure(command=self._upload_button_clicked) self._result_label = ttk.Label(self._frame) self._result_label.grid(row=6, columnspan=3, padx=5, pady=5) self._frame.grid(padx=10, pady=10, sticky='NSEW')
def __init__(self, parent, title, app, gameid, bookmark=None, **kw): 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) # self.app = app self.gameid = gameid self.bookmark = bookmark self.random = None if self.TreeDataHolder_Class.data is None: self.TreeDataHolder_Class.data = self.TreeData_Class(app) # self.top.wm_minsize(400, 200) sw = self.top.winfo_screenwidth() sh = self.top.winfo_screenheight() h = sh * .8 w1, w2 = min(250, sw / 4), max(sw / 2 + ((sw / 4) - 250), sw / 2) # print sw, w1, w2 w2 = max(200, min(w2, 10 + 12 * (app.subsampled_images.CARDW + 10))) # print sw, w1, w2 # padx, pady = kw.padx, kw.pady # padx, pady = kw.padx/2, kw.pady/2 padx, pady = 4, 4 # PanedWindow paned_window = ttk.PanedWindow(top_frame, orient='horizontal') paned_window.pack(expand=True, fill='both', padx=8, pady=8) left_frame = ttk.Frame(paned_window) right_frame = ttk.Frame(paned_window) paned_window.add(left_frame) paned_window.add(right_frame) # Tree font = app.getFont("default") self.tree = self.Tree_Class(self, left_frame, key=gameid, default=kw.default, font=font, width=w1, height=h) self.tree.frame.pack(padx=padx, pady=pady, expand=True, fill='both') # LabelFrame info_frame = ttk.LabelFrame(right_frame, text=_('About game')) info_frame.grid(row=0, column=0, padx=padx, pady=pady, ipadx=4, ipady=4, sticky='nws') stats_frame = ttk.LabelFrame(right_frame, text=_('Statistics')) stats_frame.grid(row=0, column=1, padx=padx, pady=pady, ipadx=4, ipady=4, sticky='nws') # Info self.info_labels = {} for n, t, f, row in ( ('name', _('Name:'), info_frame, 0), ('altnames', _('Alternate names:'), info_frame, 1), ('category', _('Category:'), info_frame, 2), ('type', _('Type:'), info_frame, 3), ('skill_level', _('Skill level:'), info_frame, 4), ('decks', _('Decks:'), info_frame, 5), ('redeals', _('Redeals:'), info_frame, 6), # ('played', _('Played:'), stats_frame, 0), ('won', _('Won:'), stats_frame, 1), ('lost', _('Lost:'), stats_frame, 2), ('time', _('Playing time:'), stats_frame, 3), ('moves', _('Moves:'), stats_frame, 4), ('percent', _('% won:'), stats_frame, 5), ): title_label = ttk.Label(f, text=t, justify='left', anchor='w') title_label.grid(row=row, column=0, sticky='nw', padx=4) text_label = ttk.Label(f, justify='left', anchor='w') text_label.grid(row=row, column=1, sticky='nw', padx=4) self.info_labels[n] = (title_label, text_label) # info_frame.columnconfigure(1, weight=1) info_frame.rowconfigure(6, weight=1) stats_frame.rowconfigure(6, weight=1) # Canvas self.preview = MfxScrolledCanvas(right_frame, width=w2) self.preview.setTile(app, app.tabletile_index, force=True) self.preview.grid(row=1, column=0, columnspan=3, padx=padx, pady=pady, sticky='nsew') right_frame.columnconfigure(1, weight=1) right_frame.rowconfigure(1, weight=1) # focus = self.createButtons(bottom_frame, kw) # set the scale factor self.preview.canvas.preview = 2 # create a preview of the current game self.preview_key = -1 self.preview_game = None self.preview_app = None self.updatePreview(gameid, animations=0) # focus = self.tree.frame self.mainloop(focus, kw.timeout)
def __init__(self, parent, title, app, **kw): 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 = ttk.Frame(top_frame) frame.pack(expand=True, fill='both', padx=10, pady=10) frame.columnconfigure(0, weight=1) notebook = ttk.Notebook(frame) notebook.pack(expand=True, fill='both') for w in WizardWidgets: if isinstance(w, six.string_types): frame = ttk.Frame(notebook) notebook.add(frame, text=w, sticky='nsew', padding=5) frame.columnconfigure(1, weight=1) row = 0 continue ttk.Label(frame, text=w.label).grid(row=row, column=0) if w.widget == 'preset': if w.variable is None: w.variable = tkinter.StringVar() values = [_(v) for v in w.values] default = _(w.default) values.remove(default) values.sort() values.insert(0, default) def callback(e, w=w): self.presetSelected(e, w) cb = PysolCombo(frame, values=tuple(values), textvariable=w.variable, exportselection=False, selectcommand=callback, state='readonly', width=32) cb.grid(row=row, column=1, sticky='ew', padx=2, pady=2) elif w.widget == 'entry': if w.variable is None: w.variable = tkinter.StringVar() en = ttk.Entry(frame, textvariable=w.variable) en.grid(row=row, column=1, sticky='ew', padx=2, pady=2) elif w.widget == 'menu': if w.variable is None: w.variable = tkinter.StringVar() values = [_(v) for v in w.values] cb = PysolCombo(frame, values=tuple(values), textvariable=w.variable, exportselection=False, state='readonly', width=32) cb.grid(row=row, column=1, sticky='ew', padx=2, pady=2) elif w.widget == 'spin': if w.variable is None: w.variable = tkinter.IntVar() else: # delete all trace callbacks for mod, cbname in w.variable.trace_vinfo(): w.variable.trace_vdelete(mod, cbname) from_, to = w.values # s = Spinbox( # frame, textvariable=w.variable, from_=from_, to=to) s = PysolScale(frame, from_=from_, to=to, resolution=1, orient='horizontal', variable=w.variable) s.grid(row=row, column=1, sticky='ew', padx=2, pady=2) elif w.widget == 'check': if w.variable is None: w.variable = tkinter.BooleanVar() ch = ttk.Checkbutton(frame, variable=w.variable, takefocus=False) ch.grid(row=row, column=1, sticky='ew', padx=2, pady=2) if w.current_value is None: v = w.default else: v = w.current_value if w.widget in ('menu', 'preset'): v = _(v) w.variable.set(v) row += 1 focus = self.createButtons(bottom_frame, kw) self.mainloop(focus, kw.timeout)