Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
	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()))
Ejemplo n.º 3
0
Archivo: main.py Proyecto: lileieiei/-
    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(""))
Ejemplo n.º 4
0
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))
Ejemplo n.º 5
0
    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")
Ejemplo n.º 6
0
    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")
Ejemplo n.º 7
0
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))
Ejemplo n.º 8
0
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)
Ejemplo n.º 9
0
    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()))
Ejemplo n.º 10
0
    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)
Ejemplo n.º 11
0
 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" )
Ejemplo n.º 13
0
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()
Ejemplo n.º 14
0
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))
Ejemplo n.º 15
0
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")
Ejemplo n.º 16
0
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')
Ejemplo n.º 17
0
    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")
Ejemplo n.º 18
0
    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()
Ejemplo n.º 20
0
    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)