def tbl_butt(*args): global roots_tbl global fn fn = FEntry.get() roots_tbl = None roots_tbl = Frame(root) tbl = Treeview(roots_tbl, columns =\ ("number", "method", "a", "b", "root",\ "func", "iter", "time", "err"), show = "headings" ) tbl.heading("number", text="№") tbl.column("number", width=50, stretch=False) tbl.heading("method", text="Метод") tbl.column("method", width=60, stretch=False) tbl.heading("a", text="A") tbl.column("a", width=70, stretch=False) tbl.heading("b", text="B") tbl.column("b", width=70, stretch=False) tbl.heading("root", text="x") tbl.column("root", width=80, stretch=False) tbl.heading("func", text="f(x)") tbl.column("func", width=80, stretch=False) tbl.heading("iter", text="Итерации") tbl.column("iter", width=100, stretch=False) tbl.heading("time", text="Время") tbl.column("time", width=80, stretch=False) tbl.heading("err", text="Ошибка") tbl.column("err", width=70, stretch=False) tbl.grid(row=0, column=0) sb = Scrollbar(roots_tbl, orient=VERTICAL) sb.grid(row=0, column=1, sticky=NS, padx=8) tbl.configure(xscrollcommand=sb.set) sb.configure(command=tbl.xview) roots = getSolutions(test_func, \ float(ASpinbox.get()), float(BSpinbox.get()), \ float(HSpinbox.get()), float(ESpinbox.get()), \ int(MaxIterSpinbox.get()), sys.float_info.epsilon) for i in range(2, 2 * len(roots[0]) + 1, 2): tbl.insert("", END, values=\ tuple("{:^7.4g}".format(roots[0][i//2-1][j]) \ if j not in [0, 1, 6, 8] else \ "{:^15}".format(roots[0][i//2-1][j]) if j > 1 else roots[0][i//2-1][j] for j in range(len(roots[0][i//2-1])))) tbl.insert("", END, values=\ tuple("{:^7.4g}".format(roots[1][i//2-1][j]) \ if j not in [0, 1, 6, 8] else \ "{:^15}".format(roots[1][i//2-1][j]) if j > 1 else roots[1][i//2-1][j] for j in range(len(roots[1][i//2-1])))) roots_tbl.grid(row=0, column=1)
def __init__(self,parent): Frame.__init__(self, master=parent) canvas = tkinter.Canvas(self, highlightthickness=0) self.innerFrame = Frame(canvas) myscrollbar = Scrollbar(self, orient="vertical") myscrollbar.configure(command=canvas.yview) def scrollbarSet(top, bottom): # Hides and shows the scroll frame depending on need if float(top) > 0 or float(bottom) < 1: myscrollbar.grid(row=0, column=1, sticky="NS") else: pass myscrollbar.grid_remove() myscrollbar.set(top, bottom) canvas.configure(yscrollcommand = scrollbarSet) configureFunc = lambda _ : canvas.configure(scrollregion=canvas.bbox("all")) frameID = canvas.create_window((0,0), window=self.innerFrame, anchor='nw') self.innerFrame.bind("<Configure>",configureFunc) canvas.grid(row=0, column=0, sticky="NSEW") myscrollbar.grid(row=0, column=1, sticky="NS") self.grid_rowconfigure(0, weight=1) self.grid_columnconfigure(0, weight=0) #canvas.bind("<Configure>", lambda e : canvas.itemconfig(frameID, width=e.width)) canvas.bind("<Configure>", lambda e : canvas.configure(width=self.innerFrame.winfo_width()))
def create_canvas(self): canvas=Canvas(self,scrollregion=(-1520,-22200,1520,22200),bg='white') #创建canvas canvas.pack(side=LEFT, fill=BOTH, ipadx=2, ipady=2, expand=1) # 放置canvas的位置 frame_send=Frame(canvas,background='yellow') frame_send.pack(side=TOP,fill=NONE,expand=0) frame_res=Frame(canvas,background='green') #把frame放在canvas里 frame_res.pack(side=TOP, fill=NONE, expand=NO) #frame的长宽,和canvas差不多的 vbar=Scrollbar(canvas,orient=VERTICAL) #竖直滚动条 vbar.pack(side=RIGHT, fill=Y, ipadx=2, ipady=2, expand=0) vbar.configure(command=canvas.yview) hbar=Scrollbar(canvas,orient=HORIZONTAL)#水平滚动条 hbar.pack(side=BOTTOM, fill=X, ipadx=2, ipady=2, expand=0) hbar.configure(command=canvas.xview) canvas.config(xscrollcommand=hbar.set,yscrollcommand=vbar.set) #设置 canvas.create_window((120,240), window=frame_res) #create_window self.create_frame_send(frame_send,frame_res) self.after(1000,print(""))
class ScrolledFrame(Frame): def __init__(self, master=None, **kw): self.frame = Frame(master) self.vbar = Scrollbar(self.frame) self.vbar.pack(side='right', fill='y') self.canvas = Canvas(self.frame, yscrollcommand=self.vbar.set, borderwidth=0, relief='flat', highlightthickness=0, height=400, width=300) super().__init__(self.canvas, **kw) self.canvas.pack(side='left', fill='both') self.vbar.configure(command=self.canvas.yview) self.canvas.create_window((4, 4), window=self, anchor='nw') self.bind( "<Configure>", lambda e: self.canvas.config(scrollregion=self.canvas.bbox("all"))) frame_meths = vars(Frame).keys() methods = vars(Pack).keys() | vars(Grid).keys() | vars(Place).keys() methods = methods.difference(frame_meths) for m in methods: if m[0] != '_' and m != 'config' and m != 'configure': setattr(self, m, getattr(self.frame, m))
def _addNeueMahlzeitFrame(self): self.fr_neue_mz = Frame(self.fr_mahlzeit) self.fr_neue_mz.grid_rowconfigure(2, weight=1) self.fr_neue_mz.grid(row=0, column=1, sticky="WSNE") lbl_name = Label(self.fr_neue_mz, text="Name:") lbl_name.grid(row=0, column=0, sticky="NW") self.en_name = Entry(self.fr_neue_mz) self.en_name.grid(row=0, column=1, columnspan=2, sticky="WNE") lbl_zutat = Label(self.fr_neue_mz, text="Zutaten:") lbl_zutat.grid(row=1, column=0, sticky="NW") self.lb_zutat = Listbox(self.fr_neue_mz) sb_zutat = Scrollbar(self.lb_zutat, orient=VERTICAL) self.lb_zutat.configure(yscrollcommand=sb_zutat.set) sb_zutat.configure(command=self.lb_zutat.yview) sb_zutat.pack(side="right", fill="both") self.lb_zutat.grid(row=2, column=0, columnspan=3, sticky="NWSE") self.var_zutat = StringVar(self.fr_neue_mz) self.opt_zutat = OptionMenu(self.fr_neue_mz, self.var_zutat, "Auswahl") self.opt_zutat.grid(row=3, column=0) self.en_menge = Entry(self.fr_neue_mz) self.en_menge.grid(row=3, column=1) self.btn_mahlzeit_hinzu = Button(self.fr_neue_mz, text="Hinzu") self.btn_mahlzeit_hinzu.grid(row=3, column=2, sticky="E")
def _addNeueMahlzeitFrame(self): self.fr_neue_mz = Frame(self.fr_mahlzeit) self.fr_neue_mz.grid_rowconfigure(2, weight=1) self.fr_neue_mz.grid(row=0, column=1, sticky="WSNE") lbl_name = Label(self.fr_neue_mz, text="Name:") lbl_name.grid(row=0, column=0, sticky="NW") self.en_name = Entry(self.fr_neue_mz) self.en_name.grid(row=0, column=1, columnspan=2, sticky="WNE") lbl_zutat = Label(self.fr_neue_mz, text="Zutaten:") lbl_zutat.grid(row=1, column=0, sticky="NW") self.lb_zutat = Listbox(self.fr_neue_mz) sb_zutat = Scrollbar(self.lb_zutat, orient=VERTICAL) self.lb_zutat.configure(yscrollcommand=sb_zutat.set) sb_zutat.configure(command=self.lb_zutat.yview) sb_zutat.pack(side="right", fill="both") self.lb_zutat.grid(row=2, column=0, columnspan=3, sticky="NWSE") self.var_zutat = StringVar(self.fr_neue_mz) self.opt_zutat = OptionMenu(self.fr_neue_mz, self.var_zutat, "Auswahl") self.opt_zutat.grid(row=3, column=0) self.en_menge = Entry(self.fr_neue_mz) self.en_menge.grid(row=3, column=1) self.btn_mahlzeit_hinzu = Button(self.fr_neue_mz, text="Hinzu") self.btn_mahlzeit_hinzu.grid(row=3, column=2, sticky="E")
class ScrolledFrame(Frame): """ A scrolling frame inside a canvas. Based on tkinter.scrolledtext.ScrolledText """ def __init__(self, master: Widget ,**kwargs): self.container = Frame(master) self.canvas = Canvas(self.container, relief=None, highlightthickness=0) self.v_scroll = Scrollbar(self.container, orient=VERTICAL) self.h_scroll = Scrollbar(self.container, orient=HORIZONTAL) kwargs.update({'master': self.canvas}) Frame.__init__(self, **kwargs) self.__layout() self.__commands() # Copy geometry methods of self.container without overriding Frame # methods -- hack! text_meths = vars(Listbox).keys() methods = vars(Pack).keys() | vars(Grid).keys() | vars(Place).keys() methods = methods.difference(text_meths) for m in methods: if m[0] != '_' and m != 'config' and m != 'configure': setattr(self, m, getattr(self.container, m)) def __layout(self): self.canvas.grid(column=0, row=0, sticky=NW+SE) self.v_scroll.grid(column=1, row=0, sticky=N+S+E) self.h_scroll.grid(column=0, row=1, sticky=E+W+S) self.scrolled_frame = self.canvas.create_window((0,0), window=self, anchor=NW) def __commands(self): self.v_scroll.configure(command=self.canvas.yview) self.h_scroll.configure(command=self.canvas.xview) self.canvas.configure(yscrollcommand=self.v_scroll.set) self.canvas.configure(xscrollcommand=self.h_scroll.set) self.container.bind('<Configure>', self._container_configure_handler) self.bind('<Configure>', self._self_configure_handler) def _container_configure_handler(self, event: Event): self.canvas.configure( width=event.width - self.v_scroll.winfo_width(), height=event.height - self.h_scroll.winfo_height() ) def _self_configure_handler(self, *__): self.canvas.configure(scrollregion=self.canvas.bbox(ALL))
class TextWindow(Frame): """ A basic, scrollable text window that can either be editable or not """ def __init__(self, master): """ Make a scrollable, resizeable text """ super().__init__(master) # Add a horizontal and vertical scroller self.hscroller = Scrollbar(self, orient=HORIZONTAL) self.vscroller = Scrollbar(self, orient=VERTICAL) # Make the text box self.text = Text(self, width=90, state=DISABLED, height=15, wrap=NONE, xscrollcommand=self.hscroller.set, yscrollcommand=self.vscroller.set) # Pack everything in there, nice and tight. Let the text expand and the # scroll bars lengthen, but do not let the scroll bars thicken. self.text.grid(column=0, row=0, sticky=N+S+E+W) self.hscroller.grid(column=0, row=1, sticky=N+S+E+W) self.vscroller.grid(column=1, row=0, sticky=N+S+E+W) self.columnconfigure(0, weight=1) self.columnconfigure(1, weight=0) self.rowconfigure(0, weight=1) self.rowconfigure(1, weight=0) # Now make the scroll bars actually work self.hscroller.configure(command=self.text.xview) self.vscroller.configure(command=self.text.yview) def write(self, s): """ Writes 's' to the window, such that it will emulate a file. We have to change the state to ACTIVE in order to add text, but then change it back to the original state afterwards """ self.text.configure(state=NORMAL) self.text.insert(END, s) self.text.configure(state=DISABLED) def clear(self, event=None): """ Clears all text from this window """ self.text.config(state=NORMAL) self.text.delete('0.0', END) self.text.config(state=DISABLED)
def __init__(self, parent): Frame.__init__(self, master=parent) canvas = tkinter.Canvas(self, highlightthickness=0) self.innerFrame = Frame(canvas) myscrollbar = Scrollbar(self, orient="vertical") myscrollbar.configure(command=canvas.yview) def scrollbarSet(top, bottom): # Hides and shows the scroll frame depending on need if float(top) > 0 or float(bottom) < 1: myscrollbar.grid(row=0, column=1, sticky="NS") else: pass myscrollbar.grid_remove() myscrollbar.set(top, bottom) canvas.configure(yscrollcommand=scrollbarSet) configureFunc = lambda _: canvas.configure(scrollregion=canvas.bbox( "all")) frameID = canvas.create_window((0, 0), window=self.innerFrame, anchor='nw') self.innerFrame.bind("<Configure>", configureFunc) canvas.grid(row=0, column=0, sticky="NSEW") myscrollbar.grid(row=0, column=1, sticky="NS") self.grid_rowconfigure(0, weight=1) self.grid_columnconfigure(0, weight=0) #canvas.bind("<Configure>", lambda e : canvas.itemconfig(frameID, width=e.width)) canvas.bind( "<Configure>", lambda e: canvas.configure(width=self.innerFrame.winfo_width()))
def init_ui(self): self._win = tk.Tk() self._win.title("zk-client") self._win.geometry('900x700+500+300') self._win.resizable(height=False, width=False) tree_wrapper = tk.Frame(self._win, bg='red', width=300) tree_wrapper.pack(side=tk.LEFT, fill=tk.Y) canvas = self._tree_canvas = tk.Canvas(tree_wrapper, width=300, height=700, scrollregion=(0, 0, 300, 700), bg='gray') # 创建canvas canvas.place(x=0, y=0) # 放置canvas的位置 frame = tk.Frame(canvas) # 把frame放在canvas里 # frame.place(width=180, height=600) # frame的长宽,和canvas差不多的 vbar = Scrollbar(canvas, orient=tk.VERTICAL) # 竖直滚动条 vbar.place(x=281, width=20, height=700) vbar.configure(command=canvas.yview) hbar = Scrollbar(canvas, orient=tk.HORIZONTAL) # 水平滚动条 hbar.place(x=0, y=680, width=280, height=20) hbar.configure(command=canvas.xview) canvas.config(xscrollcommand=hbar.set, yscrollcommand=vbar.set) # 设置 canvas.bind_all( "<MouseWheel>", lambda event: canvas.yview_scroll( int(-1 * (event.delta / 120)), "units")) self._tree_frame_id = canvas.create_window( 0, 0, window=frame, anchor='nw') # create_window) self._root = Treeview(frame) # self._root.pack(expand=True, fill=tk.BOTH) # self._root.bind("<Button-1>", self.clear_pre_selected) # self._root.bind("<< TreeviewClose>>", self.clear_pre_selected) self._root.bind("<<TreeviewOpen>>", self.open_node)
def _config_scroll(self, scrollbar: ttk.Scrollbar): """Configure a scrollbar to be used""" if scrollbar is not None: print("[ChatWindow] Configuring scrollbar: {}".format(scrollbar)) scrollbar.configure(command=self.yview) self.configure(yscrollcommand=scrollbar.set)
class BibleReferenceBox( Frame, BibleBoxAddon ): """ """ def __init__( self, parentWindow, parentFrame, parentApp, internalBible, referenceObject ): """ """ if BibleOrgSysGlobals.debugFlag: print( exp("BibleReferenceBox.__init__( {}, {}. {}, {}, {} )").format( parentWindow, parentFrame, parentApp, internalBible.getAName(), referenceObject ) ) self.parentWindow, self.parentFrame, self.parentApp, self.referenceObject = parentWindow, parentFrame, parentApp, referenceObject self.internalBible = handleInternalBibles( self.parentApp, internalBible, self ) Frame.__init__( self, parentFrame ) BibleBoxAddon.__init__( self, parentWindow, 'BibleReferenceBox' ) # Set some dummy values required soon #self._contextViewRadioVar, self._formatViewRadioVar, self._groupRadioVar = tk.IntVar(), tk.IntVar(), tk.StringVar() #self._groupCode = BIBLE_GROUP_CODES[0] # Put into first/default BCV group #self._contextViewMode = DEFAULT #self._formatViewMode = DEFAULT self.currentVerseKey = SimpleVerseKey( 'UNK','1','1' ) # Unknown book #if self._contextViewMode == DEFAULT: #self._contextViewMode = 'ByVerse' #self.parentWindow.viewVersesBefore, self.parentWindow.viewVersesAfter = 2, 6 #if self._formatViewMode == DEFAULT: #self._formatViewMode = 'Formatted' # Create a title bar titleBar = Frame( self ) Button( titleBar, text=_('Close'), command=self.doClose ).pack( side=tk.RIGHT ) ## Try to get the title width somewhere near correct (if moduleID is a long path) #adjModuleID = moduleID #self.update() # so we can get the geometry #width = parseWindowSize( self.parentWindow.winfo_geometry() )[0] - 60 # Allow for above button #if len(adjModuleID)*10 > width: # Note: this doesn't adjust if the window size is changed #print( "BRB here1", len(adjModuleID), width, repr(adjModuleID) ) #x = len(adjModuleID)*100/width # not perfect (too small) for narrow windows #adjModuleID = '…' + adjModuleID[int(x):] #print( "BRB here2", len(adjModuleID), x, repr(adjModuleID) ) #titleText = '{} ({})'.format( adjModuleID, boxType.replace( 'BibleReferenceBox', '' ) ) titleText = self.referenceObject.getShortText() self.titleLabel = tk.Label( titleBar, text=titleText ) self.titleLabel.pack( side=tk.TOP, fill=tk.X ) titleBar.pack( side=tk.TOP, fill=tk.X ) # Create a scroll bar to fill the right-hand side of the window self.vScrollbar = Scrollbar( self ) self.vScrollbar.pack( side=tk.RIGHT, fill=tk.Y ) self.textBox = BText( self, height=5, yscrollcommand=self.vScrollbar.set ) self.textBox.configure( wrap='word' ) self.textBox.pack( expand=tk.YES, fill=tk.X ) # Full width self.vScrollbar.configure( command=self.textBox.yview ) # link the scrollbar to the text box self.createStandardBoxKeyboardBindings() self.textBox.bind( '<Button-1>', self.setFocus ) # So disabled text box can still do select and copy functions # Set-up our standard Bible styles for USFMKey, styleDict in self.parentApp.stylesheet.getTKStyles().items(): self.textBox.tag_configure( USFMKey, **styleDict ) # Create the style # Add our extra specialised styles self.textBox.tag_configure( 'contextHeader', background='pink', font='helvetica 6 bold' ) self.textBox.tag_configure( 'context', background='pink', font='helvetica 6' ) self.textBox.tag_configure( 'markersHeader', background='yellow3', font='helvetica 6 bold' ) self.textBox.tag_configure( 'markers', background='yellow3', font='helvetica 6' ) self.pack( expand=tk.YES, fill=tk.BOTH ) # Pack the frame # Set-up our Bible system and our callables self.BibleOrganisationalSystem = BibleOrganizationalSystem( 'GENERIC-KJV-80-ENG' ) # temp self.getNumChapters = self.BibleOrganisationalSystem.getNumChapters self.getNumVerses = lambda BBB,C: MAX_PSEUDOVERSES if C=='-1' or C==-1 \ else self.BibleOrganisationalSystem.getNumVerses( BBB, C ) self.isValidBCVRef = self.BibleOrganisationalSystem.isValidBCVRef self.getFirstBookCode = self.BibleOrganisationalSystem.getFirstBookCode self.getPreviousBookCode = self.BibleOrganisationalSystem.getPreviousBookCode self.getNextBookCode = self.BibleOrganisationalSystem.getNextBookCode self.getBBBFromText = self.BibleOrganisationalSystem.getBBBFromText self.getBookName = self.BibleOrganisationalSystem.getBookName self.getBookList = self.BibleOrganisationalSystem.getBookList self.maxChaptersThisBook, self.maxVersesThisChapter = 150, 150 # temp self.verseCache = OrderedDict() self.updateShownReferences( self.referenceObject ) # end of BibleReferenceBox.__init__ def createStandardBoxKeyboardBindings( self ): """ Create keyboard bindings for this widget. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("BibleReferenceBox.createStandardBoxKeyboardBindings()") ) for name,command in ( ('SelectAll',self.doSelectAll), ('Copy',self.doCopy), ('Find',self.doBoxFind), ('Refind',self.doBoxRefind), #('Info',self.doShowInfo), #('ShowMain',self.doShowMainWindow), ('Close',self.doClose), ): self._createStandardBoxKeyboardBinding( name, command ) # end of BibleReferenceBox.createStandardBoxKeyboardBindings() def xxxgotoBCV( self, BBB, C, V ): """ """ if BibleOrgSysGlobals.debugFlag: print( exp("BibleReferenceBox.gotoBCV( {} {}:{} from {} )").format( BBB, C, V, self.currentVerseKey ) ) # We really need to convert versification systems here adjBBB, adjC, adjV, adjS = self.BibleOrganisationalSystem.convertToReferenceVersification( BBB, C, V ) self.parentWindow.gotoGroupBCV( self._groupCode, adjBBB, adjC, adjV ) # then the App will update me by calling updateShownBCV # end of BibleReferenceBox.gotoBCV def getContextVerseData( self, verseKey ): """ Fetches and returns the internal Bible data for the given reference. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("BibleReferenceBox.getContextVerseData( {} )").format( verseKey ) ) if self.internalBible is not None: try: return self.internalBible.getContextVerseData( verseKey ) except KeyError: # Could be after a verse-bridge ??? if verseKey.getChapterNumber() != '0': logging.error( exp("BibleReferenceBox.getContextVerseData for {} {} got a KeyError") \ .format( self.boxType, verseKey ) ) # end of BibleReferenceBox.getContextVerseData #def XXXgetSwordVerseKey( self, verseKey ): ##if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("getSwordVerseKey( {} )").format( verseKey ) ) #BBB, C, V = verseKey.getBCV() #return self.parentApp.SwordInterface.makeKey( BBB, C, V ) ## end of BibleReferenceBox.getSwordVerseKey def getCachedVerseData( self, verseKey ): """ Checks to see if the requested verse is in our cache, otherwise calls getContextVerseData (from the superclass) to fetch it. The cache keeps the newest or most recently used entries at the end. When it gets too large, it drops the first entry. """ #if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("getCachedVerseData( {} )").format( verseKey ) ) verseKeyHash = verseKey.makeHash() if verseKeyHash in self.verseCache: #if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( " " + exp("Retrieved from BibleReferenceBox cache") ) self.verseCache.move_to_end( verseKeyHash ) #print( " returning", self.verseCache[verseKeyHash][0] ) return self.verseCache[verseKeyHash] verseContextData = self.getContextVerseData( verseKey ) self.verseCache[verseKeyHash] = verseContextData if len(self.verseCache) > MAX_CACHED_VERSES: #print( "Removing oldest cached entry", len(self.verseCache) ) self.verseCache.popitem( last=False ) return verseContextData # end of BibleReferenceBox.getCachedVerseData def updateShownReferences( self, newReferenceObject ): """ Updates self in various ways depending on the contextViewMode held by the enclosing window. The new verse references are in the reference versification system in one of these objects: SimpleVerseKey (accepts 'GEN_1:1' or 'GEN','1','1') SimpleVersesKey (accepts 'MAT_6:1,4') VerseRangeKey (accepts 'JNA_2:1-7') Leaves the textbox in the disabled state. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( "BibleReferenceBox.updateShownReferences( {} ) for {}".format( newReferenceObject, self.internalBible.getAName() ) ) assert isinstance( newReferenceObject, SimpleVerseKey ) or isinstance( newReferenceObject, SimpleVersesKey ) or isinstance( newReferenceObject, VerseRangeKey ) for j, referenceVerse in enumerate( newReferenceObject ): #print( " refVerse", j, referenceVerse ) assert isinstance( referenceVerse, SimpleVerseKey ) refBBB, refC, refV, refS = referenceVerse.getBCVS() BBB, C, V, S = self.BibleOrganisationalSystem.convertFromReferenceVersification( refBBB, refC, refV, refS ) newVerseKey = SimpleVerseKey( BBB, C, V, S ) #print( " newVK", newVerseKey ) # Set firstFlag as False (rather than j==0) so don't get context displayed self.displayAppendVerse( False, newVerseKey, self.getCachedVerseData( newVerseKey ), lastFlag=False ) self.textBox.configure( state=tk.DISABLED ) # Don't allow editing # end of BibleReferenceBox.updateShownReferences def doClose( self, event=None ): """ Called from the GUI. Can be overridden. """ self.closeReferenceBox() # end of BibleReferenceBox.doClose def closeReferenceBox( self ): """ Called to finally and irreversibly remove this box from our list and close it. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("BibleReferenceBox.closeReferenceBox()") ) if self in self.parentWindow.referenceBoxes: self.parentWindow.referenceBoxes.remove( self ) self.destroy() else: # we might not have finished making our box yet if BibleOrgSysGlobals.debugFlag: print( exp("BibleReferenceBox.closeReferenceBox() for {} wasn't in list").format( self.windowType ) ) try: self.destroy() except tk.TclError: pass # never mind if BibleOrgSysGlobals.debugFlag: self.parentApp.setDebugText( "Closed resource box" )
class DbHandler: # def table_builder(self, name): # self.tree.delete(*self.tree.get_children()) # res_dr = self.curs.execute('pragma table_info(' + name + ');').fetchall() # indexes = tuple(map(lambda x: ''.join(['#', str(x)]), # range(len(res_dr)))) # self.tree['columns'] = indexes # for item in res_dr: # self.tree.column(indexes[item[0]], width=150) # self.tree.heading(indexes[item[0]], text=item[1]) # # def drawing_tree(self): # # res = self.curs.execute('''SELECT name FROM sqlite_master # WHERE TYPE = "table"''').fetchall() # table_names = [item[0] for item in res] # # try: # self.table_menu.destroy() # except AttributeError: # pass # else: # self.the_menu.delete(2) # # self.table_menu = Menu(self.the_menu, tearoff=0) # for name in table_names: # self.table_menu.add_command(label=name, # command=lambda: self.table_builder(name)) # self.the_menu.add_cascade(label='Выбор таблицы', menu=self.table_menu) def draw(self, event=None): name = self.list_box.get(self.list_box.curselection()) self.tree.delete(*self.tree.get_children()) res_dr = self.curs.execute('pragma table_info(' + name + ');').fetchall() indexes = tuple(map(lambda x: ''.join(['#', str(x)]), range(len(res_dr)))) self.tree['columns'] = indexes[1:] for item in res_dr: self.tree.column(indexes[item[0]], width=150) self.tree.heading(indexes[item[0]], text=item[1]) self.tree.pack(fill=BOTH, expand=1) def quit_app(self, event=None): try: self.conn.close() except AttributeError: pass finally: ask = messagebox.askyesno('Выход', "Действительно выйти?") if ask: self.root.destroy() return def load_bd(self, event=None): fn = filedialog.Open(self.root, filetypes=[('*.db files', '.db')]).show() if fn == '': return try: self.conn = sq3.connect(fn) self.curs = self.conn.cursor() except: return def save_bd(self, event=None): try: self.conn.commit() except AttributeError: pass def create_db(self, event=None): fn = filedialog.SaveAs(self.root, filetypes=[('*.db files', '.db')]).show() if fn == '': return if not fn.endswith('.db'): fn += '.db' db_creation(fn) self.conn = sq3.connect(fn) self.curs = self.conn.cursor() def set_menu(self): self.the_menu = Menu(self.root) self.file_menu = Menu(self.the_menu, tearoff=0) self.file_menu.add_command(label='Создать', command=self.create_db) self.file_menu.add_command(label='Открыть', command=self.load_bd) self.file_menu.add_command(label='Сохранить', command=self.save_bd) self.file_menu.add_separator() self.file_menu.add_command(label='Выйти', command=self.quit_app) self.the_menu.add_cascade(label='Файл', menu=self.file_menu) self.root.config(menu=self.the_menu) def set_top_frame(self): self.top_frame = Frame(self.root, height=360, bg='gray') self.top_frame.pack(side=TOP, fill=BOTH) self.tree_scroll = Scrollbar(self.top_frame) self.tree_scroll.pack(side=RIGHT, fill=Y) self.tree = Treeview(self.top_frame, yscrollcommand=self.tree_scroll) self.tree_scroll.configure(command=self.tree.yview) self.tree.configure(yscrollcommand=self.tree_scroll.set) self.tree.pack(fill=BOTH, expand=1) self.tree.column('#0', width=798) def set_bot_frame(self): self.bot_frame = Frame(self.root, height=200, bg='yellow') self.bot_frame.pack(side=BOTTOM, fill=BOTH) def list_for_select(self): try: res = self.curs.execute('''SELECT name FROM sqlite_master WHERE TYPE = "table"''').fetchall() except AttributeError: return else: for item in res: self.list_box.insert(END, item[0]) def select_db(self): self.form = Toplevel(self.root) self.form.minsize(400, 400) self.form.title('Выберете БД') self.list_box = Listbox(self.form, selectmode=SINGLE) self.list_box.pack(side=LEFT, fill=BOTH, expand=1) self.list_for_select() btn_exit = Button(self.form, text='Закрыть', command=self.form.destroy) btn_load = Button(self.form, text='Выбрать', command=self.draw) btn_load.pack() btn_exit.pack() self.form.transient(self.root) self.form.grab_set() self.root.wait_window(self.form) def create_terminal(self): ''' Создание дочернего окна ''' pass def __init__(self): self.root = Tk() self.root.title('Blue Mesa') self.set_menu() self.set_top_frame() self.set_bot_frame() # buttons = ManageButtons(self.bot_frame, {'insert': self.not_implemented, # 'update': self.not_implemented, # 'delete': self.not_implemented, # 'select': self.not_implemented, # 'magic': self.create_terminal, # }) buttons = ManageButtons(self.bot_frame, {'select': self.select_db, 'magic': self.create_terminal }) self.root.mainloop()
class PyCube: def __init__(self): self.root = Tk() self.root.title("PyCube") self.session = Session() # init UI self.initMenu() self.leftframe = Frame(self.root) self.leftframe.pack(side=LEFT, fill=BOTH, expand=1) self.rightframe = Frame(self.root) self.rightframe.pack(side=RIGHT, fill=BOTH, expand=1) self.cubesize = 3 scrambler.parse(self.cubesize, 30, False, False) scrambler.scramble() self.scramble = Label(self.leftframe, text=scrambler.scramblestring(0)) self.scramble.pack() self.time_label = Label(self.leftframe, text="0.000") self.time_label.pack() self.plus2_button = Button(self.leftframe, text="+2", command=self.plus2) self.plus2_button.pack() self.dnf_button = Button(self.leftframe, text="DNF", command=self.dnf) self.dnf_button.pack() self.delete_button = Button(self.leftframe, text="Delete", command=self.delete) self.delete_button.pack() self.scramble_img = Label(self.leftframe) self.scramble_img.pack() self.update_image() self.grid = Treeview(self.rightframe) self.grid["columns"] = ("times", "avg5", "avg12", "mean", "sd") self.grid.heading("#0", text='Time', anchor='w') self.grid.column("#0", stretch=NO, width=0, anchor="w") self.grid.heading("times", text="Times") self.grid.column('times', anchor='center', width=70) self.grid.heading("avg5", text="Avg. of 5") self.grid.column('avg5', anchor='center', width=70) self.grid.heading("avg12", text="Avg. of 12") self.grid.column('avg12', anchor='center', width=70) self.grid.heading("mean", text="Session mean") self.grid.column('mean', anchor='center', width=80) self.grid.heading("sd", text="SD") self.grid.column('sd', anchor='center', width=70) self.gridscroll = Scrollbar() self.gridscroll.configure(command=self.grid.yview) self.grid.configure(yscrollcommand=self.gridscroll.set) self.grid.pack(side=TOP) self.root.bind("<KeyRelease-space>", self.start_inspection) self._job = None self.running = False self.root.mainloop() def initMenu(self): menubar = Menu(self.root) self.root.config(menu=menubar) fileMenu = Menu(menubar) fileMenu.add_command(label="New", command=self.session_new) fileMenu.add_separator() fileMenu.add_command(label="Import", command=self.session_import) fileMenu.add_command(label="Export", command=self.session_export) menubar.add_cascade(label="File", menu=fileMenu) def start_timer(self, event=None): if not self.running: self.root.after_cancel(self._job) self._job = None self.t0 = float("%.3f" % time.time()) self.update_timer() self.running = True self.root.bind("<KeyPress-space>", self.reset_timer) def reset_timer(self, event=None): if self.running: self.root.after_cancel(self._job) self._job = None self.running = False self.root.bind("<KeyRelease-space>", self.rebind) t = self.time_label.cget("text") if ":" in str(t): mins, secs = t.split(":") t = (mins * 60) + secs self.session.addtime(t, 0, scrambler.scramblestring(0)) entry = self.session.data[-1][1:] self.grid.insert("", "end", values=(entry)) scrambler.parse(self.cubesize, 30, False, False) scrambler.scramble() scramblestr = scrambler.scramblestring(0) self.scramble.configure(text=scramblestr) self.update_image() def rebind(self, event=None): self.root.bind("<KeyRelease-space>", self.start_inspection) def update_timer(self): now = float("%.3f" % (time.time() - self.t0)) if now > 60: mins = math.floor(now / 60) secs = now - (mins * 60) now = f"{mins}:{secs}" self.time_label.configure(text=now, fg="black") self._job = self.root.after(10, self.update_timer) def start_inspection(self, event=None): self.inspect_time = 16 self.root.bind("<KeyRelease-space>", self.start_timer) self.update_inspection() def update_inspection(self): if self.inspect_time == 0: self.time_label.configure(text="DNF", fg="red") # Really ugly was to add a straight DNF, should fix later # NOTE: Known bug when first time is DNF. MUST FIX self.session.addtime(0, 2, scrambler.scramblestring(0)) entry = self.session.data[-1][1:] self.grid.insert("", "end", values=(entry)) self.dnf() else: self.inspect_time -= 1 self.time_label.configure(text=self.inspect_time, fg="red") self._job = self.root.after(1000, self.update_inspection) def update_image(self): img = ImageTk.PhotoImage(genimage(scrambler.imagestring(0), self.cubesize)) self.scramble_img.configure(image=img) self.scramble_img.image = img def delete(self, event=None): if len(self.session.data) > 0: last = self.session.getlastitemid() self.grid.delete(last) self.session.removetime(last) def plus2(self, event=None): if len(self.session.data) > 0: last = self.session.getlastitemid() index = len(self.session.data) - 1 entry = self.session.data[index] # Check if time isn't already +2 or DNF9 if entry[6] != 0: return entry[1] = float("%.3f" % (entry[1] + 2)) entry[6] = 1 entry = self.session.calcstats() vals = entry[1:] + [scrambler.scramblestring(0)] vals[0] = str(vals[0]) + "(+2)" self.grid.item(last, values=(vals)) def dnf(self, event=None): if len(self.session.data) > 0: last = self.session.getlastitemid() index = len(self.session.data) - 1 entry = self.session.data[index] entry[1] = "DNF" entry[6] = 2 entry = self.session.calcstats() vals = entry[1:] self.grid.item(last, values=(vals)) def session_new(self): self.session.clear() self.grid.delete(*self.grid.get_children()) def session_import(self): f = filedialog.askopenfilename(initialdir="../data/", title="Import session", filetypes=(("Text Documents", "*.txt"), ("All Files", "*.*"))) if f == '': return with open(f) as file: self.session_new() self.session = Session(file.read()) for entry in self.session.data: self.grid.insert("", "end", values=(entry[1:])) def session_export(self): if not os.path.isdir("../data/"): os.makedirs("../data/") name = str(datetime.now())[:-7].replace('-', '').replace(':', '').replace(' ', '') f = filedialog.asksaveasfilename(initialfile=name, initialdir="../data/", defaultextension="*.txt", title="Export session", filetypes=(("Text Documents","*.txt"), ("All Files","*.*"))) if f == '': return with open(f, 'w') as file: file.write(str(self.session))
class BibleReferenceBox(Frame, BibleBox): """ """ def __init__(self, parentWindow, parentFrame, parentApp, internalBible, referenceObject): """ """ if BibleOrgSysGlobals.debugFlag: print( exp("BibleReferenceBox.__init__( {}, {}. {}, {}, {} )").format( parentWindow, parentFrame, parentApp, internalBible.getAName(), referenceObject)) self.parentWindow, self.parentFrame, self.parentApp, self.referenceObject = parentWindow, parentFrame, parentApp, referenceObject self.internalBible = handleInternalBibles(self.parentApp, internalBible, self) Frame.__init__(self, parentFrame) BibleBox.__init__(self, parentApp) # Set some dummy values required soon #self._contextViewRadioVar, self._formatViewRadioVar, self._groupRadioVar = tk.IntVar(), tk.IntVar(), tk.StringVar() #self._groupCode = BIBLE_GROUP_CODES[0] # Put into first/default BCV group #self._contextViewMode = DEFAULT #self._formatViewMode = DEFAULT self.currentVerseKey = SimpleVerseKey('UNK', '1', '1') # Unknown book #if self._contextViewMode == DEFAULT: #self._contextViewMode = 'ByVerse' #self.parentWindow.viewVersesBefore, self.parentWindow.viewVersesAfter = 2, 6 #if self._formatViewMode == DEFAULT: #self._formatViewMode = 'Formatted' # Create a title bar titleBar = Frame(self) Button(titleBar, text=_('Close'), command=self.doClose).pack(side=tk.RIGHT) ## Try to get the title width somewhere near correct (if moduleID is a long path) #adjModuleID = moduleID #self.update() # so we can get the geometry #width = parseWindowSize( self.parentWindow.winfo_geometry() )[0] - 60 # Allow for above button #if len(adjModuleID)*10 > width: # Note: this doesn't adjust if the window size is changed #print( "BRB here1", len(adjModuleID), width, repr(adjModuleID) ) #x = len(adjModuleID)*100/width # not perfect (too small) for narrow windows #adjModuleID = '…' + adjModuleID[int(x):] #print( "BRB here2", len(adjModuleID), x, repr(adjModuleID) ) #titleText = '{} ({})'.format( adjModuleID, boxType.replace( 'BibleReferenceBox', '' ) ) titleText = self.referenceObject.getShortText() self.titleLabel = tk.Label(titleBar, text=titleText) self.titleLabel.pack(side=tk.TOP, fill=tk.X) titleBar.pack(side=tk.TOP, fill=tk.X) # Create a scroll bar to fill the right-hand side of the window self.vScrollbar = Scrollbar(self) self.vScrollbar.pack(side=tk.RIGHT, fill=tk.Y) self.textBox = BText(self, height=5, yscrollcommand=self.vScrollbar.set) self.textBox.configure(wrap='word') self.textBox.pack(expand=tk.YES, fill=tk.X) # Full width self.vScrollbar.configure( command=self.textBox.yview) # link the scrollbar to the text box self.createStandardBoxKeyboardBindings() self.textBox.bind( '<Button-1>', self.setFocus ) # So disabled text box can still do select and copy functions # Set-up our standard Bible styles for USFMKey, styleDict in self.parentApp.stylesheet.getTKStyles( ).items(): self.textBox.tag_configure(USFMKey, **styleDict) # Create the style # Add our extra specialised styles self.textBox.tag_configure('contextHeader', background='pink', font='helvetica 6 bold') self.textBox.tag_configure('context', background='pink', font='helvetica 6') self.textBox.tag_configure('markersHeader', background='yellow3', font='helvetica 6 bold') self.textBox.tag_configure('markers', background='yellow3', font='helvetica 6') self.pack(expand=tk.YES, fill=tk.BOTH) # Pack the frame # Set-up our Bible system and our callables self.BibleOrganisationalSystem = BibleOrganizationalSystem( 'GENERIC-KJV-81-ENG') # temp self.getNumChapters = self.BibleOrganisationalSystem.getNumChapters self.getNumVerses = lambda b,c: MAX_PSEUDOVERSES if c=='0' or c==0 \ else self.BibleOrganisationalSystem.getNumVerses( b, c ) self.isValidBCVRef = self.BibleOrganisationalSystem.isValidBCVRef self.getFirstBookCode = self.BibleOrganisationalSystem.getFirstBookCode self.getPreviousBookCode = self.BibleOrganisationalSystem.getPreviousBookCode self.getNextBookCode = self.BibleOrganisationalSystem.getNextBookCode self.getBBBFromText = self.BibleOrganisationalSystem.getBBBFromText self.getBookName = self.BibleOrganisationalSystem.getBookName self.getBookList = self.BibleOrganisationalSystem.getBookList self.maxChaptersThisBook, self.maxVersesThisChapter = 150, 150 # temp self.verseCache = OrderedDict() self.updateShownReferences(self.referenceObject) # end of BibleReferenceBox.__init__ def createStandardBoxKeyboardBindings(self): """ Create keyboard bindings for this widget. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print(exp("BibleReferenceBox.createStandardBoxKeyboardBindings()")) for name, command in ( ('SelectAll', self.doSelectAll), ('Copy', self.doCopy), ('Find', self.doBoxFind), ('Refind', self.doBoxRefind), #('Info',self.doShowInfo), #('ShowMain',self.doShowMainWindow), ('Close', self.doClose), ): self._createStandardBoxKeyboardBinding(name, command) # end of BibleReferenceBox.createStandardBoxKeyboardBindings() def xxxgotoBCV(self, BBB, C, V): """ """ if BibleOrgSysGlobals.debugFlag: print( exp("BibleReferenceBox.gotoBCV( {} {}:{} from {} )").format( BBB, C, V, self.currentVerseKey)) # We really need to convert versification systems here adjBBB, adjC, adjV, adjS = self.BibleOrganisationalSystem.convertToReferenceVersification( BBB, C, V) self.parentWindow.gotoGroupBCV( self._groupCode, adjBBB, adjC, adjV) # then the App will update me by calling updateShownBCV # end of BibleReferenceBox.gotoBCV def getContextVerseData(self, verseKey): """ Fetches and returns the internal Bible data for the given reference. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("BibleReferenceBox.getContextVerseData( {} )").format( verseKey)) if self.internalBible is not None: try: return self.internalBible.getContextVerseData(verseKey) except KeyError: # Could be after a verse-bridge ??? if verseKey.getChapterNumber() != '0': logging.error( exp("BibleReferenceBox.getContextVerseData for {} {} got a KeyError") \ .format( self.boxType, verseKey ) ) # end of BibleReferenceBox.getContextVerseData #def XXXgetSwordVerseKey( self, verseKey ): ##if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("getSwordVerseKey( {} )").format( verseKey ) ) #BBB, C, V = verseKey.getBCV() #return self.parentApp.SwordInterface.makeKey( BBB, C, V ) ## end of BibleReferenceBox.getSwordVerseKey def getCachedVerseData(self, verseKey): """ Checks to see if the requested verse is in our cache, otherwise calls getContextVerseData (from the superclass) to fetch it. The cache keeps the newest or most recently used entries at the end. When it gets too large, it drops the first entry. """ #if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("getCachedVerseData( {} )").format( verseKey ) ) verseKeyHash = verseKey.makeHash() if verseKeyHash in self.verseCache: #if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( " " + exp("Retrieved from BibleReferenceBox cache") ) self.verseCache.move_to_end(verseKeyHash) #print( " returning", self.verseCache[verseKeyHash][0] ) return self.verseCache[verseKeyHash] verseContextData = self.getContextVerseData(verseKey) self.verseCache[verseKeyHash] = verseContextData if len(self.verseCache) > MAX_CACHED_VERSES: #print( "Removing oldest cached entry", len(self.verseCache) ) self.verseCache.popitem(last=False) return verseContextData # end of BibleReferenceBox.getCachedVerseData def updateShownReferences(self, newReferenceObject): """ Updates self in various ways depending on the contextViewMode held by the enclosing window. The new verse references are in the reference versification system in one of these objects: SimpleVerseKey (accepts 'GEN_1:1' or 'GEN','1','1') SimpleVersesKey (accepts 'MAT_6:1,4') VerseRangeKey (accepts 'JNA_2:1-7') Leaves the textbox in the disabled state. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( "BibleReferenceBox.updateShownReferences( {} ) for {}".format( newReferenceObject, self.internalBible.getAName())) assert isinstance( newReferenceObject, SimpleVerseKey) or isinstance( newReferenceObject, SimpleVersesKey) or isinstance( newReferenceObject, VerseRangeKey) for j, referenceVerse in enumerate(newReferenceObject): #print( " refVerse", j, referenceVerse ) assert isinstance(referenceVerse, SimpleVerseKey) refBBB, refC, refV, refS = referenceVerse.getBCVS() BBB, C, V, S = self.BibleOrganisationalSystem.convertFromReferenceVersification( refBBB, refC, refV, refS) newVerseKey = SimpleVerseKey(BBB, C, V, S) #print( " newVK", newVerseKey ) # Set firstFlag as False (rather than j==0) so don't get context displayed self.displayAppendVerse(False, newVerseKey, self.getCachedVerseData(newVerseKey), lastFlag=False) self.textBox.configure(state=tk.DISABLED) # Don't allow editing # end of BibleReferenceBox.updateShownReferences def doClose(self, event=None): """ Called from the GUI. Can be overridden. """ self.closeReferenceBox() # end of BibleReferenceBox.doClose def closeReferenceBox(self): """ Called to finally and irreversibly remove this box from our list and close it. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print(exp("BibleReferenceBox.closeReferenceBox()")) if self in self.parentWindow.referenceBoxes: self.parentWindow.referenceBoxes.remove(self) self.destroy() else: # we might not have finished making our box yet if BibleOrgSysGlobals.debugFlag: print( exp("BibleReferenceBox.closeReferenceBox() for {} wasn't in list" ).format(self.windowType)) try: self.destroy() except tk.TclError: pass # never mind if BibleOrgSysGlobals.debugFlag: self.parentApp.setDebugText("Closed resource box")
class MainView(Frame): def __init__(self, root, model: Model): super().__init__(root) root.columnconfigure(0, weight=1) root.rowconfigure(0, weight=1) self.model = model self.__init_components() self.grid(sticky='nsew') self.__bind_action_events() def __init_components(self): # Instanciar widgets self.panel_form = Labelframe(self, text='Tarea') self.panel_tasks = Labelframe(self, text='Tareas por hacer') self.panel_complete_tasks = Labelframe(self, text='Tareas completas') self.label_name = Label(self.panel_form, text='Nombre:') self.label_description = Label(self.panel_form, text='Descripción:') self.entry_name = Entry(self.panel_form) self.entry_description = Entry(self.panel_form) self.btn_modify_task = Button(self.panel_form, text='Editar tarea', state=DISABLED, command=self.__modify_task) self.btn_new_task = Button(self.panel_form, text='Nueva tarea', command=self.__new_task) self.btn_delete_task = Button(self.panel_form, text='Eliminar tarea', state=DISABLED, command=self.__delete_task) self.btn_clear_form = Button(self.panel_form, text='Limpiar campos', command=self.__clear_form) self.btn_complete_task = Button(self.panel_form, text='Completar tarea', state=DISABLED, command=self.__complete_task) self.scroll_tasks = Scrollbar(self.panel_tasks, orient=VERTICAL) self.scroll_complete_tasks = Scrollbar(self.panel_complete_tasks, orient=VERTICAL) self.list_tasks = Listbox(self.panel_tasks, selectmode=SINGLE, height=10, width=25, yscrollcommand=self.scroll_tasks.set) self.list_complete_tasks = Listbox( self.panel_complete_tasks, selectmode=SINGLE, height=10, width=25, yscrollcommand=self.scroll_complete_tasks.set) # Posicionar los widgets # Panel de formulario de tareas self.panel_form.pack(fill='both', expand='yes', padx=10, pady=5, ipadx=5, ipady=5) self.panel_form.columnconfigure(0, weight=1) self.panel_form.rowconfigure(0, weight=1) self.label_name.grid(row=0, column=0, padx=5, sticky='w') self.entry_name.grid(row=0, column=1, padx=5, sticky='w') self.label_description.grid(row=1, column=0, padx=5, pady=5, sticky='w') self.entry_description.grid(row=1, column=1, padx=5, pady=10, sticky='w') # Botones self.btn_modify_task.grid(row=2, column=0, ipady=4, sticky='we') self.btn_new_task.grid(row=2, column=1, ipady=4, sticky='we') self.btn_delete_task.grid(row=3, column=0, ipady=4, sticky='we') self.btn_clear_form.grid(row=3, column=1, ipady=4, sticky='we') self.btn_complete_task.grid(row=4, column=0, columnspan=2, ipady=4, sticky='we') config_list = { 'fill': 'both', 'expand': 'yes', 'padx': 10, 'pady': 5, 'ipadx': 5, 'ipady': 5 } # Panel de lista de tareas pendientes self.panel_tasks.pack(config_list) self.panel_tasks.columnconfigure(0, weight=20) self.panel_tasks.columnconfigure(1, weight=1) self.list_tasks.grid(row=0, column=0, sticky='we') self.scroll_tasks.configure(command=self.list_tasks.yview) self.scroll_tasks.grid(row=0, column=1, sticky='ns') # Panel de lista de tareas completas self.panel_complete_tasks.pack(config_list) self.panel_complete_tasks.columnconfigure(0, weight=20) self.panel_complete_tasks.columnconfigure(1, weight=1) self.list_complete_tasks.grid(row=0, column=0, sticky='we') self.scroll_complete_tasks.configure( command=self.list_complete_tasks.yview) self.scroll_complete_tasks.grid(row=0, column=1, sticky='ns') def __bind_action_events(self): # self.btn_new_task.bind('<Button>', self.__new_task) # self.btn_modify_task.bind('<Button>', self.__modify_task) # self.btn_delete_task.bind('<Button>', self.__delete_task) # self.btn_complete_task.bind('<Button>', self.__complete_task) self.list_tasks.bind('<<ListboxSelect>>', self.__select_task) def __new_task(self): log_info('Botón {} pulsado'.format( self.btn_new_task.config('text')[-1])) name_value = self.entry_name.get() description_value = self.entry_description.get() if name_value: self.model.new_task(name_value, description_value) self.update_tables() else: messagebox.showwarning('AVISO', 'Complete el campo de nombre') def __modify_task(self): index = self.__selected_task() name_value = self.entry_name.get() description_value = self.entry_description.get() if index != -1: task = self.model.get_task(self.model.tasks[index].get_id()) complete = self.model.modify_task(task.get_id(), name_value, description_value) if complete: messagebox.showinfo('Aviso', 'Tarea: {} editada'.format(task.name)) self.update_tables() def __delete_task(self): index = self.__selected_task() if index != -1: task = self.model.get_task(self.model.tasks[index].get_id()) self.model.delete_task(task.get_id()) self.update_tables() def __complete_task(self): index = self.__selected_task() if index != -1: task = self.model.get_task(self.model.tasks[index].get_id()) task.close_todo() complete = self.model.modify_task(task.get_id(), task.name, task.description) if complete: messagebox.showinfo('Aviso', 'Tarea: {} completa'.format(task.name)) self.update_tables() def __clear_form(self): self.clear_form() self.__change_state_btn(DISABLED) def __select_task(self, event): self.clear_form() index = self.__selected_task() if index != -1: task = self.model.get_task(self.model.tasks[index].get_id()) self.set_form(task) self.__change_state_btn(NORMAL) def __change_state_btn(self, state: str): self.btn_new_task.config( state=NORMAL if state == DISABLED else DISABLED) self.btn_delete_task.config(state=state) self.btn_modify_task.config(state=state) self.btn_complete_task.config(state=state) def __selected_task(self): try: return self.list_tasks.curselection()[0] except IndexError: self.__change_state_btn(DISABLED) self.list_complete_tasks.activate(-1) return -1 def update_tables(self): log_info('Actualizando tablas') self.list_tasks.delete(0, END) self.list_complete_tasks.delete(0, END) for index in range(len(self.model.tasks)): self.list_tasks.insert(index, self.model.tasks[index].name) for index in range(len(self.model.complete_tasks)): self.list_complete_tasks.insert( index, self.model.complete_tasks[index].name) def clear_form(self): self.entry_name.delete(0, END) self.entry_description.delete(0, END) def set_form(self, task: Task): if task is not None: self.entry_name.insert(0, task.name) self.entry_description.insert(0, task.description) else: log_error('No se encontró la tarea seleccionada')
def __init__(self): ''' Constructor ''' self.root = Tk() self.root.title("DinnerLog") self.root.minsize(800, 600) self.root.grid_columnconfigure(0, weight=1) self.root.grid_rowconfigure(0, weight=1) self.root.grid_rowconfigure(1, weight=3) # Ein Frame für alles, das mit Zutaten zu tun hat self.fr_zutaten = Labelframe(self.root, borderwidth=2, relief=GROOVE, text="Zutaten") self.fr_zutaten.grid_columnconfigure(0, weight=1) self.fr_zutaten.grid_rowconfigure(0, weight=1) self.fr_zutaten.grid(row=0, column=0, sticky="NSWE") self.lb_zutaten = Listbox(self.fr_zutaten) sb_zutaten = Scrollbar(self.lb_zutaten, orient=VERTICAL) self.lb_zutaten.configure(yscrollcommand=sb_zutaten.set) sb_zutaten.config(command=self.lb_zutaten.yview) sb_zutaten.pack(side="right", fill="both") self.lb_zutaten.grid(row=0, column=0, sticky="NSEW") self._addNeueZutatFrame() # Ein Frame in den alles, das mit Mahlzeiten zu tun hat, kommt self.fr_mahlzeit = Labelframe(self.root, borderwidth=2, relief=GROOVE, text="Mahlzeiten") self.fr_mahlzeit.grid_columnconfigure(0, weight=1) self.fr_mahlzeit.grid_rowconfigure(0, weight=1) self.fr_mahlzeit.grid(row=1, column=0, sticky="NSWE") self._addNeueMahlzeitFrame() self.lb_mahlzeiten = Listbox(self.fr_mahlzeit, selectmode=SINGLE) sb_mahlzeiten = Scrollbar(self.lb_mahlzeiten, orient=VERTICAL) sb_mahlzeiten.configure(command=self.lb_mahlzeiten.yview) self.lb_mahlzeiten.configure(yscrollcommand=sb_mahlzeiten.set) sb_mahlzeiten.pack(side="right", fill="both") self.lb_mahlzeiten.grid(row=0, column=0, sticky="NSEW") fr_neu_ok = Frame(self.fr_mahlzeit) fr_neu_ok.grid(row=1, column=0, columnspan=2, sticky="E") self.btn_neu = Button(fr_neu_ok, text="Neu") self.btn_neu.pack(side="left") self.btn_mahlzeit_als_zt = Button(fr_neu_ok, text="Als Zutat") self.btn_mahlzeit_als_zt.pack(anchor=E, side="right") self.btn_insert = Button(fr_neu_ok, text="Hinzufuegen") self.btn_insert.pack(anchor=E, side="right") self.btn_update = Button(fr_neu_ok, text="Update") self.btn_update.pack(anchor=E, side="right") self.btn_delete = Button(fr_neu_ok, text="Loeschen") self.btn_delete.pack(anchor=E, side="right") # Ein Frame der Statistiken darstellt self.fr_stats = Labelframe(self.root, borderwidth=2, relief=GROOVE, text="Statistik") self.fr_stats.grid(row=3, column=0, sticky="NSWE")
def __init__(self): ''' Constructor ''' self.root = Tk() self.root.title("DinnerLog") self.root.minsize(800, 600) self.root.grid_columnconfigure(0, weight=1) self.root.grid_rowconfigure(0, weight=1) self.root.grid_rowconfigure(1, weight=3) # Ein Frame für alles, das mit Zutaten zu tun hat self.fr_zutaten = Labelframe(self.root, borderwidth=2, relief=GROOVE, text="Zutaten") self.fr_zutaten.grid_columnconfigure(0, weight=1) self.fr_zutaten.grid_rowconfigure(0, weight=1) self.fr_zutaten.grid(row=0, column=0, sticky="NSWE") self.lb_zutaten = Listbox(self.fr_zutaten) sb_zutaten = Scrollbar(self.lb_zutaten, orient=VERTICAL) self.lb_zutaten.configure(yscrollcommand=sb_zutaten.set) sb_zutaten.config(command=self.lb_zutaten.yview) sb_zutaten.pack(side="right", fill="both") self.lb_zutaten.grid(row=0, column=0, sticky="NSEW") self._addNeueZutatFrame() # Ein Frame in den alles, das mit Mahlzeiten zu tun hat, kommt self.fr_mahlzeit = Labelframe(self.root, borderwidth=2, relief=GROOVE, text="Mahlzeiten") self.fr_mahlzeit.grid_columnconfigure(0, weight=1) self.fr_mahlzeit.grid_rowconfigure(0, weight=1) self.fr_mahlzeit.grid(row=1, column=0, sticky="NSWE") self._addNeueMahlzeitFrame() self.lb_mahlzeiten = Listbox(self.fr_mahlzeit, selectmode=SINGLE) sb_mahlzeiten = Scrollbar(self.lb_mahlzeiten, orient=VERTICAL) sb_mahlzeiten.configure(command=self.lb_mahlzeiten.yview) self.lb_mahlzeiten.configure(yscrollcommand=sb_mahlzeiten.set) sb_mahlzeiten.pack(side="right", fill="both") self.lb_mahlzeiten.grid(row=0, column=0, sticky="NSEW") fr_neu_ok = Frame(self.fr_mahlzeit) fr_neu_ok.grid(row=1, column=0, columnspan=2, sticky="E") self.btn_neu = Button(fr_neu_ok, text="Neu") self.btn_neu.pack(side="left") self.btn_mahlzeit_als_zt = Button(fr_neu_ok, text="Als Zutat") self.btn_mahlzeit_als_zt.pack(anchor=E, side="right") self.btn_insert = Button(fr_neu_ok, text="Hinzufuegen") self.btn_insert.pack(anchor=E, side="right") self.btn_update = Button(fr_neu_ok, text="Update") self.btn_update.pack(anchor=E, side="right") self.btn_delete = Button(fr_neu_ok, text="Loeschen") self.btn_delete.pack(anchor=E, side="right") # Ein Frame der Statistiken darstellt self.fr_stats = Labelframe(self.root, borderwidth=2, relief=GROOVE, text="Statistik") self.fr_stats.grid(row=3, column=0, sticky="NSWE")
('pressed', 'arrowdown-p'), ('active', 'arrowdown-a'), { "border": 1 }) } # end of theme extract - don't forget to add comma at end when inserting }) style.theme_use('yummy') # 'default' fr1 = Frame(fr, height=250, width=250) fr1.grid(column=0, row=11, sticky='nsew') widg = Scrollbar(fr1, orient="vertical") widg1 = Scrollbar(fr1, orient="horizontal") mylist = Listbox(fr1) for line in range(100): mylist.insert('end', "A really long line. " + str(line) + " Line number ") mylist.grid(column=0, row=0) widg.grid(column=1, row=0, sticky='ns') widg.configure(command=mylist.yview) widg1.grid(column=0, row=1, sticky='ew') widg1.configure(command=mylist.xview) mylist.configure(yscrollcommand=widg.set, xscrollcommand=widg1.set) run_state(fr, widg, widg1) root.mainloop()
def table_button_click(*args): global results_tbl results_tbl = Frame(root) tbl = Treeview(results_tbl, columns =\ ("array", "method", "size_1", "size_2", "size_3"), height = 13, show = "headings" ) tbl.heading("array", text="Array type") tbl.column("array", width=200, stretch=False) tbl.heading("method", text="Method of sorting") tbl.column("method", width=200, stretch=False) tbl.heading("size_1", text="N1 = 10000") tbl.column("size_1", width=150, stretch=False) tbl.heading("size_2", text="N2 = 50000") tbl.column("size_2", width=150, stretch=False) tbl.heading("size_3", text="N3 = 100000") tbl.column("size_3", width=150, stretch=False) methods = [ ("Shell sort", shell_sort),\ ("Shell sort (Hibbard 1963)", shell_sort_hibbart_1963),\ ("Shell sort (Stasevich 1965)", shell_sort_stasevich_1965),\ ("Shell sort (Knuth 1973)", shell_sort_knuth_1973),\ ("Shell sort (Sedgwick 1982)", shell_sort_sedgwick_1982),\ ("Shell sort (Sedgwick 1986)", shell_sort_sedgwick_1986),\ ("Shell sort (Fibonacci)", shell_sort_fib),\ ("Shell sort (Tokuda 1992)", shell_sort_tokuda_1992),\ ("Shell sort (5/11)", shell_sort_5_11),\ ("Shell sort (3 pow)", shell_sort_3_pow),\ ("Shell sort (5 pow)", shell_sort_5_pow),\ ] arrays = [\ get_sorted_arr(10000), \ get_sorted_arr(50000), \ get_sorted_arr(100000)] for method in methods: tbl.insert("", END, values = ["{:^}".format("Sorted (ASC)"), \ format(method[0]), \ "{:^24.6g}".format(\ get_sorting_time(arrays[0], method[1])), \ "{:^24.6g}".format(\ get_sorting_time(arrays[1], method[1])), \ "{:^24.6g}".format(\ get_sorting_time(arrays[2], method[1]))]) arrays = [\ get_random_arr(10000), \ get_random_arr(50000), \ get_random_arr(100000)] for method in methods: tbl.insert("", END, values = ["{:^}".format("Random"), \ format(method[0]), \ "{:^24.6g}".format(\ get_sorting_time(arrays[0], method[1])), \ "{:^24.6g}".format(\ get_sorting_time(arrays[1], method[1])), \ "{:^24.6g}".format(\ get_sorting_time(arrays[2], method[1]))]) arrays = [\ get_reversed_sorted_arr(10000), \ get_reversed_sorted_arr(50000), \ get_reversed_sorted_arr(100000) ] for method in methods: tbl.insert("", END, values = ["{:^}".format("Sorted (DESC)"), \ format(method[0]), \ "{:^24.6g}".format(\ get_sorting_time(arrays[0], method[1])), \ "{:^24.6g}".format(\ get_sorting_time(arrays[1], method[1])), \ "{:^24.6g}".format(\ get_sorting_time(arrays[2], method[1]))]) tbl.grid(row=0, column=0) sb = Scrollbar(results_tbl, orient=VERTICAL) sb.grid(row=0, column=1, sticky=NS, padx=8) tbl.configure(xscrollcommand=sb.set) sb.configure(command=tbl.xview) results_tbl.grid(row=0, column=1)