def save_new_subtopic(self): if self.selected_subtopic.cget('text') != self.new_subtopic_label_text: return self.subtopic_dialog = Toplevel(self.root) self.subtopic_dialog.title('New Note: Subtopic Input Dialog') headlab = LabelH3(self.subtopic_dialog, text='Unique subtopic name for new note:') self.subtopic_input = Entry(self.subtopic_dialog, width=64) self.subtopic_input.focus_set() buttonbox = Frame(self.subtopic_dialog) self.subtopic_dialog.grid_columnconfigure(0, weight=1) new_note_ok = Button(buttonbox, text='Submit Note and Subtitle', command=self.submit_new_note) new_note_cancel = Button(buttonbox, text='Cancel', command=self.close_subtopic_dialog) headlab.grid(column=0, row=0, pady=(24, 0), columnspan=2) self.subtopic_input.grid(column=0, row=1, padx=24, pady=24, columnspan=2) buttonbox.grid(column=1, row=2, sticky='we', padx=24, pady=24) new_note_ok.grid(column=0, row=0, sticky='e', padx=12) new_note_cancel.grid(column=1, row=0, sticky='e', padx=12) self.subtopic_dialog.bind('<Escape>', self.close_subtopic_dialog) self.subtopic_dialog.protocol('WM_DELETE_WINDOW', self.close_subtopic_dialog)
def open_error_message(parent, message, title, buttlab): def close(): error.destroy() error = Toplevel(parent) error.title(title) error.columnconfigure(0, weight=1) error.rowconfigure(0, weight=1) lab = Message(error, text=message, justify='left') lab.grid(column=0, row=0, sticky='news', padx=3, pady=3) button = Button(error, text=buttlab, command=close) button.grid(padx=3, pady=3) button.focus_set() # duplicate_places_with_duplicate_parents = ( # "There are too many levels of identically-named but different places " # "in the database. Use nicknames for all but one of the levels till more " # "code is written to handle this case.\n\n" # "Example: Two places named 'OK Ranch' existed somewhere and both " # "were in places called 'Pickens Township' but these were two " # "different townships. Due to two levels of duplicate nestings, " # "unique nicknames will have to be used for either the ranches " # "or the townships till code is written to handle this kind of duplex " # "duplication in nested places.")
def context_help(self): help = Toplevel() help.title(self.help_title) text = LabelStylable(help, width=75) text.grid(padx=24, pady=24) text.insert('end', self.message) off = Button(help, text='Done', command=help.destroy) off.grid(padx=24, pady=24, sticky='e') config_generic(help) off.focus_set()
def __init__(self, master, command, *args, **kwargs): Frame.__init__(self, master, *args, **kwargs) self.ent = Entry(self, width=36) spacer = Label(self, width=3) ok_butt = Button(self, text='OK', command=command) cancel_butt = Button(self, text='CANCEL', command=self.remove_edit_row) spacer.grid(column=0, row=0) self.ent.grid(column=1, row=0, padx=3, pady=3) ok_butt.grid(column=2, row=0, padx=6, pady=6) cancel_butt.grid(column=3, row=0, padx=6, pady=6)
def reorder_notes(self): ''' ''' if self.toc.size() < 2: return self.order_dlg = Toplevel(self) self.order_dlg.grab_set() self.order_dlg.protocol('WM_DELETE_WINDOW', self.ignore_changes) self.order_dlg.bind('<Return>', self.save_close_reorder_dlg) self.order_dlg.bind('<Escape>', self.ignore_changes) self.order_dlg.grid_columnconfigure(0, weight=1) self.order_dlg.title('Reorder Subtopics') instrux = ('Tab or Ctrl+Tab selects movable subtopic.\n' 'Arrow keys change subtopic order up or down.') top = LabelH3(self.order_dlg, text=instrux, anchor='center') self.labels = Frame(self.order_dlg) e = 0 for subtopic in self.subtopics: lab = LabelMovable(self.labels, text=subtopic, anchor='w') if e == 0: first = lab e += 1 lab.grid(column=0, row=e, padx=3, sticky='ew') first.focus_set() close2 = Button(self.order_dlg, text='OK', command=self.save_close_reorder_dlg) top.grid(column=0, row=0, pady=(24, 0), padx=24, columnspan=2) self.labels.grid(column=0, row=1, columnspan=2, padx=24, pady=24) self.labels.grid_columnconfigure(0, weight=1) close2.grid(column=1, row=2, sticky='se', padx=12, pady=(0, 12)) center_window(self.order_dlg)
def make_widgets(self): if self.parent.winfo_class() == 'Toplevel': gallery_canvas = Canvas( self.parent, bd=0, highlightthickness=0) self.gallery_content = Frame(gallery_canvas) gallery_canvas.grid(row=0, column=0, sticky='nsew') self.parent.grid_columnconfigure(0, weight=1) self.parent.grid_rowconfigure(0, weight=1) else: self.gallery_content = Frame(self.parent) self.gallery_content.grid(column=0, row=0) self.thumb_canvas = Canvas( self.gallery_content, bd=0, highlightthickness=0, bg=formats['bg']) self.thumb_canvas.pack(padx=12, pady=12) self.thumbstrip = Frame(self.thumb_canvas) self.thumbstrip.pack(side='top') self.previous_img = Button(self.gallery_content, text='<<', width=6) self.pic_canvas = Canvas( self.gallery_content, highlightbackground=formats['bg']) self.pic_canvas.bind('<Button-1>', self.focus_clicked) self.pic_canvas.bind('<Button-1>', self.scroll_start, add='+') self.pic_canvas.bind('<B1-Motion>', self.scroll_move) self.img_path = '{}treebard_gps\data\{}\images\{}'.format( root_drive, self.image_dir, self.main_pic) img_big = Image.open(self.img_path) self.tk_img = ImageTk.PhotoImage(img_big) self.pic_canvas.image = self.tk_img z = 0 self.current_pictures = sorted(self.current_pictures) for img in self.current_pictures: pic_col = Frame(self.thumbstrip) pic_col.pack(side='left', expand=1, fill='y') pic_file = img self.img_path = '{}treebard_gps\data\{}\images\{}'.format(root_drive, self.image_dir, pic_file) idx = len(pic_file) bare = pic_file[0:idx-4] thumbsy = Image.open(self.img_path) self.width_strings.append(thumbsy.width) self.height_strings.append(thumbsy.height) thumbsy.thumbnail((185,85)) thumb_path = 'images/{}_tmb.png'.format(bare) # overwrites file by same name if it exists thumbsy.save(thumb_path) small = ImageTk.PhotoImage(file=thumb_path, master=self.thumbstrip) thumb = Label( pic_col, image=small) thumb.pack(expand=1, fill='y') thumb.image = small self.thumb_labels.append(thumb) # lambda used to save value in loop if self.parent.winfo_class() == 'Toplevel': rad = Radiobutton( pic_col, takefocus=0, value=pic_file, command=lambda pic_file=pic_file: self.set_main_pic( pic_file)) rad.pack() if rad['value'] == self.main_pic: rad.select() else: rad = Frame( pic_col, height=24, width=24) rad.pack(expand=1, fill='both') if self.parent.winfo_name() == 'source_tab': pic_file = '{}, {}'.format(self.source, pic_file) create_tooltip(rad, pic_file) z += 1 self.pil_img = img_big self.fit_canvas_to_pic() self.thumb_dict = dict(zip(self.thumb_labels, self.current_pictures)) self.next_img = Button(self.gallery_content, text='>>', width=6) panel = Frame(self.gallery_content) subject = LabelH3(panel, text=self.curr_entity) subject.grid(column=0, row=0, sticky='ew') # labels with selectable multiline text self.caption_lab = MessageCopiable(panel, width=36) self.picfile_lab = MessageCopiable(panel, width=36) self.picsize_lab = MessageCopiable(panel, width=36) edit = Button( panel, text='EDIT', width=8, command=lambda graphics=self.t7: self.go_to_graphics(graphics)) self.previous_img.config(command=self.back) self.next_img.config(command=self.forward) panel.grid_rowconfigure(0, weight=2) panel.grid_rowconfigure(1, weight=1) panel.grid_rowconfigure(4, weight=2) self.caption_lab.grid(column=0, row=1, pady=(12,12), sticky='ew') self.caption_lab.insert(1.0, self.caption_text) self.picfile_lab.grid(column=0, row=2, pady=(12,0), sticky='ew') self.picfile_lab.insert(1.0, self.img_path) self.picsize_lab.grid(column=0, row=3, pady=(0,24), sticky='ew') self.picsize_lab.insert( 1.0, 'width: {}, height: {}'.format( self.pil_img.width, self.pil_img.height)) edit.grid(column=0, row=4) self.caption_lab.set_height() self.picfile_lab.set_height() self.picsize_lab.set_height() self.previous_img.pack(side='left', padx=12) self.pic_canvas.pack(side='left', expand=1, fill='y') self.next_img.pack(side='left', padx=12) panel.pack(side='left', expand=1, fill='y') for thumb in self.thumb_labels: thumb.bind('<Button-1>', self.show_clicked) self.pic_canvas.bind('<Key-Left>', lambda evt: self.back()) self.pic_canvas.bind('<Key-Right>', lambda evt: self.forward()) # add statusbar-tooltips self.visited = ( (self.thumbstrip, "Thumbnail Views", "Click thumbnail to display. Hover below to see " "file name. If radio, click to make main image."), (self.pic_canvas, "Image", "Arrow keys change image when it's in focus."), (self.previous_img, "Left Button", "Click with mouse or when highlighted click with spacebar."), (self.next_img, "Right Button", "Click with mouse or when highlighted click with spacebar.")) if self.parent.winfo_class() == 'Toplevel': box = Frame(self.parent) box.grid(column=0, row=1, pady=12) close = Button( box, text='CLOSE', width=8, command=self.cancel_gallery) close.grid() self.parent.protocol('WM_DELETE_WINDOW', self.cancel_gallery) self.thumb_canvas.create_window(0, 0, anchor='nw', window=self.thumbstrip) self.thumb_canvas.config( scrollregion=( 0, 0, self.thumbstrip.winfo_reqwidth(), self.thumbstrip.winfo_reqheight())) self.thumb_canvas.config( width=self.root.maxsize()[0], height=self.thumbstrip.winfo_reqheight()) scroll_width = int(self.thumb_canvas['scrollregion'].split(' ')[2]) if scroll_width >= int(self.thumb_canvas['width']): for child in self.thumbstrip.winfo_children(): for gchild in child.winfo_children(): gchild.bind("<Enter>", self.thumb_start) gchild.bind("<Motion>", self.thumb_move) if self.parent.winfo_class() == 'Toplevel': gallery_canvas.create_window( 0, 0, anchor=tk.NW, window=self.gallery_content) self.resize_scrollbar() self.resize_window() self.config_labels()
class PersonAdd(Frame): def __init__(self, parent, autofill, root, *args, **kwargs): Frame.__init__(self, parent, *args, **kwargs) self.parent = parent self.root = root self.autofill = autofill self.config(padx=24, pady=24) self.gender = 'unknown' self.new_person_id = None self.role_person_edited = False self.findings_roles_id = None self.rc_menu = RightClickMenu(self.root) self.make_widgets() def make_widgets(self): all_pics = self.get_all_pics() lab1 = Label(self, text='Gender:') self.gender_input = ClearableReadonlyCombobox(self, values=GENDER_TYPES) lab2 = Label(self, text='Main Image:') self.image_input = ClickAnywhereCombo(self, values=all_pics) lab3 = Label(self, text='Name Type:') self.name_type_input = ClearableReadonlyCombobox(self, values=self.get_name_types()) lab4 = Label(self, text='Full Name') self.name_input = Entry(self, width=65) self.how = LabelH3( self, text='Alphabetize name: after clicking auto-sort, tab into ' 'auto-filled name fields to modify\nsort order with ' 'arrow keys or if sort order is correct, just click ADD.') autosort = Button( self, text='AUTOSORT', command=self.show_sort_order) self.order_frm = Frame(self) s = 0 for stg in range(20): mov = LabelMovable(self.order_frm) mov.grid(column=s, row=0, padx=3) s += 1 self.buttonbox = Frame(self) self.add_butt = Button(self.buttonbox, text='ADD', width=8) lab1.grid(column=0, row=3) self.gender_input.grid( column=1, row=3, padx=12, pady=12, sticky='e') lab2.grid(column=2, row=3) self.image_input.grid(column=3, row=3, padx=12, pady=12) lab3.grid(column=0, row=4) self.name_type_input.grid( column=1, row=4, padx=12, pady=12, sticky='e') lab4.grid(column=2, row=4) self.name_input.grid(column=3, row=4, padx=12, pady=12) self.how.grid(column=0, row=5, padx=6, pady=6, columnspan=4) autosort.grid(column=0, row=6, padx=6, pady=6) self.order_frm.grid(column=1, row=6, columnspan=4, pady=24) self.buttonbox.grid(column=1, row=7, sticky='e') self.add_butt.grid(column=0, row=0, padx=6, pady=6, sticky='e') self.new_person_statusbar = StatusbarTooltips(self.parent, resizer=False) visited = ( (self.gender_input, "Gender Input", "'Unknown' used if left blank."), (self.image_input, "Image Input", "Use an old photo of person's home town if no photo available."), (self.name_type_input, "Name Type Input", "Choose the name type."), (self.name_input, "Name Input", "Autofills but you can change it."), (autosort, "Autosort Button", "Click to auto-create a sortable name."), (self.order_frm, "", "Tab to focus name element. Arrow to change order.") ) run_statusbar_tooltips( visited, self.new_person_statusbar.status_label, self.new_person_statusbar.tooltip_label) self.preset() rcm_widgets = (self.name_input, self.name_type_input) make_rc_menus( rcm_widgets, self.rc_menu, person_add_msg) def preset(self): self.gender_input.config(state='normal') self.gender_input.delete(0, 'end') self.gender_input.config(state='readonly') self.image_input.delete(0, 'end') self.image_input.insert(0, 'no_photo_001.gif') self.name_type_input.config(state='normal') self.name_type_input.delete(0, 'end') self.name_type_input.insert(0, 'birth name') self.name_type_input.config(state='readonly') def reset(self): self.preset() self.name_input.delete(0, 'end') for child in self.order_frm.winfo_children(): child['text'] = '' self.dupe_check = True def add_person(self, findings_roles_id=None): self.get_entered_values() self.findings_roles_id = findings_roles_id self.check_for_dupes() def get_entered_values(self): ''' ''' if len(self.gender_input.get()) != 0: self.gender = self.gender_input.get() self.full_name = self.name_input.get() self.selected_image = self.image_input.get() self.name_type = self.name_type_input.get() def check_for_dupes(self): ''' If birth name already exists in database, open dialog. ''' conn = sqlite3.connect(current_file) cur = conn.cursor() cur.execute(select_all_person_ids) all_people = cur.fetchall() cur.close() conn.close() all_people = [[i[0]] for i in all_people] names_only = [] for id in all_people: display_name = get_name_with_id(id[0]) names_only.append(display_name) id.insert(0, display_name) people_vals = [] for lst in all_people: if not lst[0]: lst[0] = '' people_vals.append(' #'.join([lst[0], str(lst[1])])) if self.full_name not in names_only: self.make_new_person() self.make_sort_order() self.save_new_name(self.new_person_id) self.reset() else: self.dupe_check = msg.YesNoMessage( self, title='Duplicate Check', message="This birth name already exists. To create a " "new person by the same name, click SUBMIT. The " "two persons can be merged later if desired.", show_input=self.full_name).show() if self.dupe_check is True: self.make_new_person() self.make_sort_order() self.save_new_name(self.new_person_id) self.reset() else: self.reset() def make_new_person(self): conn = sqlite3.connect(current_file) conn.execute('PRAGMA foreign_keys = 1') cur = conn.cursor() cur.execute(insert_person_null, (self.gender,)) conn.commit() cur.execute("SELECT seq FROM SQLITE_SEQUENCE WHERE name = 'person' ") new_person_id = cur.fetchone() if new_person_id: self.new_person_id = new_person_id[0] if self.role_person_edited is True: cur.execute( update_findings_roles_person, (self.new_person_id, self.findings_roles_id)) conn.commit() self.role_person_edited = False cur.close() conn.close() def make_sort_order(self): self.order = [] for child in self.order_frm.winfo_children(): text = child['text'] self.order.append(text) self.order = ' '.join(self.order) self.order = self.order.replace(' , ', ', ') self.order = self.order.strip(', ') def save_new_name(self, subject_id): conn = sqlite3.connect(current_file) cur = conn.cursor() conn.execute('PRAGMA foreign_keys = 1') cur.execute(select_image_id, (self.selected_image,)) img_id = cur.fetchone()[0] cur.execute(insert_images_entities, (img_id, subject_id)) conn.commit() cur.execute(select_name_type_id, (self.name_type,)) name_type_id = cur.fetchone() name_type_id = name_type_id[0] cur.execute( insert_name, (subject_id, self.full_name, name_type_id, self.order)) conn.commit() new_list = make_values_list_for_person_select() self.autofill.values = new_list cur.close() conn.close() self.image_input.delete(0, 'end') self.image_input.insert(0, 'no_photo_001.gif') for widg in (self.name_type_input, self.name_input): widg.config(state='normal') widg.delete(0, 'end') self.name_type_input.config(state='readonly') for child in self.order_frm.winfo_children(): child.config(text='') self.gender_input.config(state='normal') self.gender_input.delete(0, 'end') self.gender_input.config(state='readonly') self.gender_input.focus_set() def show_sort_order(self): self.got = self.name_input.get() self.new_name = self.got self.got = self.got.split() if len(self.got) == 0: return else: length = len(self.got)-1 word = self.got[length].lower() self.got.insert(0, ',') length += 1 if word not in NAME_SUFFIXES: self.got.insert(0, self.got.pop()) elif word in NAME_SUFFIXES and self.got[length].lower() == word: self.got.insert(0, self.got.pop()) self.got.insert(0, self.got.pop()) for child in self.order_frm.winfo_children(): child.config(text='') v = 0 for name in self.got: self.order_frm.winfo_children()[v].config(text=name) v += 1 def get_name_types(self): conn = sqlite3.connect(current_file) cur = conn.cursor() cur.execute(select_all_name_types) name_types = cur.fetchall() cur.close() conn.close() name_types = [i[0] for i in name_types] return name_types def get_all_pics(self): conn = sqlite3.connect(current_file) cur = conn.cursor() picvals = cur.fetchall() cur.close() conn.close() return picvals
def make_widgets(self): all_pics = self.get_all_pics() lab1 = Label(self, text='Gender:') self.gender_input = ClearableReadonlyCombobox(self, values=GENDER_TYPES) lab2 = Label(self, text='Main Image:') self.image_input = ClickAnywhereCombo(self, values=all_pics) lab3 = Label(self, text='Name Type:') self.name_type_input = ClearableReadonlyCombobox(self, values=self.get_name_types()) lab4 = Label(self, text='Full Name') self.name_input = Entry(self, width=65) self.how = LabelH3( self, text='Alphabetize name: after clicking auto-sort, tab into ' 'auto-filled name fields to modify\nsort order with ' 'arrow keys or if sort order is correct, just click ADD.') autosort = Button( self, text='AUTOSORT', command=self.show_sort_order) self.order_frm = Frame(self) s = 0 for stg in range(20): mov = LabelMovable(self.order_frm) mov.grid(column=s, row=0, padx=3) s += 1 self.buttonbox = Frame(self) self.add_butt = Button(self.buttonbox, text='ADD', width=8) lab1.grid(column=0, row=3) self.gender_input.grid( column=1, row=3, padx=12, pady=12, sticky='e') lab2.grid(column=2, row=3) self.image_input.grid(column=3, row=3, padx=12, pady=12) lab3.grid(column=0, row=4) self.name_type_input.grid( column=1, row=4, padx=12, pady=12, sticky='e') lab4.grid(column=2, row=4) self.name_input.grid(column=3, row=4, padx=12, pady=12) self.how.grid(column=0, row=5, padx=6, pady=6, columnspan=4) autosort.grid(column=0, row=6, padx=6, pady=6) self.order_frm.grid(column=1, row=6, columnspan=4, pady=24) self.buttonbox.grid(column=1, row=7, sticky='e') self.add_butt.grid(column=0, row=0, padx=6, pady=6, sticky='e') self.new_person_statusbar = StatusbarTooltips(self.parent, resizer=False) visited = ( (self.gender_input, "Gender Input", "'Unknown' used if left blank."), (self.image_input, "Image Input", "Use an old photo of person's home town if no photo available."), (self.name_type_input, "Name Type Input", "Choose the name type."), (self.name_input, "Name Input", "Autofills but you can change it."), (autosort, "Autosort Button", "Click to auto-create a sortable name."), (self.order_frm, "", "Tab to focus name element. Arrow to change order.") ) run_statusbar_tooltips( visited, self.new_person_statusbar.status_label, self.new_person_statusbar.tooltip_label) self.preset() rcm_widgets = (self.name_input, self.name_type_input) make_rc_menus( rcm_widgets, self.rc_menu, person_add_msg)
class MessageModel(Toplevelx): ''' parent: modal dialog has no minimize/maximize buttons, goes where parent goes gparent: parent of parent might need to be destroyed on click of msg button title: goes on title bar of dialog using w.title('title') method prompt: tells the user to enter some data in an entry or combobox message: multiline Message widget text to inform user why dialog opened input: bad input from user displayed in dialog so he sees his typo/bad data x = inst.show(): data input by user into dialog is returned on dialog close ''' def __init__(self, parent, gparent=None, title=None, prompt=None, message=None, input_text=None, *args, **kwargs): Toplevelx.__init__(self, parent, title=None, *args, **kwargs) self.edit_input = False self.add_data_to_db = True self.parent = parent self.gparent = gparent self.prompt = prompt self.message = message self.input_text = input_text if title: self.title(title) self.grab_set() self.transient(parent) self.make_widgets() def make_widgets(self): self.frm = Frame(self) self.frm.grid(column=0, row=0, pady=(0, 18)) self.errlab = Label(self.frm, text='Input was: ') self.errlab.grid(column=0, row=0, padx=24, pady=(24, 0), sticky='w') self.errshow = LabelItalic(self.frm) self.errshow.grid(column=1, row=0, pady=(24, 0), sticky='w') self.errmsg = tk.Message(self.frm, text=self.message, bd=3, relief='raised', aspect=400) self.errmsg.grid(column=0, row=1, padx=36, pady=(0, 18), columnspan=2) self.promptlab = Label(self.frm) self.var = tk.StringVar() self.altentry = Entry(self.frm) self.altentry.config(textvariable=self.var) self.promptlab.grid(column=0, row=2, pady=24, padx=24, sticky='w') self.altentry.grid(column=1, row=2, pady=24, sticky='w') self.promptlab.grid_remove() self.altentry.grid_remove() self.altentry.focus_set() self.altentry.bind('<Return>', self.on_ok) self.bbox = Frame(self) self.bbox.grid(column=0, row=3, columnspan=2) self.done = Button(self.bbox, text='DONE', command=self.on_ok, width=9) self.done.grid(column=0, row=0, padx=24, pady=(12, 24)) self.done.grid_remove() self.stop = Button(self.bbox, text='CANCEL1', command=self.on_cancel, width=9) self.stop.grid(column=1, row=0, padx=24, pady=(12, 24)) self.stop.grid_remove() self.done.focus_set() self.accept = Button(self.bbox, text='Accept Original Input', command=self.on_ok, width=36) self.accept.grid(column=0, row=0, padx=24, pady=12) self.accept.grid_remove() self.edit = Button(self.bbox, text='Submit Edited Input', command=self.on_alt, width=36) self.edit.grid(column=0, row=1, padx=24, pady=12) self.edit.grid_remove() self.cancel_all = Button(self.bbox, text="Cancel (Don't Submit Anything)", command=self.on_cancel, width=36) self.cancel_all.grid(column=0, row=2, padx=24, pady=(12, 36)) self.cancel_all.grid_remove() self.bind('<Escape>', self.on_cancel) PlaySound('SystemHand', SND_ASYNC) self.protocol("WM_DELETE_WINDOW", self.on_cancel) def on_ok(self, event=None): print('original input is OK; input is:', self.input) def on_alt(self, event=None): self.edit_input = True self.destroy() def on_cancel(self, event=None): self.add_data_to_db = False self.destroy()
def cancel(self): self.destroy() if __name__ == "__main__": def open_generic_dialog(): model = MessageModel(root) root = tk.Tk() root.geometry("400x200") root.iconbitmap(default='c:/treebard_gps/favicon.ico') button = Button(root, text="generic dialog", command=open_generic_dialog) label = tk.Label(root, text="", width=20) button.grid() label.grid() label2 = tk.Label(root, text="", width=20) label2.grid() input_text = 'abcdefg' # # SAMPLE INSTANCE ERROR MESSAGE # err = ErrorMessage( # root, # title='About Your Mistake', # message="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras ac arcu quis justo maximus ultrices ac dignissim risus. In vitae facilisis nisl, eu pretium magna. Cras eros lacus, elementum nec odio vitae, dignissim vulputate diam. Pellentesque eget nulla semper, rhoncus leo tristique, hendrerit ligula. ", # input_text=input_text) # SAMPLE INSTANCE YES/NO MESSAGE
class FontPicker(Frame): def __init__(self, master, main, *args, **kwargs): Frame.__init__(self, master, *args, **kwargs) self.master = master self.root = main.root self.canvas = main.canvas self.content = main self.canvas_docs = main.canvas_docs self.content_docs = main.content_docs self.all_fonts = font.families() conn = sqlite3.connect(current_file) cur = conn.cursor() cur.execute(select_font_scheme) font_scheme = cur.fetchall() cur.close() conn.close() self.font_scheme = list(font_scheme[0]) self.make_widgets() def make_widgets(self): def combobox_selected(combo): ''' The reason this function is nested is that I have no experience with overriding methods. When I tried to add `self` as the first parameter, there was an error and I didn't know what to do. I nested it so I wouldn't have to use `self`. ''' if combo == self.combos["select_input_font"]: input_sample.config(font=(self.all_fonts[combo.current], self.fontSize)) elif combo == self.combos["select_output_font"]: output_sample.config(font=(self.all_fonts[combo.current], self.fontSize)) else: print("case not handled") # update_idletasks() seems to speed up the redrawing of the # app with the new font self.update_idletasks() sample_text = ["Sample", "Text ABCDEFGHxyz 0123456789 iIl1 o0O"] self.columnconfigure(0, weight=1) self.rowconfigure(0, weight=1) sample = Frame(self) self.output_sample = Label(sample, text=" Output ".join(sample_text)) self.input_sample = Entry(sample, width=50) self.input_sample.insert(0, " Input ".join(sample_text)) self.fontSizeVar = tk.IntVar() self.fontSize = self.font_scheme[0] self.font_size = Scale( self, from_=8.0, to=26.0, tickinterval=6.0, label="Text Size", # Can this be centered over the Scale? orient="horizontal", length=200, variable=self.fontSizeVar, command=self.show_font_size) self.font_size.set(self.fontSize) combo_names = ["select_output_font", "select_input_font"] self.combos = {} j = 2 for name in combo_names: cbo = Combobox(self, self.root, values=self.all_fonts, height=300, scrollbar_size=12) self.combos[name] = cbo name = name.replace("_", " ").title() lab = Label(self, text=name) lab.grid(column=0, row=j, pady=(24, 6)) cbo.grid(column=0, row=j + 1, pady=(6, 20)) j += 2 self.apply_button = Button(self, text="APPLY", command=self.apply) sample.grid(column=0, row=0) self.output_sample.grid(padx=24, pady=20) self.input_sample.grid(padx=24, pady=20) self.font_size.grid(column=0, row=1, pady=24) self.apply_button.grid(column=0, row=7, sticky="e", padx=(0, 24), pady=(0, 24)) Combobox.combobox_selected = combobox_selected def apply(self): def resize_scrollbar(): self.root.update_idletasks() self.canvas_docs.config(scrollregion=self.canvas_docs.bbox('all')) self.font_scheme[0] = self.fontSizeVar.get() if len(self.combos["select_output_font"].get()) != 0: self.font_scheme[1] = self.combos["select_output_font"].get() if len(self.combos["select_input_font"].get()) != 0: self.font_scheme[2] = self.combos["select_input_font"].get() conn = sqlite3.connect(current_file) conn.execute('PRAGMA foreign_keys = 1') cur = conn.cursor() cur.execute(update_format_fonts, tuple(self.font_scheme)) conn.commit() cur.close() conn.close() config_generic(self.root) resize_scrollbar() def show_font_size(self, evt): self.fontSize = self.fontSizeVar.get()
def make_widgets(self): self.title('{}{} ({})'.format('Notes for Conclusion #', self.finding_id, self.birth_name)) self.grid_columnconfigure(0, weight=1) self.grid_rowconfigure(1, weight=1) header = Frame(self) header.grid_columnconfigure(1, weight=1) header.grid_rowconfigure(0, weight=1) self.notes_dialog_header = Frame(header) content = Frame(self) left_panel = Frame(content) topiclab = Label(left_panel, text='Note Subtopics') self.toc = Listbox(left_panel, self.sorted_subtopics, view_height=424, view_width=180, scrollbar=False) self.new_index = len(self.subtopics) self.toc.insert(self.new_index, self.new_subtopic_label_text) self.toc.focus_set() self.toc.selection_set(0) self.toc.store_new_subtopic_name = self.store_new_subtopic_name self.toc.pass_ctrl_click = self.open_links_dialog self.toc.pass_delete_key = self.delete_note self.selected_subtopic = Label(content, text='New Note') self.note_input = ScrolledText(content) note_submit = Button(content, text='Submit Changes', command=self.save_changes) order = Button(content, text='Change Order of Subtopics', command=self.reorder_notes) radframe = LabelFrame(content, text='Make selected note...') self.public = Radiobutton(radframe, text='...public', anchor='w', variable=self.privacy, value=0, command=self.save_privacy_setting) self.private = Radiobutton(radframe, text='...private', anchor='w', variable=self.privacy, value=1, command=self.save_privacy_setting) close = Button(content, text='DONE', command=self.close_roles_dialog) # notes_statusbar = StatusbarTooltips(self) # visited = ( # (above, # 'this is a notes_statusbar message', # 'this is a tooltip'), # (below, # 'this is also a notes_statusbar message', # 'this is another tooltip')) # run_statusbar_tooltips( # visited, # notes_statusbar.status_label, # notes_statusbar.tooltip_label) # grid in self header.grid(column=0, row=0, columnspan=2, pady=12, sticky='we') content.grid(column=0, row=1, sticky='news', padx=(0, 6)) # notes_statusbar.grid(column=0, row=2, sticky='ew') # grid in header self.notes_dialog_header.grid(column=1, row=0, sticky='ew') self.notes_dialog_header.grid_columnconfigure(0, weight=1) # grid in content left_panel.grid(column=0, row=1, sticky='news', rowspan=2, pady=24) self.selected_subtopic.grid(column=1, row=1, sticky='w') self.note_input.grid(column=1, row=2, columnspan=3, sticky='nsew', padx=(0, 24), pady=12) note_submit.grid(column=3, row=3, sticky='se') self.grid_rowconfigure(0, weight=1) self.grid_columnconfigure(0, weight=1) content.grid_rowconfigure(1, weight=1) order.grid(column=1, row=4) radframe.grid(column=2, row=5, sticky='n', pady=24) close.grid(column=3, row=6, sticky='se', padx=24, pady=(0, 24)) # grid in left_panel topiclab.grid(column=0, row=0) self.toc.grid(column=0, row=1) for child in self.toc.listbox_content.winfo_children(): child.bind('<<ListboxSelected>>', self.switch_note) self.subtopic_widgets = self.toc.listbox_content.winfo_children() # grid in radframe self.public.grid(column=0, row=0, sticky='news', padx=24) self.private.grid(column=0, row=1, sticky='news', padx=24) # rcm_widgets = (self.subtopic_input, self.note_input.text) # make_rc_menus( # rcm_widgets, # self.rc_menu, # note_dlg_msg, # header_parent=self.notes_dialog_header, # header=self.header, # which_dlg='notes') config_generic(self) center_window(self)
def delete_note(self): ''' Since any given note can be re-used more than once by linking it to any number of findings, delete note from note table only if the note_id no longer exists at all in the findings_notes table; not every time a note_id is deleted from the findings_notes table. ''' def ok_delete(): run_delete() cancel_delete() def cancel_delete(): self.focus_set() deleter.destroy() def run_delete(): note_count_per_finding = 0 self.toc.delete(selected) self.note_input.text.delete(1.0, 'end') self.selected_subtopic.config(text='') cur.execute(delete_findings_notes, (deletable, self.finding_id)) conn.commit() if delete_var.get() == 1: cur.execute(select_count_findings_notes_note_id, (deletable, )) linked_notes = cur.fetchone()[0] if linked_notes == 0: cur.execute(delete_note, (deletable, )) conn.commit() cur.execute(select_count_findings_notes_finding_id, (self.finding_id, )) note_count_per_finding = cur.fetchone()[0] cur.close() conn.close() self.toc.selection_clear() if note_count_per_finding == 0: self.pressed.config(text=' ') self.refresh() selected = self.toc.curselection() subtopic = self.toc.get(selected) if subtopic is None: return conn = sqlite3.connect(self.current_file) conn.execute('PRAGMA foreign_keys = 1') cur = conn.cursor() cur.execute(select_note_id, (subtopic, )) deletable = cur.fetchone() if deletable is None: return elif deletable is not None: deletable = deletable[0] delete_var = tk.IntVar() deleter = Toplevel(self) deleter.title('Delete Note Dialog') instrux = LabelH3( deleter, text='Any note can be linked to any number of entities.') radio1 = Radiobutton(deleter, text='Delete this instance of this note.', value=0, variable=delete_var) radio2 = Radiobutton(deleter, text='Delete all instances of this note.', value=1, variable=delete_var) instrux.grid(column=0, row=0, columnspan=2, padx=24, pady=24) radio1.grid(column=0, row=1) radio2.grid(column=1, row=1) buttonbox = Frame(deleter) buttonbox.grid(column=1, row=2, sticky='e') b1 = Button(buttonbox, text='OK', command=ok_delete) b2 = Button(buttonbox, text='Cancel', command=cancel_delete) b1.grid(column=0, row=0) b2.grid(column=1, row=0)
def make_widgets(self): def show_message(): window.columnconfigure(1, weight=1) window.rowconfigure(1, weight=1) lab = MessageHilited(window, text=self.message, justify='left', aspect=500) lab.grid(column=1, row=1, sticky='news', ipady=18) def ok(): if self.do_on_ok: self.do_on_ok() cancel() def cancel(): self.new_places_dialog.destroy() size = (self.parent.winfo_screenwidth(), self.parent.winfo_screenheight()) self.new_places_dialog = Toplevel(self.parent) self.new_places_dialog.geometry("+84+84") self.new_places_dialog.maxsize(width=int(size[0] * 0.85), height=int(size[1] * 0.95)) self.new_places_dialog.columnconfigure(1, weight=1) self.new_places_dialog.rowconfigure(4, weight=1) canvas = Border(self.new_places_dialog, size=3) # don't hard-code size canvas.title_1.config(text=self.title) canvas.title_2.config(text='') window = Frame(canvas) canvas.create_window(0, 0, anchor='nw', window=window) scridth = 16 scridth_n = Frame(window, height=scridth) scridth_w = Frame(window, width=scridth) scridth_n.grid(column=0, row=0, sticky='ew') scridth_w.grid(column=0, row=1, sticky='ns') # DO NOT DELETE THESE LINES, UNCOMMENT IN REAL APP # self.treebard.scroll_mouse.append_to_list([canvas, window]) # self.treebard.scroll_mouse.configure_mousewheel_scrolling() window.vsb = Scrollbar(self.new_places_dialog, hideable=True, command=canvas.yview, width=scridth) window.hsb = Scrollbar(self.new_places_dialog, hideable=True, width=scridth, orient='horizontal', command=canvas.xview) canvas.config(xscrollcommand=window.hsb.set, yscrollcommand=window.vsb.set) window.vsb.grid(column=2, row=4, sticky='ns') window.hsb.grid(column=1, row=5, sticky='ew') buttonbox = Frame(window) b1 = Button(buttonbox, text=self.button_labels[0], width=7, command=ok) b2 = Button(buttonbox, text=self.button_labels[1], width=7, command=cancel) scridth_n.grid(column=0, row=0, sticky='ew') scridth_w.grid(column=0, row=1, sticky='ns') window.columnconfigure(2, weight=1) window.rowconfigure(1, minsize=60) buttonbox.grid(column=1, row=3, sticky='se', pady=6) b1.grid(column=0, row=0) b2.grid(column=1, row=0, padx=(2, 0)) self.frm = Frame(window) self.frm.grid(column=1, row=2, sticky='news', pady=12) show_message() self.show_choices() resize_scrolled_content(self.new_places_dialog, canvas, window) self.new_places_dialog.focus_set()
class Colorizer(Frame): def __init__(self, parent, tabbook, root, *args, **kwargs): Frame.__init__(self, parent, *args, **kwargs) self.parent = parent self.tabbook = tabbook self.root = root self.old_col = 0 self.parent.columnconfigure(0, weight=1) self.parent.rowconfigure(0, weight=1) self.root.bind('<Return>', self.apply_scheme) self.r_col = {} self.make_widgets() def make_widgets(self): stripview = Frame(self.parent) stripview.grid(column=0, row=0, padx=12, pady=12) self.parent.update_idletasks() self.colors_canvas = Canvas( stripview, bd=1, highlightthickness=1, highlightbackground=formats['highlight_bg'], bg=formats['bg'], width=840, height=118 ) hscroll = Scrollbar( stripview, orient='horizontal', command=self.colors_canvas.xview) self.colors_canvas.configure(xscrollcommand=hscroll.set) self.colors_canvas.grid(column=0, row=0, sticky='news') hscroll.grid(column=0, row=1, sticky="ew") self.colors_content = Frame(self.colors_canvas) bbox1 = Frame(self.parent) bbox1.grid(column=0, row=1, padx=12, pady=12, sticky='we') bbox1.columnconfigure(1, weight=1) bbox1.rowconfigure(1, weight=1) self.try_button = Button( bbox1, text='TRY', width=7, command=self.config_local) self.try_button.grid(column=0, row=0, sticky='w') self.copy_button = Button( bbox1, text='COPY', width=7, command=self.copy_scheme) self.copy_button.grid(column=1, row=0) self.apply_button = Button( bbox1, text='APPLY', width=7, command=self.apply_scheme) self.apply_button.grid(column=2, row=0, sticky='e') bottom = Frame(self.parent) bottom.grid(column=0, row=2, padx=12, pady=12) addlab = LabelH3(bottom, text='New Color Scheme') addlab.grid(column=0, row=0, padx=6, pady=6, columnspan=2) self.colors_table = Frame(bottom) self.colors_table.grid(column=0, row=1, columnspan=2) self.colors_table.columnconfigure(0, weight=1) self.colors_table.rowconfigure(0, weight=1) all_schemes = get_color_schemes() self.h1 = Label( self.colors_table, anchor='w', text=' Domain', font=formats['output_font']) self.h2 = Label( self.colors_table, anchor='w', text=' Color') opening_colors = ( formats['bg'], formats['highlight_bg'], formats['head_bg'], formats['fg']) displabel = self.make_colors_table(opening_colors) bbox2 = Frame(bottom) bbox2.grid( column=0, row=2, padx=12, pady=12, sticky='ew', columnspan=2) bbox2.columnconfigure(1, weight=1) bbox2.rowconfigure(0, weight=1) self.new_button = Button( bbox2, text='CREATE NEW COLOR SAMPLE', command=self.make_new_sample) self.new_button.grid(column=0, row=0, padx=6, pady=6, columnspan=2) self.make_samples() self.colors_canvas.create_window( 0, 0, anchor='nw', window=self.colors_content) self.resize_color_samples_scrollbar() def resize_color_samples_scrollbar(self): self.colors_content.update_idletasks() self.colors_canvas.config(scrollregion=self.colors_canvas.bbox("all")) def apply_scheme(self, evt=None): # APPLY button not invoked by RETURN key unless its tab is on top # change index if tab order changes # `self.tabbook.index('current')` is from ttk.Notebook, ignoring it for # now, need to add this method to Toykinter TabBook # if self.tabbook.index('current') == 2: self.recolorize() def recolorize(self): color_scheme = [] for child in self.colors_content.winfo_children(): if self.parent.focus_get() == child: frm = child foc = self.root.focus_get() if foc.master != self.colors_content: return for child in frm.winfo_children(): color_scheme.append(child['bg']) child = child color_scheme.append(child['fg']) color_scheme = tuple(color_scheme) conn = sqlite3.connect(current_file) conn.execute('PRAGMA foreign_keys = 1') cur = conn.cursor() cur.execute(update_format_color_scheme, color_scheme) conn.commit() cur.close() conn.close() mbg = color_scheme[0] hbg = color_scheme[1] thbg = color_scheme[2] fg = color_scheme[3] config_generic(self.root) self.root.config(bg=mbg) def make_samples(self): all_schemes_plus = get_color_schemes_plus() y = 0 for scheme in all_schemes_plus: frm = FrameStay( self.colors_content, name = '{}{}'.format('cs_', str(scheme[5])), bg='lightgray', takefocus=1, bd=1) frm.grid(column=y, row=0) frm.bind('<FocusIn>', self.change_border_color) frm.bind('<FocusOut>', self.unchange_border_color) frm.bind('<Key-Delete>', self.delete_sample) z = 0 for color in scheme[0:3]: lab = LabelStay( frm, width=12, bg=color, text=color, fg=scheme[3]) lab.grid(column=y, row=z, ipadx=6, ipady=6) lab.bind('<Button-1>', self.config_local) z += 1 y += 1 self.resize_color_samples_scrollbar() self.clear_entries() def clear_entries(self): for widg in self.colors_table.winfo_children(): if widg.winfo_class() == 'Entry': widg.delete(0, tk.END) def detect_colors(self, frm): color_scheme = [] if frm.winfo_class() == 'Label': frm = frm.master for child in frm.winfo_children(): color_scheme.append(child['bg']) child = child color_scheme.append(child['fg']) return color_scheme def preview_scheme(self, scheme): trial_widgets = [] all_widgets_in_tab1 = get_all_descends( self.parent, trial_widgets) all_widgets_in_tab1.append(self.parent) for widg in (all_widgets_in_tab1): if (widg.winfo_class() == 'Label' and widg.winfo_subclass() == 'LabelStay'): pass elif (widg in self.colors_table.winfo_children() and widg.grid_info()['row'] == 0): widg.config( bg=scheme[2], fg=scheme[3]) elif (widg.winfo_class() == 'Label' and widg.winfo_subclass() in ('Label', 'LabelH3')): widg.config( bg=scheme[0], fg=scheme[3]) elif widg.winfo_class() == 'Button': widg.config( bg=scheme[1], fg=scheme[3], activebackground=scheme[2]) elif widg.winfo_class() == 'Entry': widg.config(bg=scheme[1]), elif widg in self.colors_content.winfo_children(): widg.config(bg='lightgray') elif widg.winfo_class() in ('Frame', 'Toplevel', 'Canvas'): widg.config(bg=scheme[0]) def config_local(self, evt=None): all_schemes = get_color_schemes() self.clear_entries() # if double-click if evt: if evt.type == '4': evt.widget.master.focus_set() color_scheme = self.detect_colors(evt.widget) self.preview_scheme(color_scheme) # if TRY button else: print("line", looky(seeline()).lineno, "self.colors_content.focus_get().winfo_class():", self.colors_content.focus_get().winfo_class()) for widg in self.colors_table.winfo_children(): # if entries not all filled out if (widg.winfo_class() == 'Entry' and len(widg.get()) == 0): # prob. shd be break or continue pass # if new scheme to try if (widg.winfo_class() == 'Entry' and len(widg.get()) > 0): inputs = [] inputs = tuple(inputs) # if typed scheme is new if inputs not in all_schemes: self.preview_scheme(inputs) # if scheme already exists else: self.clear_entries() # if no sample hilited elif self.colors_content.focus_get().winfo_class() != 'Frame': return elif (widg.winfo_class() == 'Entry' and len(widg.get()) == 0): color_scheme = self.detect_colors( self.parent.focus_get()) self.preview_scheme(color_scheme) def change_border_color(self, evt): evt.widget.config(bg='white', bd=2) def unchange_border_color(self, evt): evt.widget.config(bg='lightgray', bd=1) def make_colors_table(self, colors): def clear_select(evt): evt.widget.selection_clear() l_col = [ 'background 1', 'background 2', 'background 3', 'font color'] self.h1.grid( column=0, row=0, sticky='ew', ipady=3, pady=6) self.h2.grid( column=1, row=0, sticky='ew', ipady=3, pady=6) self.entries_combos = [] j = 1 for name in l_col: lab = Label( self.colors_table, anchor='w', text=name) lab.grid(column=0, row=j, sticky='ew', padx=(6,12), pady=3) ent = Entry(self.colors_table, width=12) self.r_col[name] = ent ent.grid(column=1, row=j, pady=3) self.entries_combos.append(ent) ent.bind('<FocusOut>', clear_select) ent.bind('<Double-Button-1>', self.open_color_chooser) j += 1 def drop_scheme_from_db(self, frame, scheme): id = frame.split('_')[1] conn = sqlite3.connect(current_file) conn.execute('PRAGMA foreign_keys = 1') cur = conn.cursor() cur.execute(delete_color_scheme, (id,)) conn.commit() cur.execute(select_color_scheme_current) current_scheme = cur.fetchone() if scheme == current_scheme: cur.execute(update_color_scheme_null) conn.commit() cur.close() conn.close() def delete_sample(self, evt): dflt = self.colors_content.winfo_children()[0] drop_me = self.colors_content.focus_get() all_schemes_plus = get_color_schemes_plus() color_scheme = tuple(self.detect_colors(drop_me)) all_schemes = [] for scheme_plus in all_schemes_plus: all_schemes.append(scheme_plus[0:4]) if color_scheme in all_schemes: # try set intersection? idx = all_schemes.index(color_scheme) # don't allow built-in color schemes to be deleted # currently all are set as built_in but that could be changed # to allow deletion: update `built_in` column of `formats` # table in db to `0` if all_schemes_plus[idx][4] == 0: drop_name = drop_me.winfo_name() self.drop_scheme_from_db(drop_name, color_scheme) drop_me.destroy() self.resize_color_samples_scrollbar() # reset to default scheme; only current scheme can be deleted dflt.focus_set() fix = [] for child in self.parent.focus_get().winfo_children(): fix.append(child['bg']) child = child fix.append(child['fg']) entries = [] for child in self.colors_table.winfo_children(): if child.winfo_class() == 'Entry': entries.append(child) self.apply_button.invoke() def get_new_scheme(self): all_schemes = get_color_schemes() inputs = [] for widg in self.colors_table.winfo_children(): if widg.winfo_class() == 'Entry': inputs.append(widg.get()) inputs = tuple(inputs) for scheme in all_schemes: if inputs == scheme: return self.put_new_scheme_in_db(inputs) def put_new_scheme_in_db(self, new_scheme): all_schemes = get_color_schemes() if new_scheme not in all_schemes: conn = sqlite3.connect(current_file) conn.execute('PRAGMA foreign_keys = 1') cur = conn.cursor() cur.execute(insert_color_scheme, (new_scheme)) conn.commit() cur.close() conn.close() def make_new_sample(self): # validate colors back = self.r_col['background 1'].get() high = self.r_col['background 2'].get() table = self.r_col['background 3'].get() fonts = self.r_col['font color'].get() try_these = [ (back, self.r_col['background 1']), (high, self.r_col['background 2']), (table, self.r_col['background 3']), (fonts, self.r_col['font color'])] for tup in try_these: if len(tup[0]) == 0: return test_color = Frame(self.root) # don't grid this for tup in try_these: try: test_color.config(bg=tup[0]) except tk.TclError: tup[1].delete(0, tk.END) messagebox.showerror( 'Color Not Recognized.', 'A color was entered that is unknown to the system.') return self.get_new_scheme() for child in self.colors_content.winfo_children(): child.destroy() self.make_samples() def copy_scheme(self): colors = [] if self.root.focus_get().master == self.colors_content: for child in self.root.focus_get().winfo_children(): colors.append(child['bg']) child=child colors.append(child['fg']) color_entries = [] for child in self.colors_table.winfo_children(): if child.grid_info()['row'] == 0: pass elif child.grid_info()['column'] == 1: color_entries.append(child) place_colors = dict(zip(color_entries, colors)) for k,v in place_colors.items(): k.delete(0, 'end') k.insert(0, v) def open_color_chooser(self, evt): chosen_color = colorchooser.askcolor(parent=self.root)[1] if chosen_color: evt.widget.delete(0, 'end') evt.widget.insert(0, chosen_color)