def create_scrolled_text(master): yscrollbar = tk.Scrollbar(master) yscrollbar.pack(side=tk.RIGHT, fill=tk.Y) #f = tkFont.nametofont('TkFixedFont') f = tkFont.Font(family=self.config.font_family, size=-self.config.font_size) # tkFont.families(root) returns list of available font family names # this determines the width of the complete interface (yes) text = RedirectedText(master, height=25, width=TEXT_WIDTH, wrap=tk.WORD, font=f, tabs=(4 * f.measure(0), 'left'), tabstyle='wordprocessor', yscrollcommand=yscrollbar.set, undo=True, background=self.config.background_color) # change default font at runtime with: text.config(font=f) text.pack(fill=tk.BOTH, expand=1) #xscrollbar.config(command=text.xview) yscrollbar.config(command=text.yview) return text
def __init__(self, master, font_family, font_size, background_color): tk.Frame.__init__(self, master) yscrollbar = tk.Scrollbar(self) yscrollbar.pack(side=tk.RIGHT, fill=tk.Y) f = tkFont.Font(family=font_family, size=font_size) # tkFont.families(root) returns list of available font family names # this determines the width of the complete interface (yes) # size=-self.config.font_size self.text = tk.Text(self, height=25, width=30, wrap=tk.NONE, font=f, yscrollcommand=yscrollbar.set, undo=True, background=background_color) # change default font at runtime with: #text.config(font=f) self.text.config(cursor="arrow") self.disable_text() self.text.pack(fill=tk.BOTH, expand=1) # tags for all kinds of styling ############################ ############################################################ self.text.tag_config("selected", background="light blue") self.text.tag_config("pinned", foreground="dark gray") # next two lines from: # http://stackoverflow.com/a/9901862/532513 bold_font = tkFont.Font(self.text, self.text.cget("font")) bold_font.configure(weight="bold") self.text.tag_config("title", font=bold_font) italic_font = tkFont.Font(self.text, self.text.cget("font")) italic_font.configure(slant="italic") self.text.tag_config("tags", font=italic_font, foreground="dark gray") self.text.tag_config("found", font=italic_font, foreground="dark gray", background="lightyellow") self.text.tag_config("modifydate", foreground="dark gray") yscrollbar.config(command=self.text.yview) self._bind_events() self.selected_idx = -1 # list containing tuples with each note's title, tags, self.note_headers = []
def _create_ui(self): # these two variables determine the final dimensions of our interface #FRAME_HEIGHT=400 TEXT_WIDTH=80 self.root = tk.Tk() self.root.title("nvPY") #self.root.configure(background="#b2b2b2") # with iconphoto we have to use gif, also on windows icon_fn = 'nvpy.gif' iconpath = os.path.join( self.config.app_dir, 'icons', icon_fn) self.icon = tk.PhotoImage(file=iconpath) self.root.tk.call('wm', 'iconphoto', self.root._w, self.icon) # create menu ################################################### self._create_menu() # separator after menu ########################################## #separator = tk.Frame(self.root, height=2, bd=1, relief=tk.SUNKEN) #separator.pack(fill=tk.X, padx=5, pady=2, side=tk.TOP) # setup statusbar ############################################### # first pack this before panedwindow, else behaviour is unexpected # during sash moving and resizing self.statusbar = StatusBar(self.root) self.statusbar.set_status('%s', 'Welcome to nvPY!') self.statusbar.pack(fill=tk.X, side=tk.BOTTOM) search_frame = tk.Frame(self.root) search_entry.make_style() self.search_entry_var = tk.StringVar() self.search_entry = tk.Entry(search_frame, textvariable=self.search_entry_var, style="Search.entry") self.search_entry_var.trace('w', self.handler_search_entry) self.search_entry.pack(fill=tk.X,padx=5, pady=5) search_frame.pack(side=tk.TOP, fill=tk.X) # the paned window ############################################## paned_window = tk.PanedWindow(self.root, orient=tk.HORIZONTAL) paned_window.pack(fill=tk.BOTH, expand=1) left_frame = tk.Frame(paned_window, width=100) paned_window.add(left_frame) # setup the scrollbar self.sb_notes = tk.Scrollbar(left_frame, orient=tk.VERTICAL) # exportselection=0 means it doesn't automatically export to # x selection. with that active, selecting in the text widget # removes selection in listbox. # thank you http://stackoverflow.com/a/756875 self.lb_notes = tk.Listbox(left_frame, exportselection=0, yscrollcommand=self.sb_notes.set) self.sb_notes.config(command=self.lb_notes.yview) self.sb_notes.pack(side=tk.RIGHT, fill=tk.Y) # need both fill and expand to make it fill all avail area self.lb_notes.pack(fill=tk.BOTH, expand=1) right_frame = tk.Frame(paned_window, width=400) paned_window.add(right_frame) # we'll use this method to create the different edit boxes def create_scrolled_text(master): yscrollbar = tk.Scrollbar(master) yscrollbar.pack(side=tk.RIGHT, fill=tk.Y) #f = tkFont.nametofont('TkFixedFont') f = tkFont.Font(family=self.config.font_family, size=-self.config.font_size) # tkFont.families(root) returns list of available font family names # this determines the width of the complete interface (yes) text = RedirectedText(master, height=25, width=TEXT_WIDTH, wrap=tk.WORD, font=f, tabs=(4 * f.measure(0), 'left'), tabstyle='wordprocessor', yscrollcommand=yscrollbar.set, undo=True) # change default font at runtime with: text.config(font=f) text.pack(fill=tk.BOTH, expand=1) #xscrollbar.config(command=text.xview) yscrollbar.config(command=text.yview) return text # setup user_text ############################################### self.text_note = create_scrolled_text(right_frame) # def cb_ut_fi(event): # self.set_current_text(CURTEXT_USER) # # self.user_text.bind('<FocusIn>', cb_ut_fi) # # def cb_ut_m(event): # self.set_user_mode(MODE_MODIFIED) # # self.user_text.bind('<<Change>>', cb_ut_m) # # # setup sys_text ################################################ # self.sys_text, self._sys_mode_label_var = \ # create_scrolled_text(bottom_frame, "System Environment") # # def cb_st_fi(event): # self.set_current_text(CURTEXT_SYS) # # self.sys_text.bind('<FocusIn>', cb_st_fi) # # def cb_st_c(event): # self.set_sys_mode(MODE_MODIFIED) # # self.sys_text.bind('<<Change>>', cb_st_c) # finish UI creation ########################################### # now set the minsize so that things can not disappear self.root.minsize(self.root.winfo_width(), self.root.winfo_height()) # call update so we know that sizes are up to date self.root.update_idletasks()