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 = TriggeredcompleteEntry( search_frame, self.config.case_sensitive, textvariable=self.search_entry_var, style="Search.entry") #self.search_entry.set_completion_list(self.taglist) 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) self.notes_list = NotesList(left_frame, self.config.list_font_family, self.config.list_font_size, self.config.background_color) self.notes_list.pack(fill=tk.BOTH, expand=1) right_frame = tk.Frame(paned_window, width=400) paned_window.add(right_frame) note_meta_frame = tk.Frame(right_frame) note_meta_frame.pack(side=tk.BOTTOM, fill=tk.X) pinned_label = tk.Label(note_meta_frame, text="Pinned") pinned_label.pack(side=tk.LEFT) self.pinned_checkbutton_var = tk.IntVar() pinned_checkbutton = tk.Checkbutton( note_meta_frame, variable=self.pinned_checkbutton_var) pinned_checkbutton.pack(side=tk.LEFT) tags_label = tk.Label(note_meta_frame, text="Tags") tags_label.pack(side=tk.LEFT) self.tags_entry_var = tk.StringVar() self.tags_entry = tk.Entry(note_meta_frame, textvariable=self.tags_entry_var) self.tags_entry.pack(side=tk.LEFT, fill=tk.X, expand=1, pady=3, padx=3) # 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, 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 # setup user_text ############################################### self.text_note = create_scrolled_text(right_frame) # 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()
def _create_ui(self): # these two variables determine the final dimensions of our interface #FRAME_HEIGHT=400 TEXT_WIDTH=80 # set the correct class name. this helps your desktop environment # to identify the nvPY window. self.root = tk.Tk(className="nvPY") 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 = TriggeredcompleteEntry(search_frame, self.config.case_sensitive, textvariable=self.search_entry_var, style="Search.entry") #self.search_entry.set_completion_list(self.taglist) self.search_entry_var.trace('w', self.handler_search_entry) cs_label = tk.Label(search_frame,text="CS ") self.cs_checkbutton_var = tk.IntVar() cs_checkbutton = tk.Checkbutton(search_frame, variable=self.cs_checkbutton_var) self.cs_checkbutton_var.trace('w', self.handler_cs_checkbutton) self.search_mode_options = ("gstyle", "regexp") self.search_mode_var = tk.StringVar() # I'm working with ttk.OptionVar, which has that extra default param! self.search_mode_cb = tk.OptionMenu(search_frame, self.search_mode_var, self.search_mode_options[0], *self.search_mode_options) self.search_mode_var.trace('w', self.handler_search_mode) self.search_mode_cb.pack(side=tk.RIGHT, padx=5) cs_checkbutton.pack(side=tk.RIGHT) cs_label.pack(side=tk.RIGHT) 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) self.notes_list = NotesList( left_frame, self.config.list_font_family, self.config.list_font_size, self.config.background_color) self.notes_list.pack(fill=tk.BOTH, expand=1) right_frame = tk.Frame(paned_window, width=400) paned_window.add(right_frame) note_meta_frame = tk.Frame(right_frame) note_meta_frame.pack(side=tk.BOTTOM, fill=tk.X) pinned_label = tk.Label(note_meta_frame,text="Pinned") pinned_label.pack(side=tk.LEFT) self.pinned_checkbutton_var = tk.IntVar() pinned_checkbutton = tk.Checkbutton(note_meta_frame, variable=self.pinned_checkbutton_var) pinned_checkbutton.pack(side=tk.LEFT) tags_label = tk.Label(note_meta_frame, text="Tags") tags_label.pack(side=tk.LEFT) self.tags_entry_var = tk.StringVar() self.tags_entry = tk.Entry(note_meta_frame, textvariable=self.tags_entry_var) self.tags_entry.pack(side=tk.LEFT, fill=tk.X, expand=1, pady=3, padx=3) # 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, 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 # setup user_text ############################################### self.text_note = create_scrolled_text(right_frame) self.fonts = self.notes_list.fonts + self.text_note.fonts # 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()
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) # 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) # 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.Font(family='courier', size=-12) f = tkFont.nametofont('TkFixedFont') # 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) # 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()
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()