Esempio n. 1
0
    def _init_components(self):
        self.columnconfigure(0, weight=1)
        self.rowconfigure(0, weight=1)

        upper_pane = Frame(self)
        upper_pane.columnconfigure(0, weight=1)
        upper_pane.rowconfigure(0, weight=1)

        self.apex_list = ApexList(upper_pane, self._apex)
        self.apex_list.grid(row=0, column=0, sticky='nesw')

        self._scrollbar_x = Scrollbar(upper_pane,
                                      command=self.apex_list.xview,
                                      orient='horizontal')
        self._scrollbar_x.grid(row=1, column=0, sticky='ews')
        self.apex_list['xscrollcommand'] = self._scrollbar_x.set
        self._scrollbar_y = Scrollbar(upper_pane, command=self.apex_list.yview)
        self._scrollbar_y.grid(row=0, column=1, sticky='nse')
        self.apex_list['yscrollcommand'] = self._scrollbar_y.set

        buttons_pane = Frame(self)

        self._expand_button = Button(buttons_pane,
                                     text="Expand all",
                                     command=self.apex_list.expand_all)
        self._expand_button.pack(side='left', expand=True, fill='x')

        self._reset_button = Button(buttons_pane,
                                    text="Reset",
                                    command=self.apex_list.reset)
        self._reset_button.pack()

        upper_pane.grid(sticky='nesw')
        buttons_pane.grid(row=1, sticky='nesw')
Esempio n. 2
0
    def createCanvas( self ):
        "Create and return our scrolling canvas frame."
        f = Frame( self )

        canvas = Canvas( f, width=self.cwidth, height=self.cheight,
                         bg=self.bg )

        # Scroll bars
        xbar = Scrollbar( f, orient='horizontal', command=canvas.xview )
        ybar = Scrollbar( f, orient='vertical', command=canvas.yview )
        canvas.configure( xscrollcommand=xbar.set, yscrollcommand=ybar.set )

        # Resize box
        resize = Label( f, bg='white' )

        # Layout
        canvas.grid( row=0, column=1, sticky='nsew')
        ybar.grid( row=0, column=2, sticky='ns')
        xbar.grid( row=1, column=1, sticky='ew' )
        resize.grid( row=1, column=2, sticky='nsew' )

        # Resize behavior
        f.rowconfigure( 0, weight=1 )
        f.columnconfigure( 1, weight=1 )
        f.grid( row=0, column=0, sticky='nsew' )
        f.bind( '<Configure>', lambda event: self.updateScrollRegion() )

        # Mouse bindings
        canvas.bind( '<ButtonPress-1>', self.clickCanvas )
        canvas.bind( '<B1-Motion>', self.dragCanvas )
        canvas.bind( '<ButtonRelease-1>', self.releaseCanvas )

        return f, canvas
Esempio n. 3
0
class Display(object):
    '''
    classdocs
    '''
    TITLE = 'House Monitor'

    TIME_COLUMN = 0
    NAME_COLUMN = 1
    VALUE_COLUMN = 2

    mainframe = None
    proxy = None

    current_row = 0

    current_values = {}

    def __init__(self, current_values):
        '''
        Constructor
        '''
        self.current_values = current_values
        super(Display, self).__init__()
        self.root = Tk()
        self.root.title(self.TITLE)
#        self.mainframe = Frame(self.root, padding="3 3 12 12")

        self.mainframe = Frame(self.root)
        self.mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
        self.mainframe.columnconfigure(0, weight=1)
        self.mainframe.rowconfigure(0, weight=1)
        print(current_values)

#        self.display_header()

    def display_header(self):
        Tk.Label(self.mainframe, text='Time', width=15, background='lightblue').grid(column=self.TIME_COLUMN, row=self.current_row, sticky=W)
        Tk.Label(self.mainframe, text='Name', width=45, background='lightblue').grid(column=self.NAME_COLUMN, row=self.current_row, sticky=W)
        Tk.Label(self.mainframe, text='Value', width=15, background='lightblue').grid(column=self.VALUE_COLUMN, row=self.current_row, sticky=W)
        self.current_row = self.current_row + 1

    def update(self):
        self.current_row = 1
        for device in self.current_values.keys():
            for port in self.current_values[device].keys():

                arrival_time = self.current_values[device][port]['arrival_time']
                Tk.Label(self.mainframe, text=arrival_time).grid(column=self.TIME_COLUMN, row=self.current_row, sticky=W)

                name = self.current_values[device][port]['name']
                Tk.Label(self.mainframe, text=name).grid(column=self.NAME_COLUMN, row=self.current_row, sticky=W)

                value = self.current_values[device][port]['current_value']
                units = self.current_values[device][port]['units']
                value = '{}{}'.format(value, units)
                Tk.Label(self.mainframe, text=value).grid(column=self.VALUE_COLUMN, row=self.current_row, sticky=W)
                self.current_row = self.current_row + 1

    def run(self):
        self.root.mainloop()
Esempio n. 4
0
    def createCanvas( self ):
        "Create and return our scrolling canvas frame."
        f = Frame( self )

        canvas = Canvas( f, width=self.cwidth, height=self.cheight,
                         bg=self.bg )

        # Scroll bars
        xbar = Scrollbar( f, orient='horizontal', command=canvas.xview )
        ybar = Scrollbar( f, orient='vertical', command=canvas.yview )
        canvas.configure( xscrollcommand=xbar.set, yscrollcommand=ybar.set )

        # Resize box
        resize = Label( f, bg='white' )

        # Layout
        canvas.grid( row=0, column=1, sticky='nsew')
        ybar.grid( row=0, column=2, sticky='ns')
        xbar.grid( row=1, column=1, sticky='ew' )
        resize.grid( row=1, column=2, sticky='nsew' )

        # Resize behavior
        f.rowconfigure( 0, weight=1 )
        f.columnconfigure( 1, weight=1 )
        f.grid( row=0, column=0, sticky='nsew' )
        f.bind( '<Configure>', lambda event: self.updateScrollRegion() )

        # Mouse bindings
        canvas.bind( '<ButtonPress-1>', self.clickCanvas )
        canvas.bind( '<B1-Motion>', self.dragCanvas )
        canvas.bind( '<ButtonRelease-1>', self.releaseCanvas )

        return f, canvas
Esempio n. 5
0
    def _load_gui(self):
        root = Tk()
        root.title("Scraper")
        main_frame = Frame(root)
        main_frame.grid(column=0, row=0, sticky=(N, W, E, S))
        main_frame.columnconfigure(0, weight=1)
        main_frame.rowconfigure(0, weight=1)
        main_frame.pack()
        
        self.scale_red_min = Scale(main_frame, from_=0, to=255, orient=HORIZONTAL, command=self._update_red_min)
        self.scale_red_min.grid(column=1, row=1)
       
        self.scale_red_max = Scale(main_frame, from_=0, to=255, orient=HORIZONTAL, command=self._update_red_max)
        self.scale_red_max.grid(column=2, row=1)
        self.scale_red_max.set(255)
        
        self.scale_green_min = Scale(main_frame, from_=0, to=255, orient=HORIZONTAL, command=self._update_green_min)
        self.scale_green_min.grid(column=1, row=2)

        self.scale_green_max = Scale(main_frame, from_=0, to=255, orient=HORIZONTAL, command=self._update_green_max)
        self.scale_green_max.grid(column=2, row=2)
        self.scale_green_max.set(255)

        self.scale_blue_min = Scale(main_frame, from_=0, to=255, orient=HORIZONTAL, command=self._update_blue_min)
        self.scale_blue_min.grid(column=1, row=3)
        
        self.scale_blue_max = Scale(main_frame, from_=0, to=255, orient=HORIZONTAL, command=self._update_blue_max)
        self.scale_blue_max.grid(column=2, row=3)
        self.scale_blue_max.set(255)
        return root
Esempio n. 6
0
    def _init_components(self):
        self.columnconfigure(0, weight=1)
        self.rowconfigure(0, weight=1)

        upper_pane = Frame(self)
        upper_pane.columnconfigure(0, weight=1)
        upper_pane.rowconfigure(0, weight=1)

        self.apex_list = ApexList(upper_pane, self._apex)
        self.apex_list.grid(row=0, column=0, sticky='nesw')

        self._scrollbar_x = Scrollbar(upper_pane, command=self.apex_list.xview,
            orient='horizontal')
        self._scrollbar_x.grid(row=1, column=0, sticky='ews')
        self.apex_list['xscrollcommand'] = self._scrollbar_x.set
        self._scrollbar_y = Scrollbar(upper_pane, command=self.apex_list.yview)
        self._scrollbar_y.grid(row=0, column=1, sticky='nse')
        self.apex_list['yscrollcommand'] = self._scrollbar_y.set

        buttons_pane = Frame(self)

        self._expand_button = Button(buttons_pane, text="Expand all",
            command=self.apex_list.expand_all)
        self._expand_button.pack(side='left', expand=True, fill='x')

        self._reset_button = Button(buttons_pane, text="Reset",
            command=self.apex_list.reset)
        self._reset_button.pack()

        upper_pane.grid(sticky='nesw')
        buttons_pane.grid(row=1, sticky='nesw')
Esempio n. 7
0
    def interface_visu(self, root):
        """!Création de l'interface de visualisation

        permet de choisir d'afficher les matrices MAC ou les modes avec gmsh
        gère la compatibilité des choix de l'utilisateur (les calculs de MAC
        ne sont pas tous possibles)
        """

        mdo = self.objects

        f = Frame(root, relief='sunken', borderwidth=1)
        Label(f, text="   ").grid(
            row=0, column=1, columnspan=3, sticky='w' + 'e')
        Label(f, text="   ").grid(
            row=2, column=1, columnspan=3, sticky='w' + 'e')
        f.columnconfigure(0, weight=3)
        f.columnconfigure(1, weight=3)

        f1 = Frame(f)
        f1.grid(row=1, column=0, sticky='ew')
        f1.columnconfigure(1, weight=4)
        f1.columnconfigure(2, weight=4)

        bir1 = Checkbutton(f1, variable=self.is_resu1, command=self.cb_changed)
        bir1.grid(row=0, column=0, sticky='e', padx=20)
        bir2 = Checkbutton(f1, variable=self.is_resu2, command=self.cb_changed)
        bir2.grid(row=1, column=0, sticky='e', padx=20)

        Label(f1, text=u"Résultat 1").grid(row=0, column=1, sticky='w')
        self.var_resu1 = StringVar()
        self.menu_resu1 = MyMenu(f1, options=mdo.get_resultats_name(),
                                 var=self.var_resu1, cmd=self.visu1_changed)
        self.menu_resu1.grid(row=0, column=2, sticky='ew', padx=20)

        Label(f1, text=u"Résultat 2").grid(row=1, column=1, sticky='w')
        self.var_resu2 = StringVar()
        self.menu_resu2 = MyMenu(f1, options=mdo.get_resultats_name(),
                                 var=self.var_resu2, cmd=self.visu2_changed)
        self.menu_resu2.grid(row=1, column=2, sticky='ew', padx=20)

        f2 = Frame(f)
        f2.grid(row=1, column=1)

        self.mac_button = Button(
            f2, text="    MAC    ", command=self.view_macs, state='disabled')
        self.mac_button.grid(row=1, column=2, sticky='ew')
        self.phi_button = Button(
            f2, text=u"Déformées", command=self.view_modes, state='disabled')
        self.phi_button.grid(row=2, column=2, sticky='ew')
        self.frf_button = Button(f2, text="    FRF    ", command=self.view_frf)
        self.frf_button.grid(row=3, column=2, sticky='ew')
        self.frf_button = Button(
            f1, text=" Observation ", command=self.view_obs_1)
        self.frf_button.grid(row=0, column=3, sticky='ew')
        self.frf_button = Button(
            f1, text=" Observation ", command=self.view_obs_2)
        self.frf_button.grid(row=1, column=3, sticky='ew')

        return f
Esempio n. 8
0
    def __init__(self, filename, parentnotebook):
        """Create a new EditTab
        
        Argument
        filename -- name and path to the file being edited
        parentnotebook -- the NoteBook in which this tab will be added
        
        """
        Frame.__init__(self)
        self._filename = filename
        self._parentnotebook = parentnotebook
        self._inputs = []
        self.path = os.path.dirname(filename)
        self._dirty = False
        parentnotebook.add(self, state = 'normal')
        self._setLabel()

        #Set up GUI
        self.rowconfigure(0, weight = 1)        
        self.columnconfigure(0, weight = 1)
        
        vscroll = Scrollbar(self, orient = VERTICAL)
        self._vscroll = vscroll
        vscroll.grid(row=0, column=1, sticky=N+S)
        hscroll = Scrollbar(self, orient = HORIZONTAL)
        self._hscroll = hscroll
        hscroll.grid(row=1, column=0, sticky=E+W)

        canvas = Canvas(self, yscrollcommand = vscroll.set, xscrollcommand = hscroll.set)
        self._canvas = canvas
        canvas.grid(row = 0, column = 0, padx = 5, pady = 5, sticky = NSEW)

        vscroll['command'] = canvas.yview
        hscroll['command'] = canvas.xview

        scrollframe = Frame(canvas)
        self._scrollframe = scrollframe
        canvas.create_window(0, 0, window = scrollframe, anchor = N + W)

        scrollframe.rowconfigure(0, weight = 1)        
        scrollframe.columnconfigure(0, weight = 1)
                
        self._mainframe = Frame(scrollframe)
        self._mainframe.grid(row = 0, column = 0, padx = 5, pady = 5, sticky = NSEW)
        
        cf = Frame(scrollframe)
        self._control_frame = cf
        cf.grid(row = 1, column = 0, padx = 5, pady = 5, sticky = E)
        b = Button(cf, text = lang[lng.txtCopyImages], command = self._ehCopyImages)
        self._btnCopy = b
        b.grid(row = 0, column = 0, padx = 5, pady = 5)
        b = Button(cf, text = lang[lng.txtSave], command = self._ehSave, state = DISABLED)
        self._btnSave = b
        b.grid(row = 0, column = 1, padx = 5, pady = 5)
        b = Button(cf, text = lang[lng.txtClose], command = self._ehClose)
        b.grid(row = 0, column = 2, padx = 5, pady = 5)

        parentnotebook.after_idle(self._setCanvas)
Esempio n. 9
0
    def interface_parametres(self, root):
        """!Création de l'interface de choix des logiciels de visualisation
        On permet à l'utilisateur de choisir Gmsh/Xmgrace ou Salome
        """

        main_param = Frame(root)
        main_param.rowconfigure(1, weight=1)
        main_param.columnconfigure(0, weight=1)

        f = Frame(main_param, relief='sunken', borderwidth=1)
        # les parametres vont dans 'f'
        logiciels_frame = Frame(f, borderwidth=4)

        label_parametres_salome = Label(
            logiciels_frame, text=u"Paramètres Salome")
        label_parametres_salome.grid(row=2, column=1, columnspan=2)
        self.salome_widgets.append(label_parametres_salome)

        label_port = Label(logiciels_frame, text=u"Port")
        label_port.grid(row=3, column=1, sticky='w')
        self.salome_widgets.append(label_port)

        entry_salome_port = Entry(
            logiciels_frame, textvariable=self.salome_port)
        entry_salome_port.grid(row=3, column=2)
        self.salome_widgets.append(entry_salome_port)
        self.salome_port.set(self.get_runnig_salome_port())
        self.ce_salome = None

        liste_etudes = StudyList(
            logiciels_frame, self, u"choix de l'étude Salomé")
        liste_etudes.grid(row=4, column=2, sticky='w')
        self.salome_widgets.append(liste_etudes.liste)
        self.salome_widgets.append(liste_etudes.titre)
        liste_etudes.actualiser()

        label_choix_logiciel = Label(
            logiciels_frame, text=u"Choix du logiciel")
        label_choix_logiciel.grid(row=0, column=0, columnspan=3)
        button_gmsh = Radiobutton(
            logiciels_frame, text=u"Gmsh/Xmgrace", value="Gmsh/Xmgrace", variable=self.logiciel,
                                  command=self.desactivate_salome_widgets)
        button_gmsh.grid(row=1, column=0, sticky='w')

        button_salome = Radiobutton(
            logiciels_frame, text=u"Salomé", value="Salome", variable=self.logiciel,
            command=self.activate_salome_widgets)
        button_salome.grid(row=2, column=0, rowspan=3, sticky='w')

        self.logiciel.set("Salome")

        logiciels_frame.grid(row=1)

        f.grid(row=1, sticky='w' + 'e' + 's' + 'n')
        return main_param
Esempio n. 10
0
    def __init__(self, resu1, resu2, mac):
        from Calc_essai.outils_ihm import MacWindowFrame
        from Tkinter import Tk, Frame, StringVar, Entry, Label, Button

        self.resu1 = resu1
        self.resu2 = resu2
        self.mac = mac
        self.root = Tk()

        nom1 = resu1.nom
        nom2 = resu2.nom
        titre = "MAC pour la base " + nom1 + " et " + nom2
        size = (20, 300)

        # la fenetre de MAC
        mac_win = MacWindowFrame(self.root, titre, nom1, nom2, size)
        mac_win.grid(row=0, column=0)

        self.freq1 = get_modes(resu1)
        self.freq2 = get_modes(resu2)
        # la variable NUMERIQUE qui contient ces memes listes. On remplit
        # ces valeurs quand on ferme la fenetre
        self.l1 = None
        self.l2 = None
        # la variable GRAPHIQUE qui donne le contenu des listes
        self.var_l1 = StringVar()
        self.var_l2 = StringVar()

        mac_win.set_modes(self.freq1, self.freq2, self.mac)

        # Une deuxieme fentre, dans laquelle on peut modifier l'appariement des
        # modes
        f = Frame(self.root)
        f.grid(row=1, column=0, sticky='news')
        f.columnconfigure(0, weight=1)
        f.columnconfigure(1, weight=4)

        Label(f, text="Liste de mode 1").grid(row=0, column=0, sticky='e')
        # l1 = Entry(f, textvariable=self.var_l1 )
        Label(f, textvariable=self.var_l1).grid(row=0, column=1, sticky='w')
        # l1.grid(row=0,column=1,sticky='ew')#,columnspan=3)
        Label(f, text="Liste de mode 2").grid(row=1, column=0, sticky='e')
        l2 = Entry(f, textvariable=self.var_l2)
        l2.grid(row=1, column=1, sticky='ew')  # ,columnspan=3)
        close = Button(f, text='Fermer', command=self.close_win)

        close.grid(row=2, column=1, sticky='e')

        self.set_default_pair()

        self.root.mainloop()
    def show(self):
        self.__root.title(CONST.APP_NAME)
        mainFrame = Frame(self.__root)
        # Configure main frame and make Dialog stretchable (to EAST and WEST)
        top = mainFrame.winfo_toplevel()
        top.rowconfigure(0, weight=1)
        top.columnconfigure(0, weight=1)
        mainFrame.rowconfigure(0, weight=1)
        mainFrame.columnconfigure(0, weight=1)
        mainFrame.grid(sticky='ew')

        # Configure the frames to hold the controls
        # - Frame with input settings
        inputFrame = LabelFrame(mainFrame, text='Input Settings')
        inputFrame.columnconfigure(1, weight=1)
        inputFrame.grid(column=0, row=0, padx=5, pady=5, sticky='ew')
        # - Frame with output settings
        outputFrame = LabelFrame(mainFrame, text='Output Settings')
        outputFrame.columnconfigure(1, weight=1)
        outputFrame.grid(column=0, row=1, padx=5, pady=5, sticky='ew')
        # - Frame with buttons at the bottom of the dialog
        buttonFrame = Frame(mainFrame)
        buttonFrame.grid(column=0, row=2, padx=5, pady=5, sticky='e')

        # Controls for input
        dataSourceFileLabel = Label(inputFrame, text='Data File:', width=15, anchor='w')
        dataSourceFileLabel.grid(column=0, row=1, padx=5, pady=5, sticky='w')
        dataSourceFileEntry = Entry(inputFrame, width=70, textvariable=self.__ctrl.getDataSourceFileEntryVariable())
        dataSourceFileEntry.grid(column=1, row=1, padx=5, pady=5, sticky='ew')
        dataSourceFileButton = Button(inputFrame, text='...', command=self.__ctrl.dataSourceFileEntryVariableHandler)
        dataSourceFileButton.grid(column=2, row=1, padx=5, pady=5, sticky='e')

        # Controls for output
        numberOfDataLinesToMergeLabel = Label(outputFrame, text='Number of rows to merge into this document:', width=35, anchor='w')
        numberOfDataLinesToMergeLabel.grid(column=0, row=2, padx=5, pady=5, sticky='w')
        # numberOfDataLinesToMergeListBox = OptionMenu(outputFrame, self.__ctrl.getSelectedNumberOfLines(), tuple(self.__ctrl.getNumerOfLinesList())) # TODO: implement these two functions in the controller
        numberOfDataLinesToMergeListBox = apply(OptionMenu, (outputFrame, self.__ctrl.getSelectedNumberOfLines()) + tuple(self.__ctrl.getNumerOfLinesList()))
        numberOfDataLinesToMergeListBox.grid(column=1, row=2, padx=5, pady=5, sticky='w')

        # Buttons
        cancelButton = Button(buttonFrame, text='Cancel', width=10, command=self.__ctrl.buttonCancelHandler)
        cancelButton.grid(column=1, row=0, padx=5, pady=5, sticky='e')
        runButton = Button(buttonFrame, text='Run', width=10, command=self.__ctrl.buttonOkHandler)
        runButton.grid(column=2, row=0, padx=5, pady=5, sticky='e')

        # Show the dialog
        mainFrame.grid()
        self.__root.grid()
        self.__root.mainloop()
Esempio n. 12
0
 def createConsoles(self, parent, nodes, width, title):
     "Create a grid of consoles in a frame."
     f = Frame(parent)
     # Create consoles
     consoles = []
     index = 0
     for node in nodes:
         console = Console(f, self.net, node, title=title)
         consoles.append(console)
         row = index / width
         column = index % width
         console.grid(row=row, column=column, sticky='nsew')
         index += 1
         f.rowconfigure(row, weight=1)
         f.columnconfigure(column, weight=1)
     return f, consoles
Esempio n. 13
0
 def createConsoles( self, parent, nodes, width, title ):
     "Create a grid of consoles in a frame."
     f = Frame( parent )
     # Create consoles
     consoles = []
     index = 0
     for node in nodes:
         console = Console( f, self.net, node, title=title )
         consoles.append( console )
         row = index / width
         column = index % width
         console.grid( row=row, column=column, sticky='nsew' )
         index += 1
         f.rowconfigure( row, weight=1 )
         f.columnconfigure( column, weight=1 )
     return f, consoles
Esempio n. 14
0
    def __init__(self, parent):
        master = Frame(parent, bg = 'green')
        master.grid(sticky = W + N + E + S)
        master.rowconfigure(0, weight = 1)
        master.columnconfigure(0, weight = 1)
        
        canvas = Canvas(master)
        self._canvas = canvas
        canvas.grid(row = 0, column = 0, sticky = W + N + E + S)
        hScroll = Scrollbar(master, orient = HORIZONTAL, command = canvas.xview)
        hScroll.grid(row = 1, column = 0, sticky = W + E)
        vScroll = Scrollbar(master, orient = VERTICAL, command = canvas.yview)
        vScroll.grid(row = 0, column = 1, sticky = N + S)

        canvas.configure(xscrollcommand = hScroll.set, yscrollcommand = vScroll.set)
        Frame.__init__(self, canvas, bg = 'blue')
        canvas.create_window(0, 0, window = self, anchor = N + W)
Esempio n. 15
0
class ScrolledCanvas:
    def __init__(self, master, **opts):
        if not opts.has_key('yscrollincrement'):
            opts['yscrollincrement'] = 17
        self.master = master
        self.frame = Frame(master)
        self.frame.rowconfigure(0, weight=1)
        self.frame.columnconfigure(0, weight=1)
        self.canvas = Canvas(self.frame, **opts)
        self.canvas.grid(row=0, column=0, sticky="nsew")
        self.vbar = Scrollbar(self.frame, name="vbar")
        self.vbar.grid(row=0, column=1, sticky="nse")
        self.hbar = Scrollbar(self.frame, name="hbar", orient="horizontal")
        self.hbar.grid(row=1, column=0, sticky="ews")
        self.canvas['yscrollcommand'] = self.vbar.set
        self.vbar['command'] = self.canvas.yview
        self.canvas['xscrollcommand'] = self.hbar.set
        self.hbar['command'] = self.canvas.xview
        self.canvas.bind("<Key-Prior>", self.page_up)
        self.canvas.bind("<Key-Next>", self.page_down)
        self.canvas.bind("<Key-Up>", self.unit_up)
        self.canvas.bind("<Key-Down>", self.unit_down)
        #if isinstance(master, Toplevel) or isinstance(master, Tk):
        self.canvas.bind("<Alt-Key-2>", self.zoom_height)
        self.canvas.focus_set()

    def page_up(self, event):
        self.canvas.yview_scroll(-1, "page")
        return "break"

    def page_down(self, event):
        self.canvas.yview_scroll(1, "page")
        return "break"

    def unit_up(self, event):
        self.canvas.yview_scroll(-1, "unit")
        return "break"

    def unit_down(self, event):
        self.canvas.yview_scroll(1, "unit")
        return "break"

    def zoom_height(self, event):
        ZoomHeight.zoom_height(self.master)
        return "break"
Esempio n. 16
0
    def createWidgets(self):

        if self.widgets:
            for label in self.widgets:
                label.update()
        else:
            labels =[]
            f = Frame(self.canv)
            f.rowconfigure(0, weight=1)
            f.columnconfigure(0, weight=1)
            for slot in self.device.storage_slots:
                label = StorageLabel(f,slot)
                labels.append(label)

            self.canv.create_window(0, 0, anchor='nw', window=f)
            f.update_idletasks()
            self.canv.config(scrollregion=self.canv.bbox("all"))
            self.widgets = labels
Esempio n. 17
0
class ScrolledCanvas:
    def __init__(self, master, **opts):
        if 'yscrollincrement' not in opts:
            opts['yscrollincrement'] = 17
        self.master = master
        self.frame = Frame(master)
        self.frame.rowconfigure(0, weight=1)
        self.frame.columnconfigure(0, weight=1)
        self.canvas = Canvas(self.frame, **opts)
        self.canvas.grid(row=0, column=0, sticky="nsew")
        self.vbar = Scrollbar(self.frame, name="vbar")
        self.vbar.grid(row=0, column=1, sticky="nse")
        self.hbar = Scrollbar(self.frame, name="hbar", orient="horizontal")
        self.hbar.grid(row=1, column=0, sticky="ews")
        self.canvas['yscrollcommand'] = self.vbar.set
        self.vbar['command'] = self.canvas.yview
        self.canvas['xscrollcommand'] = self.hbar.set
        self.hbar['command'] = self.canvas.xview
        self.canvas.bind("<Key-Prior>", self.page_up)
        self.canvas.bind("<Key-Next>", self.page_down)
        self.canvas.bind("<Key-Up>", self.unit_up)
        self.canvas.bind("<Key-Down>", self.unit_down)
        #if isinstance(master, Toplevel) or isinstance(master, Tk):
        self.canvas.bind("<Alt-Key-2>", self.zoom_height)
        self.canvas.focus_set()
    def page_up(self, event):
        self.canvas.yview_scroll(-1, "page")
        return "break"
    def page_down(self, event):
        self.canvas.yview_scroll(1, "page")
        return "break"
    def unit_up(self, event):
        self.canvas.yview_scroll(-1, "unit")
        return "break"
    def unit_down(self, event):
        self.canvas.yview_scroll(1, "unit")
        return "break"
    def zoom_height(self, event):
        ZoomHeight.zoom_height(self.master)
        return "break"
Esempio n. 18
0
    def generate_entryfields(self, config):
        self.entries = []
       
        f1 = Frame(self.frame, relief=GROOVE, bd=2)
        f1.grid(row=1, column=0, padx=2, pady=2, sticky=N + W + E)
        f2 = Frame(self.frame, relief=GROOVE, bd=2)
        f2.grid(row=2, column=0, padx=2, pady=2, sticky=N + W + E)
        f3 = Frame(self.frame, relief=GROOVE, bd=2)
        f3.grid(row=3, column=0, padx=2, pady=2, sticky=N + W + E)
    
        f1.columnconfigure(0, weight=1)
        f2.columnconfigure(0, weight=1)
        f3.columnconfigure(0, weight=1)        
   
        Label(f1, text=_("Tool diameter [mm]:"))\
                .grid(row=0, column=0, sticky=N + W, padx=4)
        self.entries.append(Entry(f1, width=7, textvariable=self.tool_dia, state=DISABLED))
        self.entries[-1].grid(row=0, column=1, sticky=N + E)


        Label(f1, text=_("Start radius (for tool comp.) [mm]:"))\
                .grid(row=1, column=0, sticky=N + W, padx=4)
        self.entries.append(Entry(f1, width=7, textvariable=self.start_rad, state=DISABLED))
        self.entries[-1].grid(row=1, column=1, sticky=N + E) 

        Label(f2, text=(_("%s safety margin [mm]:") % config.ax3_letter))\
                .grid(row=1, column=0, sticky=N + W, padx=4)
        self.entries.append(Entry(f2, width=7, textvariable=self.axis3_safe_margin, state=DISABLED))
        self.entries[-1].grid(row=1, column=1, sticky=N + E)

        Label(f2, text=(_("%s infeed depth [mm]:") % config.ax3_letter))\
                .grid(row=2, column=0, sticky=N + W, padx=4)
        self.entries.append(Entry(f2, width=7, textvariable=self.axis3_slice_depth, state=DISABLED))
        self.entries[-1].grid(row=2, column=1, sticky=N + E)

        Label(f2, text=(_("%s mill depth [mm]:") % config.ax3_letter))\
                .grid(row=3, column=0, sticky=N + W, padx=4)
        self.entries.append(Entry(f2, width=7, textvariable=self.axis3_mill_depth, state=DISABLED))
        self.entries[-1].grid(row=3, column=1, sticky=N + E)

        Label(f3, text=(_("G1 feed %s-direction [mm/min]:") % config.ax3_letter))\
                .grid(row=1, column=0, sticky=N + W, padx=4)
        self.entries.append(Entry(f3, width=7, textvariable=self.F_G1_Depth, state=DISABLED))
        self.entries[-1].grid(row=1, column=1, sticky=N + E)

        Label(f3, text=(_("G1 feed %s%s-direction [mm/min]:") % (config.ax1_letter, config.ax2_letter)))\
                .grid(row=2, column=0, sticky=N + W, padx=4)
        self.entries.append(Entry(f3, width=7, textvariable=self.F_G1_Plane, state=DISABLED))
        self.entries[-1].grid(row=2, column=1, sticky=N + E)
Esempio n. 19
0
    def __init__(self):
        def onresize(event):
            data_canvas.configure(scrollregion=data_canvas.bbox("all"))
            self.root.update_idletasks()

        def on_mousewheel(event):
            data_canvas.yview_scroll(-1 * (event.delta / 120), "units")
            self.root.update_idletasks()

        self.root = Tk()
        self.root.wm_title("Micro-Tensile Testing Machine")
        self.root.state("zoomed")

########################################################################################################################
        # Title
        header = Frame(self.root)
        Label(header, text="Micro-Tensile Testing Machine", font=("Helvetica", 40, "bold"), bg="green", relief=RAISED).grid(row=0)
        header.columnconfigure(0, weight=1)
        header.grid(row=0, sticky=E + W)
########################################################################################################################
        # Parameters
        par_frame = Frame(self.root)
        choice_frame = Frame(par_frame, bd=2, relief=RAISED)
        self.choice = IntVar()
        self.choice.set(1)
        Radiobutton(choice_frame, text="ELONGATION", font=("Courier", 15),
                    variable=self.choice, value=1).grid(row=0, column=0, padx=50)
        Radiobutton(choice_frame, text="BENDING", font=("Courier", 15),
                    variable=self.choice, value=2).grid(row=1, column=0, padx=50)
        choice_frame.grid(row=0, column=0, sticky=W)

        spec_frame = Frame(par_frame, bd=2, relief=RAISED)
        Label(spec_frame, text="Specimen\nDimensions", font=("arial", 15)).grid(row=0, column=0, rowspan=2)
        Label(spec_frame, text="LENGTH(mm)", font=("Courier", 15),
              relief=SUNKEN, bg="yellow", fg="brown").grid(row=0, column=1, ipadx=5, ipady=1)
        self.L = Entry(spec_frame, fg="blue", font=("Courier", 15), width=7)
        self.L.insert(0, 25.4)
        self.L.grid(row=0, column=2)
        Label(spec_frame, text="Area(mm^2)", font=("Courier", 15),
              relief=SUNKEN, bg="yellow", fg="brown").grid(row=1, column=1, ipadx=5, ipady=1)
        self.area_box = Entry(spec_frame, fg="blue", font=("Courier", 15), width=7)
        self.area_box.insert(0, 40.3765)
        self.area_box.grid(row=1, column=2)
        spec_frame.grid(row=0, column=1, rowspan=2, sticky=E)
        par_frame.grid_columnconfigure(1, weight=1)
        par_frame.grid(row=1, sticky=E + W)
########################################################################################################################
        # Main Frame containing Curve and data display
        curve = Frame(self.root)

        self.no_reading = 0
        # Stress, Strain value arrays
        self.stress = np.array([0.0])
        self.strain = np.array([0.0])

        # Figure

        main_curve = plot.figure(figsize=(18.5, 10))
        gs = gridspec.GridSpec(1, 2, width_ratios=[3, 2])

        ###################################################################
        # # Live diagram
        live_plot = main_curve.add_subplot(gs[0, 0])
        live_plot.set_title("Live Diagram")
        live_plot.grid(True)
        live_plot.set_xlabel("in mm")
        live_plot.set_xlim([0, float(self.L.get())])
        live_plot.set_ylim([0, 50.0])  # Set y axis limits for live diagram

        self.lines = live_plot.plot([0.0], [0.0], 'b-', [0.0], [0.0], 'r--')
        self.live_plot = live_plot
        ###################################################################
        # # Stress-Strain Curve
        curve_plot = main_curve.add_subplot(gs[0, 1])
        curve_plot.set_title("Curve")
        curve_plot.grid(True)
        curve_plot.set_xlim([0.0, 0.01])
        curve_plot.set_ylim([0.0, 100.0])
        curve_plot.set_xlabel("")
        curve_plot.set_ylabel("")

        self.points = curve_plot.plot(self.strain, self.stress, 'k-')
        self.curve_plot = curve_plot
        ###################################################################
        # # Save and show Figure
        main_curve.tight_layout()
        self.main_curve = main_curve
        self.canvas_main = FigureCanvasTkAgg(self.main_curve, master=curve)
        self.canvas_main.show()
        self.canvas_main.get_tk_widget().grid(row=0, column=0, sticky=N + S + E + W)

        # Displaying data
        disp_data = Frame(curve, relief=RAISED, bd=2)
        yscrollbar = AutoScrollbar(disp_data)
        yscrollbar.grid(row=0, column=1, rowspan=4, sticky=N + S)
        xscrollbar = AutoScrollbar(disp_data, orient=HORIZONTAL)
        xscrollbar.grid(row=2, column=0, sticky=E + W)
        data_canvas = Canvas(disp_data, yscrollcommand=yscrollbar.set, xscrollcommand=xscrollbar.set)
        data_canvas.grid(row=0, column=0, rowspan=4, sticky=N + S + W + E)
        yscrollbar.config(command=data_canvas.yview)
        xscrollbar.config(command=data_canvas.xview)
        label_frame = Frame(disp_data)
        Label(label_frame, text="DATA\nS.No  Load(N)  Elongation(mm)\n",
              font=("COMIC SANS MS", 17, "bold")).grid(row=0, column=0, sticky=N + S + W + E)
        self.data = StringVar()
        self.data_str = ""
        self.data.set(self.data_str)
        Label(label_frame, textvariable=self.data,
              font=("Helvetica", 16, "italic")).grid(row=1, column=0, sticky=N + S + W + E)
        data_canvas.create_window(0, 0, window=label_frame)
        label_frame.bind("<Configure>", onresize)
        label_frame.bind_all("<MouseWheel>", on_mousewheel)

        disp_data.rowconfigure(1, weight=1)
        disp_data.columnconfigure(0, weight=1)
        disp_data.columnconfigure(1, weight=1)

        disp_data.grid(row=0, column=1, sticky=N + S + W + E)

        curve.columnconfigure(0, weight=1)
        curve.grid(row=2, sticky=N + S + E + W)
########################################################################################################################
        footer = Frame(self.root)
        Button(footer, text="Run", font=('Comic Sans MS', 25, "bold italic"),
               command=self.run_program).grid(row=0, column=0)
        footer.columnconfigure(0, weight=1)
        footer.grid(row=3, sticky=N + S + E + W)

        self.root.mainloop()
Esempio n. 20
0
    def BuildMainFrame(self):
        from Tkinter import Menu, IntVar, StringVar, Toplevel, Listbox, Frame, PanedWindow, Text, Scrollbar, Entry
        from Tkinter import X, N, S, W, E, VERTICAL, TOP, END, DISABLED, RAISED

        menu = Menu(self.master, activeborderwidth=0, bd=0)
        self.master.config(menu=menu)

        filemenu = Menu(menu, tearoff=0, bd=1, activeborderwidth=0)
        menu.add_cascade(label="File", underline=0, menu=filemenu)
        filemenu.add_command(label="New",
                             accelerator='Ctrl+N',
                             command=self.NewCommand)
        filemenu.add_command(label="Open...",
                             accelerator='Ctrl+O',
                             command=self.OpenCommand)
        filemenu.add_command(label="Save as...",
                             accelerator='Ctrl+S',
                             command=self.SaveCommand)
        filemenu.add_separator()
        filemenu.add_command(label="Quit",
                             accelerator='Ctrl+Q',
                             command=self.QuitCommand)

        self.log_on = IntVar()
        self.log_on.set(1)

        self.output_to_file = StringVar()
        self.output_to_file.set('n')

        scriptmenu = Menu(menu, tearoff=0, bd=1, activeborderwidth=0)
        modulenames = ['vmtkscripts']
        for modulename in modulenames:
            scriptsubmenu = self.BuildScriptMenu(menu, modulename)
            if scriptsubmenu:
                scriptmenu.add_cascade(label=modulename, menu=scriptsubmenu)

        editmenu = Menu(menu, tearoff=0, bd=1, activeborderwidth=0)
        menu.add_cascade(label="Edit", underline=0, menu=editmenu)
        editmenu.add_cascade(label="Insert script", menu=scriptmenu)
        editmenu.add_command(label="Insert file name",
                             accelerator='Ctrl+F',
                             command=self.InsertFileName)
        editmenu.add_separator()
        editmenu.add_command(label="Clear input",
                             command=self.ClearInputCommand)
        editmenu.add_command(label="Clear output",
                             command=self.ClearOutputCommand)
        editmenu.add_command(label="Clear all", command=self.ClearAllCommand)
        editmenu.add_separator()
        editmenu.add_checkbutton(label="Log", variable=self.log_on)
        editmenu.add_separator()
        editmenu.add_radiobutton(label="No output to file",
                                 variable=self.output_to_file,
                                 value='n')
        editmenu.add_radiobutton(label="Write output to file",
                                 variable=self.output_to_file,
                                 value='w')
        editmenu.add_radiobutton(label="Append output to file",
                                 variable=self.output_to_file,
                                 value='a')
        editmenu.add_command(label="Output file...",
                             command=self.OutputFileCommand)

        runmenu = Menu(menu, tearoff=0, bd=1, activeborderwidth=0)
        menu.add_cascade(label="Run", underline=0, menu=runmenu)
        runmenu.add_command(label="Run all", command=self.RunAllCommand)
        runmenu.add_command(label="Run current line",
                            command=self.RunLineCommand)
        runmenu.add_command(label="Run selection",
                            command=self.RunSelectionCommand)

        helpmenu = Menu(menu, tearoff=0, bd=1, activeborderwidth=0)
        menu.add_cascade(label="Help", underline=0, menu=helpmenu)
        helpmenu.add_command(label="Help",
                             underline=0,
                             accelerator='F1',
                             command=self.ShowHelpCommand)
        helpmenu.add_command(label="About",
                             underline=0,
                             command=self.AboutCommand)

        self.master.bind("<Control-KeyPress-q>", self.QuitHandler)
        self.master.bind("<Control-KeyPress-n>", self.NewHandler)
        self.master.bind("<Control-KeyPress-o>", self.OpenHandler)
        self.master.bind("<Control-KeyPress-s>", self.SaveHandler)
        self.master.bind("<Control-KeyPress-f>", self.InsertFileNameHandler)
        self.master.bind("<KeyPress-F1>", self.ShowHelpHandler)
        self.master.bind("<KeyPress>", self.KeyPressHandler)

        self.wordIndex = ['1.0', '1.0']

        self.suggestionswindow = Toplevel(bg='#ffffff',
                                          bd=0,
                                          height=50,
                                          width=600,
                                          highlightthickness=0,
                                          takefocus=True)
        self.suggestionswindow.overrideredirect(1)
        self.suggestionslist = Listbox(self.suggestionswindow,
                                       bg='#ffffff',
                                       bd=1,
                                       fg='#336699',
                                       activestyle='none',
                                       highlightthickness=0,
                                       height=9)
        self.suggestionslist.insert(END, "foo")
        self.suggestionslist.pack(side=TOP, fill=X)
        self.suggestionswindow.bind("<KeyPress>", self.TopKeyPressHandler)
        self.suggestionswindow.withdraw()

        self.master.rowconfigure(0, weight=1)
        self.master.columnconfigure(0, weight=1)
        content = Frame(self.master, bd=0, padx=2, pady=2)
        content.grid(row=0, column=0, sticky=N + S + W + E)
        content.rowconfigure(0, weight=1, minsize=50)
        content.rowconfigure(1, weight=0)
        content.columnconfigure(0, weight=1)

        panes = PanedWindow(content,
                            orient=VERTICAL,
                            bd=1,
                            sashwidth=8,
                            sashpad=0,
                            sashrelief=RAISED,
                            showhandle=True)
        panes.grid(row=0, column=0, sticky=N + S + W + E)

        frame1 = Frame(panes, bd=0)
        frame1.grid(row=0, column=0, sticky=N + S + W + E)
        frame1.columnconfigure(0, weight=1)
        frame1.columnconfigure(1, weight=0)
        frame1.rowconfigure(0, weight=1)

        panes.add(frame1, height=300, minsize=20)

        frame2 = Frame(panes, bd=0)
        frame2.grid(row=1, column=0, sticky=N + S + W + E)
        frame2.columnconfigure(0, weight=1)
        frame2.columnconfigure(1, weight=0)
        frame2.rowconfigure(0, weight=1)

        panes.add(frame2, minsize=20)

        self.text_input = Text(frame1,
                               bg='#ffffff',
                               bd=1,
                               highlightthickness=0)

        self.text_input.bind("<KeyPress>", self.KeyPressHandler)
        self.text_input.bind("<Button-3>", self.PopupHandler)
        self.text_input.bind("<Control-Return>", self.RunKeyboardHandler)

        self.input_scrollbar = Scrollbar(frame1,
                                         orient=VERTICAL,
                                         command=self.text_input.yview)
        self.text_input["yscrollcommand"] = self.input_scrollbar.set

        self.text_output = Text(frame2,
                                state=DISABLED,
                                bd=1,
                                bg='#ffffff',
                                highlightthickness=0)

        self.output_scrollbar = Scrollbar(frame2,
                                          orient=VERTICAL,
                                          command=self.text_output.yview)
        self.text_output["yscrollcommand"] = self.output_scrollbar.set

        self.text_entry = Entry(content,
                                bd=1,
                                bg='#ffffff',
                                state=DISABLED,
                                highlightthickness=0)

        self.text_input.focus_set()

        self.text_input.grid(row=0, column=0, sticky=N + S + W + E)
        self.input_scrollbar.grid(row=0, column=1, sticky=N + S + W + E)
        self.text_output.grid(row=0, column=0, sticky=N + S + W + E)
        self.output_scrollbar.grid(row=0, column=1, sticky=N + S + W + E)
        self.text_entry.grid(row=1, column=0, sticky=N + S + W + E)

        self.popupmenu = Menu(self.text_input, tearoff=1, bd=0)
        self.popupmenu.add_command(label="Context help",
                                   command=self.ShowHelpCommand)
        self.popupmenu.add_cascade(label="Insert script", menu=scriptmenu)
        self.popupmenu.add_command(label="Insert file name...",
                                   command=self.InsertFileName)
        self.popupmenu.add_separator()
        self.popupmenu.add_command(label="Run all", command=self.RunAllCommand)
        self.popupmenu.add_command(label="Run current line",
                                   command=self.RunLineCommand)
        self.popupmenu.add_command(label="Run selection",
                                   command=self.RunSelectionCommand)

        self.output_stream = TkPadOutputStream(self.text_output)
        self.input_stream = TkPadInputStream(self.text_entry,
                                             self.output_stream)
Esempio n. 21
0
    def initUI(self):
        self.parent.title("Client")
        frame = Frame(self, relief=tk.RAISED, borderwidth=1)

        # The width of the first column gets almost no change.
        frame.columnconfigure(0, pad=10, weight=1)
        frame.columnconfigure(1, pad=10, weight=1000)

        lbl_addr = Label(frame, text="Address")
        lbl_addr.grid(row=0, column=0, sticky=tk.W + tk.S)

        lbl_port = Label(frame, text="Port")
        lbl_port.grid(row=0, column=1, sticky=tk.W + tk.S)

        ent_addr = Entry(frame, width=15)
        ent_addr.grid(row=1, column=0, sticky=tk.W + tk.N)

        ent_port = Entry(frame, width=6)
        ent_port.grid(row=1, column=1, sticky=tk.W + tk.N)

        lbl_msg = Label(frame, text="Input Message", anchor=tk.E)
        lbl_msg.grid(row=2, column=0, sticky=tk.W + tk.S)

        ent_msg = Text(frame, width=30, height=4)
        ent_msg.grid(row=3, column=0, columnspan=2,
                     sticky=tk.W + tk.E + tk.N)  # sticky can be used to expand

        lbl_num = Label(frame, text="Input Number")
        lbl_num.grid(row=4, column=0, sticky=tk.W + tk.S)

        ent_num = Entry(frame, width=6)
        ent_num.grid(row=5, column=0, sticky=tk.W + tk.N)
        # ======================

        ret_indicator = tk.StringVar()
        ret_indicator.set("Result")
        lab_res = Label(frame, textvariable=ret_indicator)
        lab_res.grid(row=6, column=0, sticky=tk.W + tk.S)

        var_res = tk.StringVar()
        msg_res = Message(frame, textvariable=var_res, width=500)
        msg_res.grid(row=7, column=0, columnspan=2, sticky=tk.W + tk.E + tk.N)

        frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=1)

        def connect():
            self.addr = ent_addr.get()
            portStr = ent_port.get()

            if self.addr == "":
                self.addr = "localhost"

            if portStr == "":
                self.port = 50000
            else:
                self.port = int(portStr)

            (ret, info) = ec.connect(self.addr, self.port)
            if ret == 0:
                ret_indicator.set("Connection Succeeded")
                self.conn = info
                var_res.set("")
            else:
                ret_indicator.set("Connection Failed")
                var_res.set(info)

        def sendMsg():
            msg = ent_msg.get("0.0", tk.END)[0:-1]
            print "msg to be sent is: " + repr(msg)
            (ret, info) = ec.sendMsg(self.conn, msg.encode('utf-8'))
            if ret == 0:
                ret_indicator.set("Send Succeeded")
                var_res.set("")
            else:
                ret_indicator.set("Send Failed")
                var_res.set(info)

        def sendNum():
            msg = ent_num.get()
            print "msg to be sent is: " + repr(msg)
            (ret, info) = ec.sendNum(self.conn, int(msg))
            if ret == 0:
                ret_indicator.set("Send Succeeded")
                var_res.set("")
            else:
                ret_indicator.set("Send Failed")
                var_res.set(info)

        def recvMsg():
            (ret, info) = ec.recvMsg(self.conn)
            if ret == 0:
                ret_indicator.set("Receive Succeeded")
            else:
                ret_indicator.set("Receive Failed")
            var_res.set(info)

        def close():
            (ret, info) = ec.close(self.conn)
            if ret == 0:
                ret_indicator.set("Close Succeeded")
                var_res.set("")
            else:
                ret_indicator.set("Close Failed")
                var_res.set(info)

        frame2 = Frame(self, relief=tk.RAISED, borderwidth=1)
        """Buttoms are always in the middle."""
        frame2.columnconfigure(0, pad=10, weight=1)
        frame2.rowconfigure(0, weight=1000)
        frame2.rowconfigure(1, weight=1)
        frame2.rowconfigure(2, weight=1)
        frame2.rowconfigure(3, weight=1)
        frame2.rowconfigure(4, weight=1)
        frame2.rowconfigure(5, weight=1)
        frame2.rowconfigure(6, weight=1000)

        but_conn = Button(frame2, text="Connect", command=connect)
        but_conn.grid(row=1, column=0, sticky=tk.W + tk.E)

        but_send_msg = Button(frame2, text="Send Message", command=sendMsg)
        but_send_msg.grid(row=2, column=0, sticky=tk.W + tk.E)

        but_send_num = Button(frame2, text="Send Number", command=sendNum)
        but_send_num.grid(row=3, column=0, sticky=tk.W + tk.E)

        but_recv = Button(frame2, text="Receive", command=recvMsg)
        but_recv.grid(row=4, column=0, sticky=tk.W + tk.E)

        but_close = Button(frame2, text="Close", command=close)
        but_close.grid(row=5, column=0, sticky=tk.W + tk.E)

        frame2.pack(side=tk.LEFT, fill=tk.BOTH, expand=1)

        # expand=1 cannot be omitted
        self.pack(fill=tk.BOTH, expand=1)
Esempio n. 22
0
    def show_items(self, items, upper=None):
        """
        Creates a new page on the stack, automatically adds a back button when there are
        pages on the stack already

        :param items: list the items to display
        :param upper: list previous levels' ids
        :return: None
        """
        if upper is None:
            upper = []
        num = 0

        # create a new frame
        wrap = Frame(self, bg="black")

        if len(self.framestack):
            # when there were previous frames, hide the top one and add a back button for the new one
            self.hide_top()
            back = FlatButton(
                wrap,
                text='back…',
                image=self.get_icon("arrow.left"),
                command=self.go_back,
            )
            back.set_color("#00a300")  # green
            back.grid(row=0,
                      column=0,
                      padx=1,
                      pady=1,
                      sticky=TkC.W + TkC.E + TkC.N + TkC.S)
            num += 1

        # add the new frame to the stack and display it
        self.framestack.append(wrap)
        self.show_top()

        # calculate tile distribution
        allitems = len(items) + num
        rows = floor(sqrt(allitems))
        cols = ceil(allitems / rows)

        # make cells autoscale
        for x in range(int(cols)):
            wrap.columnconfigure(x, weight=1)
        for y in range(int(rows)):
            wrap.rowconfigure(y, weight=1)

        # display all given buttons
        for item in items:
            act = upper + [item['name']]

            if 'icon' in item:
                image = self.get_icon(item['icon'])
            else:
                image = self.get_icon('scrabble.' + item['label'][0:1].lower())

            btn = FlatButton(wrap, text=item['label'], image=image)

            if 'items' in item:
                # this is a deeper level
                btn.configure(command=lambda act=act, item=item: self.
                              show_items(item['items'], act),
                              text=item['label'] + '…')
                btn.set_color("#2b5797")  # dark-blue
            else:
                # this is an action
                btn.configure(command=lambda act=act: self.go_action(act), )

            if 'color' in item:
                btn.set_color(item['color'])

            # add buton to the grid
            btn.grid(row=int(floor(num / cols)),
                     column=int(num % cols),
                     padx=1,
                     pady=1,
                     sticky=TkC.W + TkC.E + TkC.N + TkC.S)
            num += 1
Esempio n. 23
0
    def initUI(self):
        self.parent.title("Client")
        frame = Frame(self, relief=tk.RAISED, borderwidth=1)

        # The width of the first column gets almost no change.
        frame.columnconfigure(0, pad=10, weight=1)
        frame.columnconfigure(1, pad=10, weight=1000)

        lbl_addr = Label(frame, text="Address")
        lbl_addr.grid(row=0,column=0, sticky=tk.W+tk.S)

        lbl_port = Label(frame, text="Port")
        lbl_port.grid(row=0,column=1, sticky=tk.W+tk.S)

        ent_addr = Entry(frame, width=15)
        ent_addr.grid(row=1,column=0, sticky=tk.W+tk.N)

        ent_port = Entry(frame, width=6)
        ent_port.grid(row=1,column=1, sticky=tk.W+tk.N)

        lbl_msg = Label(frame, text="Input Message", anchor=tk.E)
        lbl_msg.grid(row=2,column=0, sticky=tk.W+tk.S)

        ent_msg = Text(frame, width=30, height=4)
        ent_msg.grid(row=3,column=0, columnspan=2, sticky=tk.W+tk.E+tk.N) # sticky can be used to expand

        lbl_num = Label(frame, text="Input Number")
        lbl_num.grid(row=4,column=0, sticky=tk.W+tk.S)

        ent_num = Entry(frame, width=6)
        ent_num.grid(row=5,column=0, sticky=tk.W+tk.N)
        # ======================

        ret_indicator = tk.StringVar()
        ret_indicator.set("Result")
        lab_res = Label(frame, textvariable=ret_indicator)
        lab_res.grid(row=6,column=0, sticky=tk.W+tk.S)

        var_res = tk.StringVar()
        msg_res = Message(frame,textvariable=var_res, width=500)
        msg_res.grid(row=7,column=0, columnspan=2,sticky=tk.W+tk.E+tk.N)

        frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=1)

        def connect():
            self.addr = ent_addr.get()
            portStr = ent_port.get()

            if self.addr == "":
                self.addr = "localhost"

            if portStr == "":
                self.port = 50000
            else:
                self.port = int(portStr)

            (ret, info) = ec.connect(self.addr, self.port)
            if ret == 0:
                ret_indicator.set("Connection Succeeded")
                self.conn = info
                var_res.set("")
            else:
                ret_indicator.set("Connection Failed")
                var_res.set(info)

        def sendMsg():
            msg = ent_msg.get("0.0", tk.END)[0:-1]
            print "msg to be sent is: " + repr(msg)
            (ret, info) = ec.sendMsg(self.conn, msg.encode('utf-8'))
            if ret == 0:
                ret_indicator.set("Send Succeeded")
                var_res.set("")
            else:
                ret_indicator.set("Send Failed")
                var_res.set(info)

        def sendNum():
            msg = ent_num.get()
            print "msg to be sent is: " + repr(msg)
            (ret, info) = ec.sendNum(self.conn, int(msg))
            if ret == 0:
                ret_indicator.set("Send Succeeded")
                var_res.set("")
            else:
                ret_indicator.set("Send Failed")
                var_res.set(info)

        def recvMsg():
            (ret, info) = ec.recvMsg(self.conn)
            if ret == 0:
                ret_indicator.set("Receive Succeeded")
            else:
                ret_indicator.set("Receive Failed")
            var_res.set(info)

        def close():
            (ret, info) = ec.close(self.conn)
            if ret == 0:
                ret_indicator.set("Close Succeeded")
                var_res.set("")
            else:
                ret_indicator.set("Close Failed")
                var_res.set(info)

        frame2 = Frame(self, relief=tk.RAISED, borderwidth=1)

        """Buttoms are always in the middle."""
        frame2.columnconfigure(0, pad=10, weight=1)
        frame2.rowconfigure(0, weight=1000)
        frame2.rowconfigure(1, weight=1)
        frame2.rowconfigure(2, weight=1)
        frame2.rowconfigure(3, weight=1)
        frame2.rowconfigure(4, weight=1)
        frame2.rowconfigure(5, weight=1)
        frame2.rowconfigure(6, weight=1000)

        but_conn = Button(frame2, text="Connect", command=connect)
        but_conn.grid(row=1,column=0, sticky=tk.W+tk.E)

        but_send_msg = Button(frame2, text="Send Message", command=sendMsg)
        but_send_msg.grid(row=2,column=0, sticky=tk.W+tk.E)

        but_send_num = Button(frame2, text="Send Number", command=sendNum)
        but_send_num.grid(row=3,column=0, sticky=tk.W+tk.E)

        but_recv = Button(frame2, text="Receive", command=recvMsg)
        but_recv.grid(row=4,column=0, sticky=tk.W+tk.E)

        but_close = Button(frame2, text="Close", command=close)
        but_close.grid(row=5,column=0, sticky=tk.W+tk.E)

        frame2.pack(side=tk.LEFT, fill=tk.BOTH,expand=1)

        # expand=1 cannot be omitted
        self.pack(fill=tk.BOTH, expand=1)
Esempio n. 24
0
    def cateUI(self):
        self.frame0.destroy()
        self.initUIRoot()
        frame4 = Frame(self.frame0, relief=RAISED, borderwidth=1)
        frame4.pack(fill=BOTH)

        frame1 = Frame(self.frame0, relief=RAISED, borderwidth=1)
        frame1.pack(fill=BOTH, expand=True)

        frame1.columnconfigure(0, weight=1)
        # frame1.columnconfigure(9, weight=1)
        frame1.rowconfigure(0, weight=1)

        lbl = Label(frame4, text="已输入温度组数")
        lbl.grid(row=0, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.varCountT = StringVar()
        self.countT = Message(frame4, textvariable=self.varCountT)
        self.varCountT.set('0')

        self.countT.grid(row=0, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        factor_Tree = ttk.Treeview(frame1)
        factor_Tree['show'] = 'headings'
        factor_Tree["columns"] = ['t_resid', 't', 'r_oil', 'p', 'Y0', 'Y_results', 'w_aro', 'w_nitro']
        #
        factor_Tree.heading("t", text="温度")
        factor_Tree.column("t", width=self.winfo_width() / 8)
        factor_Tree.heading("r_oil", text="剂油比")
        factor_Tree.column("r_oil", width=self.winfo_width() / 8)
        factor_Tree.heading("p", text="压力")
        factor_Tree.column("p", width=self.winfo_width() / 8)
        factor_Tree.heading("Y0", text="初始组成")
        factor_Tree.column("Y0", width=self.winfo_width() / 8)
        factor_Tree.heading("Y_results", text="产物组成")
        factor_Tree.column("Y_results", width=self.winfo_width() / 8)
        factor_Tree.heading("w_aro", text="重芳烃含量")
        factor_Tree.column("w_aro", width=self.winfo_width() / 8)
        factor_Tree.heading("w_nitro", text="碱氮含量")
        factor_Tree.column("w_nitro", width=self.winfo_width() / 8)
        factor_Tree.heading("t_resid", text="停留时间")
        factor_Tree.column("t_resid", width=self.winfo_width() / 8)
        factor_Tree.grid(row=0, column=0, pady=4, padx=5)
        self.factor_Tree = factor_Tree
        frame2 = Frame(self.frame0, relief=RAISED, borderwidth=1)
        frame2.pack(fill=BOTH, expand=True)

        frame2.columnconfigure(0, weight=1)
        frame2.columnconfigure(8, weight=1)

        lbl = Label(frame2, text="停留时间(s)")
        lbl.grid(row=0, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.t_input = Entry(frame2)
        self.t_input.grid(row=0, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="温度(K)")
        lbl.grid(row=1, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.T_input = Entry(frame2)
        self.T_input.grid(row=1, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="剂油比")
        lbl.grid(row=2, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.roil_input = Entry(frame2)
        self.roil_input.grid(row=2, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="压力(KPa)")
        lbl.grid(row=3, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.p_input = Entry(frame2)
        self.p_input.grid(row=3, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="初始组成(<1 英文逗号分割):")
        lbl.grid(row=0, column=4, columnspan=2, rowspan=1, sticky=W, pady=4, padx=5)
        self.Y0_input = Entry(frame2)
        self.Y0_input.grid(row=0, column=6, columnspan=2, rowspan=1, sticky=W, pady=4, padx=5)

        lbl = Label(frame2, text="产物组成(<1 英文逗号分割):")
        lbl.grid(row=1, column=4, columnspan=2, rowspan=1, sticky=W, pady=4, padx=5)
        self.Y_results_input = Entry(frame2)
        self.Y_results_input.grid(row=1, column=6, columnspan=2, rowspan=1, sticky=W, pady=4, padx=5)

        lbl = Label(frame2, text="碱氮含量(<1)")
        lbl.grid(row=2, column=4, columnspan=2, rowspan=1, sticky=W, pady=4, padx=5)
        self.yn_input = Entry(frame2)
        self.yn_input.insert(0, 0.0)
        self.yn_input.grid(row=2, column=6, columnspan=2, rowspan=1, sticky=W, pady=4, padx=5)

        lbl = Label(frame2, text="重芳烃含量(<1)")
        lbl.grid(row=3, column=4, columnspan=2, rowspan=1, sticky=W, pady=4, padx=5)
        self.ya_input = Entry(frame2)
        self.ya_input.grid(row=3, column=6, columnspan=2, rowspan=1, sticky=W, pady=4, padx=5)

        lbl = Label(frame2, text="分子质量(逗号分割)")
        lbl.grid(row=4, column=4, columnspan=2, rowspan=1, sticky=W, pady=4, padx=5)
        self.Molmasses_input = Entry(frame2)
        self.Molmasses_input.grid(row=4, column=6, columnspan=2, rowspan=1, sticky=W, pady=4, padx=5)
        self.Molmasses_input.insert('0.8,1.1,1.8,0.2,0.2,0.2,0.11,0.016,0.042,0.056,0.05,0.012')
        addButton = Button(frame2, command=self.addFactors, text="添加条件")
        addButton.grid(row=9, column=2, sticky=E)

        self.newCatButton = Button(frame2, command=self.newCata, text="开始计算", state=DISABLED)
        self.newCatButton.grid(row=9, column=6, sticky=E)
Esempio n. 25
0
class CodexTypes(Frame):

    tooltips = {
        "Geology": "Geology: Vents and fumeroles",
        "Cloud": "Lagrange Clouds",
        "Anomaly": "Anomalous stellar phenomena",
        "Thargoid": "Thargoid sites or barnacles",
        "Biology": "Biological surface signals",
        "Guardian": "Guardian sites",
        "None": "Unclassified codex entry",
    }

    def __init__(self, parent, gridrow):
        "Initialise the ``Patrol``."
        Frame.__init__(self, parent)

        self.waiting = True

        self.hidecodexbtn = tk.IntVar(value=config.getint("Canonn:HideCodex"))
        self.hidecodex = self.hidecodexbtn.get()

        self.container = Frame(self)
        self.container.columnconfigure(1, weight=1)
        #self.tooltip=Frame(self)
        #self.tooltip.columnconfigure(1, weight=1)
        #self.tooltip.grid(row = 1, column = 0,sticky="NSEW")

        #self.tooltiplist=tk.Frame(self.tooltip)
        self.tooltiplist = tk.Frame(self)

        self.images = {}
        self.labels = {}
        self.tooltipcol1 = []
        self.tooltipcol2 = []

        self.addimage("Geology", 0)
        self.addimage("Cloud", 1)
        self.addimage("Anomaly", 2)
        self.addimage("Thargoid", 3)
        self.addimage("Biology", 4)
        self.addimage("Guardian", 5)
        self.addimage("None", 6)

        #self.grid(row = gridrow, column = 0, sticky="NSEW",columnspan=2)
        self.grid(row=gridrow, column=0)
        self.container.grid(row=0, column=0, sticky="W")
        self.poidata = []
        #self.tooltip.grid_remove()
        self.tooltiplist.grid_remove()
        self.grid_remove()

    def getdata(self, system):

        url = "https://us-central1-canonn-api-236217.cloudfunctions.net/poiList?system={}".format(
            system)
        debug(url)
        r = requests.get(url)
        if r.status_code == requests.codes.ok:
            self.poidata = r.json()
            self.waiting = False

    def enter(self, event):

        type = event.widget["text"]
        #clear it if it exists
        for col in self.tooltipcol1:
            col["text"] = ""
            col.grid_remove()
        for col in self.tooltipcol2:
            col["text"] = ""
            col.grid_remove()

        poicount = 0

        # need to initialise if not exists
        if len(self.tooltipcol1) == 0:
            self.tooltipcol1.append(tk.Label(self.tooltiplist, text=""))
            self.tooltipcol2.append(tk.Label(self.tooltiplist, text=""))

        for poi in self.poidata:
            if poi.get("hud_category") == type:
                ## add a new label if it dont exist
                if len(self.tooltipcol1) == poicount:
                    self.tooltipcol1.append(
                        tk.Label(self.tooltiplist,
                                 text=poi.get("english_name")))
                    self.tooltipcol2.append(
                        tk.Label(self.tooltiplist, text=poi.get("body")))
                else:  ## just set the label
                    self.tooltipcol1[poicount]["text"] = poi.get(
                        "english_name")
                    self.tooltipcol2[poicount]["text"] = poi.get("body")

                #remember to grid them
                self.tooltipcol1[poicount].grid(row=poicount,
                                                column=0,
                                                columnspan=1,
                                                sticky="NSEW")
                self.tooltipcol2[poicount].grid(row=poicount,
                                                column=1,
                                                sticky="NSEW")
                poicount = poicount + 1

        if poicount == 0:
            self.tooltipcol1[poicount]["text"] = CodexTypes.tooltips.get(type)
            self.tooltipcol1[poicount].grid(row=poicount,
                                            column=0,
                                            columnspan=2)
            self.tooltipcol2[poicount].grid_remove()

        #self.tooltip.grid(sticky="NSEW")
        self.tooltiplist.grid(sticky="NSEW")

        ##self.tooltip["text"]=CodexTypes.tooltips.get(event.widget["text"])

    def leave(self, event):
        #self.tooltip.grid_remove()
        self.tooltiplist.grid_remove()

    def addimage(self, name, col):

        grey = "{}_grey".format(name)
        self.images[name] = tk.PhotoImage(file=os.path.join(
            CodexTypes.plugin_dir, "icons", "{}.gif".format(name)))
        self.images[grey] = tk.PhotoImage(file=os.path.join(
            CodexTypes.plugin_dir, "icons", "{}.gif".format(grey)))
        self.labels[name] = tk.Label(self.container,
                                     image=self.images.get(grey),
                                     text=name)
        self.labels[name].grid(row=0, column=col)

        self.labels[name].bind("<Enter>", self.enter)
        self.labels[name].bind("<Leave>", self.leave)
        self.labels[name].bind("<ButtonPress>", self.enter)

    def set_image(self, name, enabled):
        grey = "{}_grey".format(name)

        if enabled:
            setting = name
        else:
            setting = grey

        self.labels[name]["image"] = self.images.get(setting)

    def visualise(self):

        #we may want to try again if the data hasn't been fetched yet
        if self.waiting:
            debug("Still waiting")
            self.after(1000, self.visualise)
        else:

            self.set_image("Geology", False)
            self.set_image("Cloud", False)
            self.set_image("Anomaly", False)
            self.set_image("Thargoid", False)
            self.set_image("Biology", False)
            self.set_image("Guardian", False)
            self.set_image("None", False)

            if self.poidata:
                self.grid()
                for r in self.poidata:
                    debug(r)
                    self.set_image(r.get("hud_category"), True)
            else:
                self.grid_remove()

    def journal_entry(self, cmdr, is_beta, system, station, entry, state, x, y,
                      z, body, lat, lon, client):
        debug("CodeTypes journal_entry")

        if entry.get("event") in ("FSDJump"):
            #To avoid having check data we will assume we have some by now

            self.visualise()

        if entry.get("event") == "StartJump" and entry.get(
                "JumpType") == "Hyperspace":
            # go fetch some data.It will
            poiTypes(entry.get("StarSystem"), self.getdata).start()
            self.grid_remove()

        if entry.get("event") in ("Location", "StartUp"):
            debug("Looking for POI data in {}".format(system))
            poiTypes(system, self.getdata).start()
            ## lets give it 1 seconds
            self.after(1000, self.visualise)

    @classmethod
    def plugin_start(cls, plugin_dir):
        cls.plugin_dir = plugin_dir

    def plugin_prefs(self, parent, cmdr, is_beta, gridrow):
        "Called to get a tk Frame for the settings dialog."

        self.hidecodexbtn = tk.IntVar(value=config.getint("Canonn:HideCodex"))

        self.hidecodex = self.hidecodexbtn.get()

        frame = nb.Frame(parent)
        frame.columnconfigure(1, weight=1)
        frame.grid(row=gridrow, column=0, sticky="NSEW")

        nb.Label(frame, text="Codex Settings").grid(row=0,
                                                    column=0,
                                                    sticky="NW")
        nb.Checkbutton(frame,
                       text="Hide Codex Icons",
                       variable=self.hidecodexbtn).grid(row=1,
                                                        column=0,
                                                        sticky="NW")

        return frame

    def prefs_changed(self, cmdr, is_beta):
        "Called when the user clicks OK on the settings dialog."
        config.set('Canonn:HideCodex', self.hidecodexbtn.get())

        self.hidecodex = self.hidecodexbtn.get()

        #dont check the retval
        #self.visible()

    def visible(self):

        noicons = (self.hidecodex == 1)

        if noicons:
            self.grid_remove()
            self.isvisible = False
            return False
        else:
            self.grid()
            self.isvisible = True
            return True
Esempio n. 26
0
    figure.subplots_adjust(left=0.2, bottom=0.15, top=0.86)
    figure.canvas.draw()
    printBboxes("C")
    print()


if __name__ == "__main__":
    global root, figure
    root = Tk()
    root.rowconfigure(1, weight=1)
    root.columnconfigure(1, weight=1)

    frame = Frame(root)
    frame.grid(column=1, row=1, sticky=Tkconstants.NSEW)
    frame.rowconfigure(1, weight=1)
    frame.columnconfigure(1, weight=1)

    figure = plt.figure(dpi=150, figsize=(4, 4))
    ax = figure.add_subplot(111)
    ax.plot(range(10), [math.sin(x) for x in range(10)])
    #tz = figure.text(0.5,0.975,'The master title',horizontalalignment='center', verticalalignment='top')
    tz = figure.suptitle('The master title')

    ax.set_title('Tk embedding')
    ax.set_xlabel('X axis label')
    ax.set_ylabel('Y label')
    print(tz.get_fontsize())  # 12.0
    print(ax.title.get_fontsize(), ax.xaxis.label.get_fontsize(),
          ax.yaxis.label.get_fontsize())  # 14.4 12.0 12.0

    addScrollingFigure(figure, frame)
Esempio n. 27
0
class TabbedPageSet(Frame):
    """A Tkinter tabbed-pane widget.

    Constains set of 'pages' (or 'panes') with tabs above for selecting which
    page is displayed. Only one page will be displayed at a time.

    Pages may be accessed through the 'pages' attribute, which is a dictionary
    of pages, using the name given as the key. A page is an instance of a
    subclass of Tk's Frame widget.

    The page widgets will be created (and destroyed when required) by the
    TabbedPageSet. Do not call the page's pack/place/grid/destroy methods.

    Pages may be added or removed at any time using the add_page() and
    remove_page() methods.

    """
    class Page(object):
        """Abstract base class for TabbedPageSet's pages.

        Subclasses must override the _show() and _hide() methods.

        """
        uses_grid = False

        def __init__(self, page_set):
            self.frame = Frame(page_set, borderwidth=2, relief=RAISED)

        def _show(self):
            raise NotImplementedError

        def _hide(self):
            raise NotImplementedError

    class PageRemove(Page):
        """Page class using the grid placement manager's "remove" mechanism."""
        uses_grid = True

        def _show(self):
            self.frame.grid(row=0, column=0, sticky=NSEW)

        def _hide(self):
            self.frame.grid_remove()

    class PageLift(Page):
        """Page class using the grid placement manager's "lift" mechanism."""
        uses_grid = True

        def __init__(self, page_set):
            super(TabbedPageSet.PageLift, self).__init__(page_set)
            self.frame.grid(row=0, column=0, sticky=NSEW)
            self.frame.lower()

        def _show(self):
            self.frame.lift()

        def _hide(self):
            self.frame.lower()

    class PagePackForget(Page):
        """Page class using the pack placement manager's "forget" mechanism."""
        def _show(self):
            self.frame.pack(fill=BOTH, expand=True)

        def _hide(self):
            self.frame.pack_forget()

    def __init__(self, parent, page_names=None, page_class=PageLift,
                 n_rows=1, max_tabs_per_row=5, expand_tabs=False,
                 **kw):
        """Constructor arguments:

        page_names -- A list of strings, each will be the dictionary key to a
        page's widget, and the name displayed on the page's tab. Should be
        specified in the desired page order. The first page will be the default
        and first active page. If page_names is None or empty, the
        TabbedPageSet will be initialized empty.

        n_rows, max_tabs_per_row -- Parameters for the TabSet which will
        manage the tabs. See TabSet's docs for details.

        page_class -- Pages can be shown/hidden using three mechanisms:

        * PageLift - All pages will be rendered one on top of the other. When
          a page is selected, it will be brought to the top, thus hiding all
          other pages. Using this method, the TabbedPageSet will not be resized
          when pages are switched. (It may still be resized when pages are
          added/removed.)

        * PageRemove - When a page is selected, the currently showing page is
          hidden, and the new page shown in its place. Using this method, the
          TabbedPageSet may resize when pages are changed.

        * PagePackForget - This mechanism uses the pack placement manager.
          When a page is shown it is packed, and when it is hidden it is
          unpacked (i.e. pack_forget). This mechanism may also cause the
          TabbedPageSet to resize when the page is changed.

        """
        Frame.__init__(self, parent, **kw)

        self.page_class = page_class
        self.pages = {}
        self._pages_order = []
        self._current_page = None
        self._default_page = None

        self.columnconfigure(0, weight=1)
        self.rowconfigure(1, weight=1)

        self.pages_frame = Frame(self)
        self.pages_frame.grid(row=1, column=0, sticky=NSEW)
        if self.page_class.uses_grid:
            self.pages_frame.columnconfigure(0, weight=1)
            self.pages_frame.rowconfigure(0, weight=1)

        # the order of the following commands is important
        self._tab_set = TabSet(self, self.change_page, n_rows=n_rows,
                               max_tabs_per_row=max_tabs_per_row,
                               expand_tabs=expand_tabs)
        if page_names:
            for name in page_names:
                self.add_page(name)
        self._tab_set.grid(row=0, column=0, sticky=NSEW)

        self.change_page(self._default_page)

    def update_tabtitle(self, tab, newtitle):
        """Update tab title to newtitle."""
        currpage = self.pages[tab.title]
        old = tab.title

        # resolve title duplicate
        if newtitle in self.pages:
            count = 1
            temptitle = newtitle
            while temptitle in self.pages:
                temptitle = "%s #%d" % (newtitle, count)
                count += 1
            newtitle = temptitle

        tab.title = newtitle
        # now update 1 million places.. yeh..
        self.pages[newtitle] = self.pages.pop(old)
        self._pages_order[self._pages_order.index(old)] = newtitle
        self._tab_set._tab_names[self._tab_set._tab_names.index(old)] = newtitle
        self._tab_set._tabs[newtitle] = self._tab_set._tabs.pop(old)
        self._tab_set._tabs[newtitle].button['text'] = newtitle
        self._tab_set._tabs[newtitle].name = newtitle
        if self._tab_set._selected_tab == old:
            self._tab_set._selected_tab = newtitle
        if self._current_page == old:
            self._current_page = newtitle
        if self._default_page == old:
            self._default_page = newtitle

    def add_page(self, page_name):
        """Add a new page with the name given in page_name."""
        if not page_name:
            raise InvalidNameError("Invalid TabPage name: '%s'" % page_name)
        if page_name in self.pages:
            raise AlreadyExistsError(
                "TabPage named '%s' already exists" % page_name)

        self.pages[page_name] = self.page_class(self.pages_frame)
        self._pages_order.append(page_name)
        self._tab_set.add_tab(page_name)

        if len(self.pages) == 1: # adding first page
            self._default_page = page_name
            self.change_page(page_name)

        return self.pages[page_name]

    def remove_page(self, page_name):
        """Destroy the page whose name is given in page_name."""
        if not page_name in self.pages:
            raise KeyError("No such TabPage: '%s" % page_name)

        self._pages_order.remove(page_name)
        # handle removing last remaining, default, or currently shown page
        if len(self._pages_order) > 0:
            if page_name == self._default_page:
                # set a new default page
                self._default_page = self._pages_order[0]
        else:
            self._default_page = None

        if page_name == self._current_page:
            self.change_page(self._default_page)

        self._tab_set.remove_tab(page_name)
        page = self.pages.pop(page_name)
        page.frame.destroy()

    def change_page(self, page_name):
        """Show the page whose name is given in page_name."""
        if self._current_page == page_name:
            return
        if page_name is not None and page_name not in self.pages:
            raise KeyError("No such TabPage: '%s'" % page_name)

        if self._current_page is not None:
            self.pages[self._current_page]._hide()
        self._current_page = None

        if page_name is not None:
            self._current_page = page_name
            self.pages[page_name]._show()

        self._tab_set.set_selected_tab(page_name)
        self.event_generate('<<NotebookTabChanged>>') # conform to ttk.Notebook

    def last_page(self):
        return self.pages[self._pages_order[-1]]

    # Some methods to make this Notebook compatible with the ttk Notebook

    def select(self, page_id=None):
        """Return the name of the currently selected page, otherwise
        selects page_id.
        
        page_id may be an integer or a page name."""
        if page_id is None:
            return self._current_page
        elif isinstance(page_id, int):
            self.change_page(self._pages_order[page_id])
        elif isinstance(page_id, str):
            self.change_page(page_id)

    def index(self, page_name):
        """Return the index of page_name."""
        return self._pages_order.index(page_name)

    def tabs(self):
        """Return a list of page names."""
        return self._pages_order
Esempio n. 28
0
class AssetBuilder(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)

        self.parent = parent
        self.isRunning = False

        self.initUI()

    def initUI(self):

        self.parent.title("ImageMagick caller")
        # self.style = Style()
        # self.style.theme_use("default")
        self.pack(fill=BOTH, expand=1)

        self.mpw = Tkinter.PanedWindow(orient=VERTICAL,
                                       sashwidth=2,
                                       sashrelief=Tkinter.RAISED,
                                       relief=Tkinter.RAISED,
                                       showhandle=True)
        self.mpw.pack(fill=BOTH, expand=1)

        self.topfr = Frame(self.mpw)

        #create a grid 5x4 in to which we will place elements.
        self.topfr.columnconfigure(1, weight=1)
        self.topfr.columnconfigure(2, weight=0)
        self.topfr.columnconfigure(3, weight=0)
        self.topfr.columnconfigure(4, weight=0)
        self.topfr.columnconfigure(5, weight=0)
        self.topfr.rowconfigure(1, weight=1)
        self.topfr.rowconfigure(2, weight=0)
        self.topfr.rowconfigure(3, weight=0)
        self.topfr.rowconfigure(4, weight=0)

        #create the main text are with scrollbars
        xscrollbar = Scrollbar(self.topfr, orient=HORIZONTAL)
        xscrollbar.grid(row=2, column=1, columnspan=4, sticky=E + W)

        yscrollbar = Scrollbar(self.topfr, orient=VERTICAL)
        yscrollbar.grid(row=1, column=5, sticky=N + S)

        self.textarea = Text(self.topfr,
                             wrap=NONE,
                             bd=0,
                             xscrollcommand=xscrollbar.set,
                             yscrollcommand=yscrollbar.set)
        self.textarea.grid(row=1,
                           column=1,
                           columnspan=4,
                           rowspan=1,
                           padx=0,
                           sticky=E + W + S + N)
        self.textarea.bind('<Control-Return>', self.runImageMagickCommand)

        xscrollbar.config(command=self.textarea.xview)
        yscrollbar.config(command=self.textarea.yview)

        # don't use bind - use command, so buttons actions can be disabled
        # [http://www.daniweb.com/software-development/python/threads/69669/tkinter-button-disable- Tkinter Button "Disable" ? | DaniWeb]
        #
        #create the buttons/checkboxes to go along the bottom

        self.clearButton = Button(self.topfr,
                                  text="Clear",
                                  command=self.clearText)
        self.clearButton.grid(row=4, column=1, padx=5, pady=5, sticky=W)
        #~ self.clearButton.bind("<ButtonRelease-1>", self.clearText)

        self.runbutton = Button(self.topfr,
                                text="Run/Call",
                                command=self.runScript,
                                state=Tkinter.DISABLED)
        self.runbutton.grid(row=4, column=3, padx=5, pady=5)
        #~ self.runbutton.bind("<ButtonRelease-1>", self.runScript)

        self.stopbutton = Button(self.topfr,
                                 text="Stop",
                                 command=self.stopScript,
                                 state=Tkinter.DISABLED)
        self.stopbutton.grid(row=4, column=4, padx=5, pady=5)
        #~ self.stopbutton.bind("<ButtonRelease-1>", self.stopScript)

        self.infoVar = StringVar()
        self.infoLabel = Tkinter.Label(
            self.topfr, textvariable=self.infoVar)  #text="[info]")
        self.infoVar.set("[ready]")
        self.infoLabel.grid(row=4, column=2, padx=5, pady=5)

        #tags are used to colorise the text added to the text widget.
        # see self.addTtext and self.tagsForLine
        self.textarea.tag_config("errorstring", foreground="#CC0000")
        self.textarea.tag_config("infostring", foreground="#008800")

        self.addText("#  scriptpath: " + scriptpath + "\n", ("infostring", ))
        self.addText("#    callpath: " + callpath + "\n", ("infostring", ))
        self.addText("# One-line imagemagick call only; \n", ("infostring", ))
        self.addText(
            "#  call is via system (bash); use \\ to separate at newline; \n",
            ("infostring", ))
        #~ self.addText("#  use \\ to separate at newline; \n", ("infostring", ))
        self.addText(
            "#  comments w/ # at start OK; use bmp:- as out (stdout is read and shown here) \n",
            ("infostring", ))
        self.addText(
            "#  Run this Python script from terminal, to set scriptpath (to refer to files in same dir) \n",
            ("infostring", ))
        #~ self.addText("#  use bmp:- as out (stdout is read and shown here) \n", ("infostring", ))
        self.addText(
            "# To call command: click to focus on text editor, and press Ctrl-Return \n",
            ("infostring", ))
        #~ self.addText("#  and press Ctrl-Return \n", ("infostring", ))
        self.addText("\n", ("infostring", ))
        #~ os.chdir( dirname(os.path.realpath(__file__)) )
        #~ self.addText("Path B: " + os.getcwd() + "\n\n", ("infostring", ))

        #~ self.addText("Script is: " + " ".join(scriptcall) + "\n\n", ("infostring", ))
        self.addText(startcmd)
        self.addText(
            "\n"
        )  # one more <Enter> - easier when clicking in textarea for first time

        self.mpw.add(self.topfr)
        # bottom
        self.imgLabel = Tkinter.Label(self.mpw, text="IMG:")  # height=10
        self.mpw.add(self.imgLabel)

        #~ print self.mpw.sash_coord(0)
        self.mpw.sash_mark(0)
        #~ self.mpw.sash("dragto", 0, 1, 10)
        # first MUST update root...: http://www.developpez.net/forums/d263794/autres-langages/python-zope/gui/tkinter/probleme-sash-panedwindows/
        self.parent.update()
        # ... then can sash_place(index, x, y) - y is from y=0 @ top
        self.mpw.sash_place(0, 1, 270)
        # right-click/context menu on textarea:
        self.make_menu(self.parent)
        self.textarea.bind("<Button-3><ButtonRelease-3>", self.show_menu)

    def tagsForLine(self, line):
        """return a tuple of tags to be applied to the line of text 'line'
           when being added to the text widet"""
        l = line.lower()
        if "error" in l or "traceback" in l:
            return ("errorstring", )
        return ()

    def addText(self, str, tags=None):
        """Add a line of text to the textWidget. If tags is None then
        self.tagsForLine will be used to assign tags to the line"""
        self.textarea.insert(INSERT, str, tags or self.tagsForLine(str))
        self.textarea.yview(END)

    def clearText(self, event):
        """Clear all the text from the text widget"""
        self.textarea.delete("1.0", END)
        print "isAlive:", self.worker.isAlive(), ", isRunning:", self.isRunning

    def moveCursorToEnd(self):
        """move the cursor to the end of the text widget's text"""
        self.textarea.mark_set("insert", END)

    def runImageMagickCommand(self, event):
        #~ print "runImageMagickCommand"
        # indicate
        self.infoVar.set("[working]")
        # must update here too - otherwise this change not visible:
        self.infoLabel.update_idletasks()
        # fromstring: "Note that this function decodes pixel data, not entire images.
        # If you have an entire image file in a string, wrap it
        # in a StringIO object, and use open to load it."
        #~ cmdstr = "convert -size 200x100 xc:red bmp:-"
        # "Where 1.0 means first line, zeroth character (ie before the first!)
        # is the starting position and END is the ending position."
        cmdstr = self.textarea.get(1.0, END)
        print "cmdstr " + cmdstr
        #~ ims = os.popen(cmdstr).read() # in sh on Linux, not bash
        #~ ims = subprocess.Popen(cmdstr, stdout=subprocess.PIPE, shell=True, executable="/bin/bash").stdout.read() # this is in bash
        # use `communicate` instead, to retrieve stderr too:
        # (here must be stderr=subprocess.PIPE, not subprocess.STDOUT,
        # to have it read in separate variable!
        child_proc = subprocess.Popen(cmdstr,
                                      stdout=subprocess.PIPE,
                                      stderr=subprocess.PIPE,
                                      shell=True,
                                      executable="/bin/bash")
        stdout_value, stderr_value = child_proc.communicate()
        rc = child_proc.returncode
        if (rc == 0):  # all is fine with command:
            ims = stdout_value
            imsiobuf = StringIO.StringIO()
            imsiobuf.write(ims)
            imsiobuf.seek(
                0
            )  # must after write! http://stackoverflow.com/questions/1664861/
            img = Image.open(imsiobuf)
            imgwidth, imgheight = img.size  # img.size[0], img.size[1]
            self.infoVar.set("size: " + str(imgwidth) + "x" + str(imgheight))
            #~ pprint.pprint(self.mpw.config())
            #~ print self.imgLabel.winfo_width(), self.imgLabel.winfo_height() # http://stackoverflow.com/questions/3950687/
            labelwidth, labelheight = self.imgLabel.winfo_width(
            ), self.imgLabel.winfo_height()
            finalwidth, finalheight = imgwidth, imgheight
            # find best fit - only handle if image is bigger
            # force floating point operation
            ratio_w = imgwidth * 1.0 / labelwidth
            ratio_h = imgheight * 1.0 / labelheight
            #~ print "imw: %d imh: %d lw: %d lh: %d" % (imgwidth, imgheight, labelwidth, labelheight)
            #~ print "rw: %f rh: %f " % (ratio_w, ratio_h)
            if ((ratio_w > 1.0) or (ratio_h > 1.0)):
                fw1, fh1, fw2, fh2 = 0, 0, 0, 0
                if (ratio_w > 1.0):
                    fw1 = labelwidth
                    fh1 = imgheight / ratio_w
                if (ratio_h > 1.0):
                    fw2 = imgwidth / ratio_h
                    fh2 = labelheight
                f1ok = ((fw1 > 0) and (fh1 > 0) and (fw1 <= labelwidth)
                        and (fh1 <= labelheight))
                f2ok = ((fw2 > 0) and (fh2 > 0) and (fw2 <= labelwidth)
                        and (fh2 <= labelheight))
                #~ print "f1ok: %d fw1: %d fh1: %d " % (f1ok, fw1, fh1)
                #~ print "f2ok: %d fw2: %d fh2: %d " % (f2ok, fw2, fh2)
                if (f1ok):
                    finalwidth, finalheight = fw1, fh1
                elif (f2ok):
                    finalwidth, finalheight = fw2, fh2
                # convert to integers
                finalwidth = int(round(finalwidth))
                finalheight = int(round(finalheight))
                #
            # EXTENT: http://stackoverflow.com/questions/3368740
            imgsz = img.transform((finalwidth, finalheight), Image.EXTENT,
                                  (0, 0, imgwidth, imgheight))
            # Convert the Image object into a TkPhoto object
            tkimage = ImageTk.PhotoImage(image=imgsz)
            self.imgLabel.img = tkimage  # prevent garbage coll.
            # set image to label:
            self.imgLabel.configure(image=tkimage)
        else:  # exit status (rc) not zero - there was a problem
            self.infoVar.set("[ready]")
            # not using stringvar here, since the label
            # could also be an image;
            # see also http://tkinter.unpythonic.net/wiki/PhotoImage for pyimage1
            # http://mail.python.org/pipermail/tutor/2006-November/050922.html:
            # 'setting lbl["image"] = "" worked (as opposed to None, which raises a TclError with the message that pyimage2'
            #~ print stderr_value
            self.imgLabel.configure(image="")  #(image=None)
            self.imgLabel.img = None  # force garbage coll
            self.imgLabel.configure(
                text=stderr_value
            )  # here: 'image "pyimage1" doesn't exist' (if image=None)
            self.imgLabel.update_idletasks()
        # finally:
        # when Ctrl-Return pressed, we do not actually want Enter inserted:
        # "prevent Tkinter from propagating the event to other handlers":
        return "break"

    # http://stackoverflow.com/questions/8449053/how-to-make-menubar
    def make_menu(self, w):
        global the_menu
        the_menu = Tkinter.Menu(w, tearoff=0)
        the_menu.add_command(label="Cut")
        the_menu.add_command(label="Copy")
        the_menu.add_command(label="Paste")
        the_menu.add_command(label="Delete")

    def show_menu(self, e):
        global the_menu
        w = e.widget
        the_menu.entryconfigure("Cut",
                                command=lambda: w.event_generate("<<Cut>>"))
        the_menu.entryconfigure("Copy",
                                command=lambda: w.event_generate("<<Copy>>"))
        the_menu.entryconfigure("Paste",
                                command=lambda: w.event_generate("<<Paste>>"))
        #no <<Delete>> as generic event - there is <<Clear>>
        # http://www.tcl.tk/man/tcl8.5/TkCmd/event.htm
        the_menu.entryconfigure("Delete",
                                command=lambda: w.event_generate("<<Clear>>"))
        the_menu.tk.call("tk_popup", the_menu, e.x_root, e.y_root)

    # these are older; currently inactive here:
    def runScript(self, event):
        if (not (self.isRunning)):
            self.isRunning = True
            self.worker = threading.Thread(target=self.runScriptThread,
                                           args=(event, ))
            self.worker.start()

    def runScriptThread(self, event):
        """callback from the run/call button"""
        self.moveCursorToEnd()
        self.addText("Calling script %s\n" % (str(datetime.now())),
                     ("infostring", ))

        #~ cmdlist = filter(lambda x: x if x else None,
        #~ [pythonpath, mainpath, self.verboseVar.get(), self.forceVar.get()])
        cmdlist = scriptcall

        self.addText(" ".join(cmdlist) + "\n", ("infostring", ))

        self.proc = subprocess.Popen(cmdlist,
                                     stdout=subprocess.PIPE,
                                     stderr=subprocess.STDOUT,
                                     universal_newlines=True,
                                     preexec_fn=os.setsid)

        while True:
            line = self.proc.stdout.readline()
            if not line:
                break
            self.addText(line)
            #this triggers an update of the text area, otherwise it doesn't update
            self.textarea.update_idletasks()

        self.isRunning = False
        self.addText("Script Finished %s\n" % (str(datetime.now())),
                     ("infostring", ))
        self.addText("*" * 80 + "\n", ("infostring", ))

    def stopScript(self, event):
        """callback from the stop button"""
        #~ os.kill(signal.CTRL_C_EVENT, 0)
        #~ os.kill(self.proc.pid, signal.CTRL_C_EVENT) # AttributeError: 'module' object has no attribute 'CTRL_C_EVENT'
        #~ os.kill(self.proc.pid, signal.SIGTERM)
        os.killpg(self.proc.pid, signal.SIGTERM)
        self.proc.terminate()
        self.proc.kill()
        print self.worker.isAlive()  # True here
Esempio n. 29
0
    def BuildMainFrame(self): 
        from Tkinter import Menu, IntVar, StringVar, Toplevel, Listbox, Frame, PanedWindow, Text, Scrollbar, Entry
        from Tkinter import X, N, S, W, E, VERTICAL, TOP, END, DISABLED, RAISED

        menu = Menu(self.master,activeborderwidth=0,bd=0)
        self.master.config(menu=menu)
  
        filemenu = Menu(menu,tearoff=0,bd=1,activeborderwidth=0)
        menu.add_cascade(label="File", underline=0,  menu=filemenu)
        filemenu.add_command(label="New", accelerator='Ctrl+N',command=self.NewCommand)
        filemenu.add_command(label="Open...",accelerator='Ctrl+O', command=self.OpenCommand)
        filemenu.add_command(label="Save as...",accelerator='Ctrl+S', command=self.SaveCommand)
        filemenu.add_separator()
        filemenu.add_command(label="Quit",accelerator='Ctrl+Q', command=self.QuitCommand)

        self.log_on = IntVar()
        self.log_on.set(1)
  
        self.output_to_file = StringVar()
        self.output_to_file.set('n')
 
        scriptmenu = Menu(menu,tearoff=0,bd=1,activeborderwidth=0)
        modulenames = ['vmtkscripts']
        for modulename in modulenames:
            scriptsubmenu = self.BuildScriptMenu(menu,modulename)
            if scriptsubmenu:
                scriptmenu.add_cascade(label=modulename,menu=scriptsubmenu)
 
        editmenu = Menu(menu,tearoff=0,bd=1,activeborderwidth=0)
        menu.add_cascade(label="Edit",underline=0,  menu=editmenu)
        editmenu.add_cascade(label="Insert script",menu=scriptmenu)
        editmenu.add_command(label="Insert file name", accelerator='Ctrl+F',command=self.InsertFileName)
        editmenu.add_separator()
        editmenu.add_command(label="Clear input", command=self.ClearInputCommand)
        editmenu.add_command(label="Clear output", command=self.ClearOutputCommand)
        editmenu.add_command(label="Clear all", command=self.ClearAllCommand)
        editmenu.add_separator()
        editmenu.add_checkbutton(label="Log", variable=self.log_on)
        editmenu.add_separator()
        editmenu.add_radiobutton(label="No output to file", variable=self.output_to_file,value='n')
        editmenu.add_radiobutton(label="Write output to file", variable=self.output_to_file,value='w')
        editmenu.add_radiobutton(label="Append output to file", variable=self.output_to_file,value='a')
        editmenu.add_command(label="Output file...", command=self.OutputFileCommand)

        runmenu = Menu(menu,tearoff=0,bd=1,activeborderwidth=0)
        menu.add_cascade(label="Run", underline=0, menu=runmenu)
        runmenu.add_command(label="Run all", command=self.RunAllCommand)
        runmenu.add_command(label="Run current line", command=self.RunLineCommand)
        runmenu.add_command(label="Run selection", command=self.RunSelectionCommand)
       
        helpmenu = Menu(menu,tearoff=0,bd=1,activeborderwidth=0)
        menu.add_cascade(label="Help", underline=0, menu=helpmenu)
        helpmenu.add_command(label="Help", underline=0, accelerator='F1',command=self.ShowHelpCommand)
        helpmenu.add_command(label="About", underline=0, command=self.AboutCommand)

        self.master.bind("<Control-KeyPress-q>", self.QuitHandler)
        self.master.bind("<Control-KeyPress-n>", self.NewHandler)
        self.master.bind("<Control-KeyPress-o>", self.OpenHandler)
        self.master.bind("<Control-KeyPress-s>", self.SaveHandler)
        self.master.bind("<Control-KeyPress-f>", self.InsertFileNameHandler)
        self.master.bind("<KeyPress-F1>", self.ShowHelpHandler)
        self.master.bind("<KeyPress>", self.KeyPressHandler)
        
        self.wordIndex = ['1.0','1.0']
               
        self.suggestionswindow = Toplevel(bg='#ffffff',bd=0,height=50,width=600,highlightthickness=0,takefocus=True)
        self.suggestionswindow.overrideredirect(1)
        self.suggestionslist = Listbox(self.suggestionswindow,bg='#ffffff',bd=1,fg='#336699',activestyle='none',highlightthickness=0,height=9)
        self.suggestionslist.insert(END,"foo")
        self.suggestionslist.pack(side=TOP,fill=X)
        self.suggestionswindow.bind("<KeyPress>", self.TopKeyPressHandler)
        self.suggestionswindow.withdraw()

        self.master.rowconfigure(0,weight=1)
        self.master.columnconfigure(0,weight=1)
        content = Frame(self.master,bd=0,padx=2,pady=2) 
        content.grid(row=0,column=0,sticky=N+S+W+E)
        content.rowconfigure(0,weight=1,minsize=50)
        content.rowconfigure(1,weight=0)
        content.columnconfigure(0,weight=1)

        panes = PanedWindow(content,orient=VERTICAL,bd=1,sashwidth=8,sashpad=0,sashrelief=RAISED,showhandle=True)
        panes.grid(row=0,column=0,sticky=N+S+W+E)

        frame1 = Frame(panes,bd=0) 
        frame1.grid(row=0,column=0,sticky=N+S+W+E)
        frame1.columnconfigure(0,weight=1)
        frame1.columnconfigure(1,weight=0)
        frame1.rowconfigure(0,weight=1)

        panes.add(frame1,height=300,minsize=20)        

        frame2 = Frame(panes,bd=0) 
        frame2.grid(row=1,column=0,sticky=N+S+W+E)
        frame2.columnconfigure(0,weight=1)
        frame2.columnconfigure(1,weight=0)
        frame2.rowconfigure(0,weight=1)
        
        panes.add(frame2,minsize=20) 
 
        self.text_input = Text(frame1, bg='#ffffff',bd=1,highlightthickness=0)

        self.text_input.bind("<KeyPress>", self.KeyPressHandler)
        self.text_input.bind("<Button-3>", self.PopupHandler)
        self.text_input.bind("<Control-Return>", self.RunKeyboardHandler)
 
        self.input_scrollbar = Scrollbar(frame1,orient=VERTICAL,command=self.text_input.yview)
        self.text_input["yscrollcommand"] = self.input_scrollbar.set    

        self.text_output = Text(frame2,state=DISABLED,bd=1,bg='#ffffff',highlightthickness=0)
        
        self.output_scrollbar = Scrollbar(frame2,orient=VERTICAL,command=self.text_output.yview)
        self.text_output["yscrollcommand"] = self.output_scrollbar.set    
      
        self.text_entry = Entry(content,bd=1,bg='#ffffff',state=DISABLED,highlightthickness=0)

        self.text_input.focus_set()

        self.text_input.grid(row=0,column=0,sticky=N+S+W+E)
        self.input_scrollbar.grid(row=0,column=1,sticky=N+S+W+E)
        self.text_output.grid(row=0,column=0,sticky=N+S+W+E)
        self.output_scrollbar.grid(row=0,column=1,sticky=N+S+W+E)
        self.text_entry.grid(row=1,column=0,sticky=N+S+W+E)

        self.popupmenu = Menu(self.text_input, tearoff=1, bd=0)
        self.popupmenu.add_command(label="Context help", command=self.ShowHelpCommand)
        self.popupmenu.add_cascade(label="Insert script",menu=scriptmenu)
        self.popupmenu.add_command(label="Insert file name...", command=self.InsertFileName)
        self.popupmenu.add_separator()
        self.popupmenu.add_command(label="Run all", command=self.RunAllCommand)
        self.popupmenu.add_command(label="Run current line", command=self.RunLineCommand)
        self.popupmenu.add_command(label="Run selection", command=self.RunSelectionCommand)

        self.output_stream = TkPadOutputStream(self.text_output)
        self.input_stream = TkPadInputStream(self.text_entry,self.output_stream)
Esempio n. 30
0
	def __init__(self, master):
		
		
		self.currentFileName = ""
		self.entDir = "/dev/shm/wikinews/entities/"
		self.llDir= "/dev/shm/wikinews/lang_links/"
		self.boolFileLoad = False
		self.entFiles = []
		self.llFiles = []
		self.wikinewsBaseURL = "http://en.wikinews.org/?curid="

		frame = Frame(master)
		frame.pack()
		
		frame.columnconfigure(1, weight=1)
		frame.columnconfigure(3, pad=7)
		frame.rowconfigure(3, weight=1)
		frame.rowconfigure(5, pad=7)
		
		self.lbEntFile = Label(frame, text="entities dir: ")
		self.lbEntFile.grid(row=0, column=0)
		
		self.lbLLFile = Label(frame, text="lang links dir: ")
		self.lbLLFile.grid(row=1, column=0)
		
		self.txtEntFile =Text(frame, height=1, width=40)
		self.txtEntFile.insert(INSERT, self.entDir)
		self.txtEntFile.grid(row=0, column=1)
		
		self.txtLLFile =Text(frame, height=1, width=40)
		self.txtLLFile.insert(INSERT, self.llDir)
		self.txtLLFile.grid(row=1, column=1)
		
		self.butLoad= Button(frame, text ="Load", command = self.readInputFiles)
		self.butLoad.grid(row=0, column=2, rowspan=2)
		
		
		
		self.scrollbar = Scrollbar(frame)
		self.lstArticles = Listbox(frame, yscrollcommand = self.scrollbar.set, width=50, height=20)
		self.lstArticles.grid( row=2, column=0, columnspan=2, sticky=W)
		self.lstArticles.bind("<<ListboxSelect>>", self.onArticleSelect)
		
		self.scrollbar.grid(row=2, column=3, sticky=W)
		self.scrollbar.config( command = self.lstArticles.yview )
		
		self.butOpenBrowser = Button(frame, text="View article in browser", command=self.openInFirefox)
		self.butOpenBrowser.grid(row=3, column=0)
	
	
	
		self.lblSearchTitle = Label(frame, text="search article ID: ")
		self.lblSearchTitle.grid(row=4, column=0, sticky=E)
		
		self.txtSearchTitle = Text(frame, height=1, width=30)
		self.txtSearchTitle.grid(row=4, column=1)
		
		
		self.butSearchTitle = Button(frame, text="Go", command=self.searchTitle)
		self.butSearchTitle.grid(row=4, column=2, sticky=W)
		
		self.scrollbar2 = Scrollbar(frame)		
		self.lstContent = Listbox(frame, yscrollcommand=self.scrollbar2.set, width=100, height=20)
		self.lstContent.grid(row=0, column=3, rowspan=5)
		self.lstContent.bind("<<ListboxSelect>>", self.onEntitySelect)
		self.scrollbar2.grid(row=0, column=3, sticky=W)
		self.scrollbar2.config( command = self.lstContent.yview )
		
		
		self.scrollbar3 = Scrollbar(frame)		
		self.lstWikiLinks = Listbox(frame, yscrollcommand=self.scrollbar3.set, width=70, height=13)
		self.lstWikiLinks.grid(row=5, column=3, sticky=W)
		self.scrollbar3.grid(row=5, column=3, sticky=W)
		self.scrollbar3.config( command = self.lstWikiLinks.yview )
Esempio n. 31
0
    def interface_selection(self, root):
        """!Creation de l'interface de selection des objets resultats"""
        f = Frame(root, relief='sunken', borderwidth=1)
        Label(f, text="   ").grid(row=0,
                                  column=0,
                                  columnspan=3,
                                  sticky='w' + 'e')

        # menu de selection du resultat numerique
        Label(f, text=u"Base numérique d'expansion").grid(row=1,
                                                          column=0,
                                                          sticky='e')
        self.var_resu_num = StringVar()
        self.menu_resu_num = MyMenu(f,
                                    options=self.objects.get_mode_meca_name(),
                                    var=self.var_resu_num,
                                    cmd=self.num_changed)
        self.menu_resu_num.grid(row=1, column=1, sticky='ew')

        # menu de selection du resultat experimental
        Label(f, text=u"Résultat expérimental").grid(row=1,
                                                     column=2,
                                                     sticky='e')
        self.var_resu_exp = StringVar()
        self.menu_resu_exp = MyMenu(f,
                                    options=self.objects.get_resultats_name(),
                                    var=self.var_resu_exp,
                                    cmd=self.exp_changed)
        self.menu_resu_exp.grid(row=1, column=3, sticky='ew')

        self.var_resu1 = StringVar()
        self.menu_resu1 = MyMenu(f,
                                 options=self.objects.get_resultats_name(),
                                 var=self.var_resu1,
                                 cmd=self.visu1_changed)

        self.var_resu2 = StringVar()
        self.menu_resu2 = MyMenu(f,
                                 options=self.objects.get_resultats_name(),
                                 var=self.var_resu2,
                                 cmd=self.visu2_changed)

        # La norme pourrait etre utilisee pour le MAC, mais elle ne l'est pas actuellement : on commente ces lignes
        # menu de selection de la norme numerique
        # Label(f,text="Norme numérique").grid(row=2,column=0,sticky='e')
        # self.var_norme_num = StringVar()
        # self.menu_norme_num = MyMenu( f, options = self.objects.get_matr_norme(),
        # var = self.var_norme_num, cmd = self.num_changed )
        # self.menu_norme_num.grid(row=2, column=1, sticky='ew')
        #
        # menu de selection de la norme experimentale
        # Label(f,text="Norme experimentale").grid(row=2,column=2,sticky='e')
        # self.var_norme_exp = StringVar()
        # self.menu_norme_exp = MyMenu( f, options = self.objects.get_matr_norme(),
        # var = self.var_norme_exp, cmd = self.exp_changed )
        # self.menu_norme_exp.grid(row=2, column=3, sticky='ew')
        # Type de resu experimental (dyna_harmo ou modes)
        Label(f, text=u"Type de résultat expérimental").grid(row=1,
                                                             column=4,
                                                             columnspan=2)
        Radiobutton(f,
                    text=u"résultat harmonique",
                    value='harmo',
                    variable=self.type_resu_exp).grid(row=2, column=4)
        Radiobutton(f,
                    text=u"modes",
                    value='mode',
                    variable=self.type_resu_exp).grid(row=2, column=5)

        Label(f, text="   ").grid(row=3,
                                  column=0,
                                  columnspan=3,
                                  sticky='w' + 'e')
        f.columnconfigure(0, weight=1)
        f.columnconfigure(1, weight=4)
        f.columnconfigure(3, weight=4)

        return f
Esempio n. 32
0
class FilePickEdit(Frame):
    
    def __init__(self, master, file_mask, default_file, edit_height = None, user_onChange = None, 
                 rename_on_edit=0, font = None, coloring=True, allowNone=False, highlighter=None, directory='.'):
        '''
            file_mask: file mask (e.g. "*.foo") or list of file masks (e.g. ["*.foo", "*.abl"])
        '''
        self.master = master
        self.directory = directory
        self.user_onChange = user_onChange
        Frame.__init__(self, master)
        row = 0
        self.unmodified = True
        self.allowNone = allowNone
        self.file_extension = ""
        if type(file_mask) != list:
            file_mask = [file_mask]
        if "." in file_mask[0]:
            self.file_extension = file_mask[0][file_mask[0].rfind('.'):]
        # read filenames
        self.file_mask = file_mask
        self.updateList()
        # filename frame
        self.list_frame = Frame(self)
        self.list_frame.grid(row=row, column=0, sticky="WE")
        self.list_frame.columnconfigure(0, weight=1)
        # create list
        self.picked_name = StringVar(self)
        self.makelist()
        # refresh button
        self.refresh_button = Button(self.list_frame, text='<- refresh', command=self.refresh, height=1)
        self.refresh_button.grid(row=0, column=1, sticky='E')        
        # save button
        self.save_button = Button(self.list_frame, text="save", command=self.save, height=1)
        self.save_button.grid(row=0, column=2, sticky="E")
        # editor
        row += 1
        if coloring:
            self.editor = SyntaxHighlightingText(self, self.onEdit, highlighter=highlighter)
        else:
            self.editor = ScrolledText2(self, self.onEdit)
        if font != None:
            self.editor.configure(font=font)
        if edit_height is not None:
            self.editor.configure(height=edit_height)
        self.editor.grid(row=row, column=0, sticky="NEWS")
        self.rowconfigure(row, weight=1)
        self.columnconfigure(0, weight=1)
        # option to change filename on edit
        row += 1
        self.options_frame = Frame(self)
        self.options_frame.grid(row=row, column=0, sticky=W)
        self.rename_on_edit = IntVar()
        self.cb = Checkbutton(self.options_frame, text="rename on edit", variable=self.rename_on_edit)
        self.cb.pack(side=LEFT)
        self.cb.configure(command=self.onChangeRename)
        self.rename_on_edit.set(rename_on_edit)
        # filename frame
        row += 1
        self.filename_frame = Frame(self)
        self.filename_frame.grid(row=row, column=0, sticky="WE")
        self.filename_frame.columnconfigure(0, weight=1)
        # save as filename
        self.save_name = StringVar(self)
        self.save_edit = Entry(self.filename_frame, textvariable = self.save_name)
        self.save_edit.grid(row=0, column=0, sticky="WE")
        self.save_name.trace("w", self.onSaveChange)
        # pick default if applicableButton
        self.select(default_file)
        self.row = row
        
    def setDirectory(self, directory, keep=False):
        self.directory = directory
        self.updateList()
        self.makelist()
#         menu = self.list["menu"] scrolledlist
#         menu = self.list.listbox#["scrolledlist"]
#         menu.delete(0, 'end')
        # add the new ones
#         for filename in self.files:
#             menu.add_command(label=filename, command=_setit(self.picked_name, filename, None))
        # if keep is true, only the files list will be updated but the content of the
        # text area will not be altered/removed
        if not keep: self.select("")
    
    def refresh(self):
        sel = self.get()
        self.updateList()
        self.select(sel, notify=False)
    
    def reloadFile(self):
        self.editor.delete("1.0", END)
        filename = self.picked_name.get()
        if os.path.exists(os.path.join(self.directory, filename)):
            new_text = file(os.path.join(self.directory, filename)).read()
            if new_text.strip() == "":
                new_text = "// %s is empty\n" % filename;
            new_text = new_text.replace("\r", "")
        else:
            new_text = ""
        self.editor.insert(INSERT, new_text)
        
    def setText(self, txt):
        '''
        Replaces the text in the edit field as by typing
        into it.
        '''
        self.select("")
        if txt.strip() == "":
            txt = "// empty database\n";
        self.editor.insert(INSERT, txt)
        self.onEdit()
        

    def onSelChange(self, name, index=0, mode=0):
        self.reloadFile()
        filename = self.picked_name.get()
        self.save_name.set(filename)
        self.save_edit.configure(state=DISABLED)
        self.unmodified = True
        if self.user_onChange != None:
            self.user_onChange(filename)

    def onSaveChange(self, name, index, mode): pass
#         if self.user_onChange != None:
#             self.user_onChange(self.save_name.get())

    def autoRename(self):
        # modify "save as" name
        filename = self.picked_name.get()
        if filename == "": filename = "new" + self.file_extension # if no file selected, create new filename
        ext = ""
        extpos = filename.rfind(".")
        if extpos != -1: ext = filename[extpos:]
        base = filename[:extpos]
        hpos = base.rfind("-")
        num = 0
        if hpos != -1:
            try:
                num = int(base[hpos+1:])
                base = base[:hpos]
            except:
                pass
        while True:
            num += 1
            filename = "%s-%d%s" % (base, num, ext)
            if not os.path.exists(filename):
                break
        self.save_name.set(filename)
        # user callback
        if self.user_onChange != None:
            self.user_onChange(filename)

    def onEdit(self):
        if self.unmodified == True:
            self.unmodified = False
            # do auto rename if it's enabled or there is no file selected (editing new file)
            if self.rename_on_edit.get() == 1 or self.picked_name.get() == "":
                self.autoRename()
            # enable editing of save as name
            self.save_edit.configure(state=NORMAL)

    def onChangeRename(self):
        # called when clicking on "rename on edit" checkbox
        if self.rename_on_edit.get() == 1:
            if (not self.unmodified) and self.save_name.get() == self.picked_name.get():
                self.autoRename()
        else:
            self.save_name.set(self.picked_name.get())

    def updateList(self):
        self.files = []
        if self.allowNone:
            self.files.append("")
        if os.path.exists(self.directory):
            for filename in os.listdir(self.directory):
                for fm in self.file_mask:
                    if fnmatch(filename, fm):
                        self.files.append(filename)
        self.files.sort()
        if len(self.files) == 0 and not self.allowNone: self.files.append("(no %s files found)" % str(self.file_mask    ))
        

    def select(self, filename, notify=True):
        ''' selects the item given by filename '''
        if filename in self.files:
            if not havePMW:
                self.picked_name.set(filename)
            else:
                self.list.selectitem(self.files.index(filename))
                if notify: self.onSelChange(filename)
        else:
            self.editor.delete("1.0", END)
                

    def makelist(self):
        if havePMW:
            self.list = Pmw.ComboBox(self.list_frame,
                    selectioncommand = self.onSelChange,
                    scrolledlist_items = self.files,
            )
            self.list.grid(row=0, column=0, padx=0, pady=0, sticky="NEWS")
            self.list.component('entryfield').component('entry').configure(state = 'readonly', relief = 'raised')
            self.picked_name = self.list
        else:
            self.list = apply(OptionMenu, (self.list_frame, self.picked_name) + tuple(self.files))
            self.list.grid(row=0, column=0, sticky="NEW")
            self.picked_name.trace("w", self.onSelChange)

    def save(self):
        self.get()

    def set(self, selected_item):
        self.select(selected_item)

    def get(self):
        ''' gets the name of the currently selected file, saving it first if necessary '''
        filename = self.save_name.get()
        if self.unmodified == False:
            self.unmodified = True
            # save the file
            f = file(os.path.join(self.directory, filename), "w")
            f.write(self.editor.get("1.0", END).encode('utf-8'))
            f.close()
            # add it to the list of files
#             if not filename in self.files:
#                 self.files.append(filename)
#                 self.files.sort()
#                 self.list.destroy()
#                 self.makelist()
            # set it as the new pick
            #if havePMW:
            #    self.picked_name.selectitem(self.files.index(filename), 1)
            #else:
            #    self.picked_name.set(filename)
#             self.select(filename)
            self.refresh()
            self.select(filename, notify=False)
            self.save_edit.configure(state=DISABLED)
        return filename

    def get_text(self):
        return self.editor.get("1.0", END)

    def get_filename(self):
        return self.save_name.get()

    def set_enabled(self, state):
        self.editor.configure(state=state)
        if havePMW:
            self.list.component('entryfield_entry').configure(state=state)
#             self.list.component('arrowbutton').configure(state=state)
            self.list.component('arrowbutton').bind('<1>', (lambda a: 'break') if state==DISABLED else self.list._postList)
        else:
            self.list.configure(state=state)
        self.save_button.configure(state=state)
        self.cb.configure(state=state)
        self.save_edit.configure(state=state)
Esempio n. 33
0
class TabbedPageSet(Frame):
    """A Tkinter tabbed-pane widget.

    Constains set of 'pages' (or 'panes') with tabs above for selecting which
    page is displayed. Only one page will be displayed at a time.

    Pages may be accessed through the 'pages' attribute, which is a dictionary
    of pages, using the name given as the key. A page is an instance of a
    subclass of Tk's Frame widget.

    The page widgets will be created (and destroyed when required) by the
    TabbedPageSet. Do not call the page's pack/place/grid/destroy methods.

    Pages may be added or removed at any time using the add_page() and
    remove_page() methods.

    """
    class Page(object):
        """Abstract base class for TabbedPageSet's pages.

        Subclasses must override the _show() and _hide() methods.

        """
        uses_grid = False

        def __init__(self, page_set):
            self.frame = Frame(page_set, borderwidth=2, relief=RAISED)

        def _show(self):
            raise NotImplementedError

        def _hide(self):
            raise NotImplementedError

    class PageRemove(Page):
        """Page class using the grid placement manager's "remove" mechanism."""
        uses_grid = True

        def _show(self):
            self.frame.grid(row=0, column=0, sticky=NSEW)

        def _hide(self):
            self.frame.grid_remove()

    class PageLift(Page):
        """Page class using the grid placement manager's "lift" mechanism."""
        uses_grid = True

        def __init__(self, page_set):
            super(TabbedPageSet.PageLift, self).__init__(page_set)
            self.frame.grid(row=0, column=0, sticky=NSEW)
            self.frame.lower()

        def _show(self):
            self.frame.lift()

        def _hide(self):
            self.frame.lower()

    class PagePackForget(Page):
        """Page class using the pack placement manager's "forget" mechanism."""
        def _show(self):
            self.frame.pack(fill=BOTH, expand=True)

        def _hide(self):
            self.frame.pack_forget()

    def __init__(self, parent, page_names=None, page_class=PageLift,
                 n_rows=1, max_tabs_per_row=5, expand_tabs=False,
                 **kw):
        """Constructor arguments:

        page_names -- A list of strings, each will be the dictionary key to a
        page's widget, and the name displayed on the page's tab. Should be
        specified in the desired page order. The first page will be the default
        and first active page. If page_names is None or empty, the
        TabbedPageSet will be initialized empty.

        n_rows, max_tabs_per_row -- Parameters for the TabSet which will
        manage the tabs. See TabSet's docs for details.

        page_class -- Pages can be shown/hidden using three mechanisms:

        * PageLift - All pages will be rendered one on top of the other. When
          a page is selected, it will be brought to the top, thus hiding all
          other pages. Using this method, the TabbedPageSet will not be resized
          when pages are switched. (It may still be resized when pages are
          added/removed.)

        * PageRemove - When a page is selected, the currently showing page is
          hidden, and the new page shown in its place. Using this method, the
          TabbedPageSet may resize when pages are changed.

        * PagePackForget - This mechanism uses the pack placement manager.
          When a page is shown it is packed, and when it is hidden it is
          unpacked (i.e. pack_forget). This mechanism may also cause the
          TabbedPageSet to resize when the page is changed.

        """
        Frame.__init__(self, parent, **kw)

        self.page_class = page_class
        self.pages = {}
        self._pages_order = []
        self._current_page = None
        self._default_page = None

        self.columnconfigure(0, weight=1)
        self.rowconfigure(1, weight=1)

        self.pages_frame = Frame(self)
        self.pages_frame.grid(row=1, column=0, sticky=NSEW)
        if self.page_class.uses_grid:
            self.pages_frame.columnconfigure(0, weight=1)
            self.pages_frame.rowconfigure(0, weight=1)

        # the order of the following commands is important
        self._tab_set = TabSet(self, self.change_page, n_rows=n_rows,
                               max_tabs_per_row=max_tabs_per_row,
                               expand_tabs=expand_tabs)
        if page_names:
            for name in page_names:
                self.add_page(name)
        self._tab_set.grid(row=0, column=0, sticky=NSEW)

        self.change_page(self._default_page)

    def add_page(self, page_name):
        """Add a new page with the name given in page_name."""
        if not page_name:
            raise InvalidNameError("Invalid TabPage name: '%s'" % page_name)
        if page_name in self.pages:
            raise AlreadyExistsError(
                "TabPage named '%s' already exists" % page_name)

        self.pages[page_name] = self.page_class(self.pages_frame)
        self._pages_order.append(page_name)
        self._tab_set.add_tab(page_name)

        if len(self.pages) == 1: # adding first page
            self._default_page = page_name
            self.change_page(page_name)

    def remove_page(self, page_name):
        """Destroy the page whose name is given in page_name."""
        if not page_name in self.pages:
            raise KeyError("No such TabPage: '%s" % page_name)

        self._pages_order.remove(page_name)

        # handle removing last remaining, default, or currently shown page
        if len(self._pages_order) > 0:
            if page_name == self._default_page:
                # set a new default page
                self._default_page = self._pages_order[0]
        else:
            self._default_page = None

        if page_name == self._current_page:
            self.change_page(self._default_page)

        self._tab_set.remove_tab(page_name)
        page = self.pages.pop(page_name)
        page.frame.destroy()

    def change_page(self, page_name):
        """Show the page whose name is given in page_name."""
        if self._current_page == page_name:
            return
        if page_name is not None and page_name not in self.pages:
            raise KeyError("No such TabPage: '%s'" % page_name)

        if self._current_page is not None:
            self.pages[self._current_page]._hide()
        self._current_page = None

        if page_name is not None:
            self._current_page = page_name
            self.pages[page_name]._show()

        self._tab_set.set_selected_tab(page_name)
Esempio n. 34
0
    def __init__(self, filename, parentnotebook):
        """Create a new EditTab
        
        Argument
        filename -- name and path to the file being edited
        parentnotebook -- the NoteBook in which this tab will be added
        
        """
        Frame.__init__(self)
        self._filename = filename
        self._parentnotebook = parentnotebook
        self._inputs = []
        self.path = os.path.dirname(filename)
        self._dirty = False
        parentnotebook.add(self, state='normal')
        self._setLabel()

        #Set up GUI
        self.rowconfigure(0, weight=1)
        self.columnconfigure(0, weight=1)

        vscroll = Scrollbar(self, orient=VERTICAL)
        self._vscroll = vscroll
        vscroll.grid(row=0, column=1, sticky=N + S)
        hscroll = Scrollbar(self, orient=HORIZONTAL)
        self._hscroll = hscroll
        hscroll.grid(row=1, column=0, sticky=E + W)

        canvas = Canvas(self,
                        yscrollcommand=vscroll.set,
                        xscrollcommand=hscroll.set)
        self._canvas = canvas
        canvas.grid(row=0, column=0, padx=5, pady=5, sticky=NSEW)

        vscroll['command'] = canvas.yview
        hscroll['command'] = canvas.xview

        scrollframe = Frame(canvas)
        self._scrollframe = scrollframe
        canvas.create_window(0, 0, window=scrollframe, anchor=N + W)

        scrollframe.rowconfigure(0, weight=1)
        scrollframe.columnconfigure(0, weight=1)

        self._mainframe = Frame(scrollframe)
        self._mainframe.grid(row=0, column=0, padx=5, pady=5, sticky=NSEW)

        cf = Frame(scrollframe)
        self._control_frame = cf
        cf.grid(row=1, column=0, padx=5, pady=5, sticky=E)
        b = Button(cf,
                   text=lang[lng.txtCopyImages],
                   command=self._ehCopyImages)
        self._btnCopy = b
        b.grid(row=0, column=0, padx=5, pady=5)
        b = Button(cf,
                   text=lang[lng.txtSave],
                   command=self._ehSave,
                   state=DISABLED)
        self._btnSave = b
        b.grid(row=0, column=1, padx=5, pady=5)
        b = Button(cf, text=lang[lng.txtClose], command=self._ehClose)
        b.grid(row=0, column=2, padx=5, pady=5)

        parentnotebook.after_idle(self._setCanvas)
Esempio n. 35
0
    def preUI(self):
        self.frame0.destroy()
        self.initUIRoot()
        frame1 = Frame(self.frame0, relief=RAISED, borderwidth=1)
        frame1.pack(fill=BOTH, expand=False)

        frame2 = Frame(self.frame0, relief=RAISED, borderwidth=1)
        frame2.pack(fill=BOTH, expand=True)

        frame1.columnconfigure(1, weight=1)
        # frame1.columnconfigure(9, weight=1)
        frame1.columnconfigure(10, pad=7)
        frame1.rowconfigure(5, weight=1)
        frame1.rowconfigure(5, pad=7)

        frame2.columnconfigure(8, pad=7, weight=1)
        frame2.rowconfigure(8, pad=7)

        lbl = Label(frame1, text="催化剂性质")
        lbl.grid(row=0, column=0, columnspan=8, rowspan=1, sticky=W, pady=4, padx=5)
        # K_Mat_Tree = ttk.Treeview(frame1)
        # K_Mat_Tree['show'] = 'headings'
        # K_Mat_Tree = self.makeMatrixUI(7, K_Mat_Tree, sourceDate.K_model)
        # K_Mat_Tree.grid(row=1, column=0, columnspan=6, rowspan=5, sticky=E + W + S + N, pady=4, padx=5)
        K_Mat_Tree = Text(frame1, height=18)
        self.makeMatrixUI(K_Mat_Tree, self.catObj)
        K_Mat_Tree.configure(state='normal')
        K_Mat_Tree.grid(row=1, column=0, columnspan=6, rowspan=6, sticky=E + W + S + N, pady=4, padx=5)

        lbl = Label(frame1, text="优化方法:")
        lbl.grid(row=0, column=6, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5)
        txt = Entry(frame1)
        txt.insert(0, self.catObj.optMethod)
        txt.configure(state='readonly')
        txt.grid(row=0, column=8, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5)

        lbl = Label(frame1, text="集总数:")
        lbl.grid(row=1, column=6, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5)
        txt = Entry(frame1)
        txt.insert(0, self.catObj.n)
        txt.configure(state='readonly')
        txt.grid(row=1, column=8, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5)

        lbl = Label(frame1, text="精确度:")
        lbl.grid(row=2, column=6, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5)
        txt = Entry(frame1)
        txt.insert(0, self.catObj.tol)
        txt.configure(state='readonly')
        txt.grid(row=2, column=8, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5)

        cateDetailButton = Button(frame1, text="查看催化剂详情")
        cateDetailButton.grid(row=3, column=8)
        # ________________________________________
        lbl = Label(frame2, text="待预测条件")
        lbl.grid(row=0, column=0, sticky=W, columnspan=5, rowspan=1, pady=4, padx=5)

        lbl = Label(frame2, text="初始组成(<1 英文逗号分割):")
        lbl.grid(row=1, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.Y0_input = Entry(frame2)
        self.Y0_input.grid(row=1, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="温度(K)")
        lbl.grid(row=2, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.T_input = Entry(frame2)
        if not self.catObj.withTemp:
            self.T_input.insert(0, self.catObj.t)
            self.T_input.configure(state='readonly')
        self.T_input.grid(row=2, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="压力(KPa)")
        lbl.grid(row=3, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.p_input = Entry(frame2)
        self.p_input.grid(row=3, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="剂油比")
        lbl.grid(row=4, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.roil_input = Entry(frame2)
        self.roil_input.grid(row=4, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="停留时间(s)")
        lbl.grid(row=5, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.t_input = Entry(frame2)
        self.t_input.grid(row=5, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="碱氮含量(<1)")
        lbl.grid(row=6, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.yn_input = Entry(frame2)
        self.yn_input.insert(0, 0.0)
        self.yn_input.grid(row=6, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="重芳烃含量(<1)")
        lbl.grid(row=7, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.ya_input = Entry(frame2)
        self.ya_input.grid(row=7, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="微分方程步长")
        lbl.grid(row=8, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.step_input = Entry(frame2)
        self.step_input.insert(0, 0.1)
        self.step_input.grid(row=8, column=2, columnspan=3, rowspan=1, sticky=E, pady=4, padx=5)
        self.preResult_LB = Listbox(frame2)
        self.preResult_LB.grid(row=1, column=7, columnspan=2, rowspan=6, pady=4, padx=5)

        cateDetailButton = Button(frame2, text="预测", command=self.doPre)
        cateDetailButton.grid(row=8, column=7, columnspan=2)
Esempio n. 36
0
class Interface(Frame):

    def __init__(self, parent):
        Frame.__init__(self, parent)   

        self.parent = parent
        self.controller = Controller(TKRenderer())
        self.initUI()
    
    def initUI(self):
      
        self.parent.title("Kinect Human Finder")
        self.style = Style()
        self.style.theme_use("default")
        self.pack(fill=BOTH, expand=1)
        self.columnconfigure(1, weight=1, minsize=100, pad=10)
        self.rowconfigure(1, weight=1, minsize=100, pad=10)
        
        self.initHistoryFrame()
        self.initImageFrame()        
        self.initMenuFrame()
        
    def initHistoryFrame(self):    
        
        self.historyFrame = Frame(self, height=100, width=200, borderwidth=2)
        
        self.backButton = Button(self.historyFrame, text="Back", command=lambda: self.showImage(self.controller.goBack()))
        self.backButton.pack(side=LEFT, padx=5, pady=5)
        
        self.nextButton = Button(self.historyFrame, text="Next", command=lambda: self.showImage(self.controller.goNext()))
        self.nextButton.pack(side=LEFT, padx=5, pady=5)
        
        self.openButton = Button(self.historyFrame, text="Open", command=self.openFile)
        self.openButton.pack(side=LEFT, padx=(490,0), ipadx = 10, pady=5)

        self.historyFrame.grid(row=0, column=0, columnspan=2, sticky=W)
        
    def initImageFrame(self):
        
        self.imageFrame = Frame(self, borderwidth=2)
        if not os.path.exists(WELCOME_IMAGE_PATH):
            print "Welcome image not found at:" + WELCOME_IMAGE_PATH
        else:
            if not os.path.exists(SECOND_WELCOME_IMAGE_PATH):
                print "Second welcome image not found at:" + SECOND_WELCOME_IMAGE_PATH
            else:
                self.showImage(self.controller.loadImage(WELCOME_IMAGE_PATH))
                self.showImage(self.controller.loadImage(SECOND_WELCOME_IMAGE_PATH))

        
    def initMenuFrame(self):
        
        self.menuFrame = Frame(self, width=400)
        self.menuFrame.grid(row=1, column=1, sticky=N + E + S + W)
        self.menuFrame.columnconfigure(0, weight=0, minsize=100, pad=10)

        binaryText = Label(self.menuFrame, text="Mapa binarna")
        preprocessingText = Label(self.menuFrame, text="Preprocessing")
        cogText = Label(self.menuFrame, text="Środek ciężkości")
        snakeText = Label(self.menuFrame, text="Metoda aktywnych konturów")
        
        # Parameters
        self.binarySpinFrame = self.createBinarySpinBoxes()
        self.binarySpinFrame.grid(row=1, column=0, padx=36, pady=(5,15), stick=N + W)

        self.preprocessFrame = self.createPreprocessBoxes()
        self.preprocessFrame.grid(row=3, column=0, padx=36, pady=(0,15), stick=N + W)

        self.cogSpinFrame = self.createCogSpinBoxes()
        self.cogSpinFrame.grid(row=5, column=0, padx=36, pady=(0,15), stick=N + W)

        self.snakeSpinFrame = self.createSnakeSpinBoxes()
        self.snakeSpinFrame.grid(row=7, column=0, padx=36, pady=(0,15), stick=N + W)

        binaryText.grid(row=0, padx=15, stick=N + W)
        preprocessingText.grid(row=2, padx=15, stick=N + W)
        cogText.grid(row=4, padx=15, stick=N + W)
        snakeText.grid(row=6, padx=15, stick=N + W)
        
        # Buttons
        self.binaryButton = Button(self.menuFrame, text="Generuj mapą binarną",
            command=lambda: self.showImage(self.controller.generateBinaryMotionBitmap(
                int(self.binaryThreshold.get())
            )))

        self.preprocessButton = Button(self.menuFrame, text="Preprocessing",
            command=lambda: self.showImage(self.controller.getPreprocessedBitmap(
                int(self.binaryThreshold.get()),
                int(self.erosion.get()), int(self.densityCoefficient.get())
            )))

        self.massCenterButton = Button(self.menuFrame, text="Pokaż centrum masy",
            command=lambda: self.showImage(self.controller.getBitmapWithMassCenter(
                int(self.binaryThreshold.get()),
                int(self.erosion.get()), int(self.densityCoefficient.get()),
                int(self.distanceFromCenterCoefficient.get())
            )))

        self.snakeButton = Button(self.menuFrame, text="Wyznacz kontur",
            command=lambda: self.showImage(self.controller.getTheSnake(
                int(self.binaryThreshold.get()),
                int(self.erosion.get()), int(self.densityCoefficient.get()),
                int(self.distanceFromCenterCoefficient.get()),
                int(self.snakeValue1.get()), int(self.snakeValue2.get()), int(self.snakeValue3.get())
            )))

        self.binaryButton.grid(row=8, column=0, padx=15, pady=(20,0), stick=N + W)
        self.preprocessButton.grid(row=9, column=0, padx=15, pady=(20,0), stick=N + W)
        self.massCenterButton.grid(row=10, column=0, padx=15, pady=(20,0), stick=N + W)
        self.snakeButton.grid(row=11, column=0, padx=15, pady=(20,0), stick=N + W)

    def createBinarySpinBoxes(self):
        frame = Frame(self.menuFrame, width=300)

        from_ = 0
        to = 255
        vcmd = (self.register(self.validateSpinBox),'%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')

        label1 = Label(frame, text="THRESHOLD (0,255)")
        self.binaryThreshold = StringVar(value="40")
        self.binarySpinBox = Spinbox(frame, textvariable=self.binaryThreshold, width=4, from_=from_, to=to, validate="key", validatecommand=vcmd) 
        
        label1.grid(row=0, column=0, padx=(0,10), stick=N+W)
        self.binarySpinBox.grid(row=0, column=1, stick=N+W)
        
        return frame

    def createPreprocessBoxes(self):
        frame = Frame(self.menuFrame, width=300)

        from_ = 0
        to = 100
        vcmd = (self.register(self.validateSpinBox),'%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')

        label1 = Label(frame, text="Erozja - ilosc przebiegow")
        self.erosion = StringVar(value="2")
        self.erosionSpinBox = Spinbox(frame, textvariable=self.erosion, width=4, from_=from_, to=to, validate="key", validatecommand=vcmd)

        label1.grid(row=0, column=0, padx=(0,10), stick=N+W)
        self.erosionSpinBox.grid(row=0, column=1, stick=N+W)

        return frame

    def createCogSpinBoxes(self):
        frame = Frame(self.menuFrame, width=300)

        from_ = 0
        to = 100
        vcmd = (self.register(self.validateSpinBox),'%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')

        label1 = Label(frame, text="Wsp. kary za rzadkość")
        self.densityCoefficient = StringVar(value="10")
        self.cogSpinBox = Spinbox(frame, textvariable=self.densityCoefficient, width=4, from_=from_, to=to, validate="key", validatecommand=vcmd)
        
        label2 = Label(frame, text="Wsp. kary za odległość")
        self.distanceFromCenterCoefficient = StringVar(value="60")
        self.cogSpinBox2 = Spinbox(frame, textvariable=self.distanceFromCenterCoefficient, width=4, from_=from_, to=to, validate="key", validatecommand=vcmd)
        
        label1.grid(row=0, column=0, padx=(0,10), stick=N+W)
        label2.grid(row=1, column=0, padx=(0,10), stick=N+W)
        self.cogSpinBox.grid(row=0, column=1, stick=N+W)
        self.cogSpinBox2.grid(row=1, column=1, stick=N+W)
        
        return frame
        
    def createSnakeSpinBoxes(self):
        frame = Frame(self.menuFrame, width=300)

        from_ = 0
        to = 255
        vcmd = (self.register(self.validateSpinBox),'%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')

        label1 = Label(frame, text="Parametr 1")
        self.snakeValue1 = StringVar()
        self.snakeSpinBox = Spinbox(frame, textvariable=self.snakeValue1, width=4, from_=from_, to=to, validate="key", validatecommand=vcmd)
        
        label2 = Label(frame, text="Parametr 2")
        self.snakeValue2 = StringVar()
        self.snakeSpinBox2 = Spinbox(frame, textvariable=self.snakeValue2, width=4, from_=from_, to=to, validate="key", validatecommand=vcmd)
        
        label3 = Label(frame, text="Parametr 3")
        self.snakeValue3 = StringVar()
        self.snakeSpinBox3 = Spinbox(frame, textvariable=self.snakeValue3, width=4, from_=from_, to=to, validate="key", validatecommand=vcmd)
        
        label1.grid(row=0, column=0, padx=(0,10), stick=N+W)
        label2.grid(row=1, column=0, padx=(0,10), stick=N+W)
        label3.grid(row=2, column=0, padx=(0,10), stick=N+W)
        self.snakeSpinBox.grid(row=0, column=1, stick=N+W)
        self.snakeSpinBox2.grid(row=1, column=1, stick=N+W)
        self.snakeSpinBox3.grid(row=2, column=1, stick=N+W)
        
        return frame
        
    def validateSpinBox(self, action, index, value_if_allowed,
                       prior_value, text, validation_type, trigger_type, widget_name):
        if text in '0123456789':
            try:
                if value_if_allowed == "":
                    return True
                
                value = int(value_if_allowed)
                if 0 <= value < 256:
                    return True
                else:
                    return False
            except ValueError:
                return False
            except:
                print "Unexpected error:", sys.exc_info()[0]
        else:
            return False

    def showImage(self, img):
        if img is not None:
            label = Label(self, image=img)
            label.image = img  # keep a reference! without it the image will be garbaged
            label.grid(row=1, column=0, sticky=N + W)

    def openFile(self):
        
        fileHandler = tkFileDialog.askopenfile(parent=self, mode='rb', title='Choose the first image')
        self.controller.clearCache()
        if fileHandler is not None:
            self.showImage(self.controller.loadImage(fileHandler))
            
            fileHandler2 = tkFileDialog.askopenfile(parent=self, mode='rb', title='Choose the second image')
            if fileHandler2 is not None:
                self.showImage(self.controller.loadImage(fileHandler2))

    def setSize(self, w, h):
        
        sw = self.parent.winfo_screenwidth()
        sh = self.parent.winfo_screenheight()
        
        x = (sw - w) / 2
        y = (sh - h) / 2
        self.parent.geometry('%dx%d+%d+%d' % (w, h, x, y))
Esempio n. 37
0
    def graphUI(self):
        self.frame0.destroy()
        self.initUIRoot()
        frame1 = Frame(self.frame0, relief=RAISED, borderwidth=1)
        frame1.pack(fill=BOTH, expand=False)

        frame2 = Frame(self.frame0, relief=RAISED, borderwidth=1)
        frame2.pack(fill=BOTH, expand=True)

        frame1.columnconfigure(1, weight=1)
        # frame1.columnconfigure(9, weight=1)
        frame1.columnconfigure(10, pad=7)
        frame1.rowconfigure(5, weight=1)
        frame1.rowconfigure(5, pad=7)

        frame2.columnconfigure(8, pad=7, weight=1)
        frame2.columnconfigure(1, weight=1)
        frame2.columnconfigure(6, weight=1)
        frame2.rowconfigure(8, pad=7)

        lbl = Label(frame1, text="催化剂性质")
        lbl.grid(row=0, column=0, columnspan=8, rowspan=1, sticky=W, pady=4, padx=5)
        # K_Mat_Tree = ttk.Treeview(frame1)
        # K_Mat_Tree['show'] = 'headings'
        # K_Mat_Tree = self.makeMatrixUI(7, K_Mat_Tree, sourceDate.K_model)
        # K_Mat_Tree.grid(row=1, column=0, columnspan=6, rowspan=5, sticky=E + W + S + N, pady=4, padx=5)
        K_Mat_Tree = Text(frame1, height=18)
        self.makeMatrixUI(K_Mat_Tree, self.catObj)
        K_Mat_Tree.configure(state='normal')
        K_Mat_Tree.grid(row=1, column=0, columnspan=6, rowspan=6, sticky=E + W + S + N, pady=4, padx=5)

        lbl = Label(frame1, text="优化方法:")
        lbl.grid(row=0, column=6, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5)
        txt = Entry(frame1)
        txt.insert(0, self.catObj.optMethod)
        txt.configure(state='readonly')
        txt.grid(row=0, column=8, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5)

        lbl = Label(frame1, text="集总数:")
        lbl.grid(row=1, column=6, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5)
        txt = Entry(frame1)
        txt.insert(0, self.catObj.n)
        txt.configure(state='readonly')
        txt.grid(row=1, column=8, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5)

        lbl = Label(frame1, text="精确度:")
        lbl.grid(row=2, column=6, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5)
        txt = Entry(frame1)
        txt.insert(0, self.catObj.tol)
        txt.configure(state='readonly')
        txt.grid(row=2, column=8, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5)

        cateDetailButton = Button(frame1, text="查看催化剂详情")
        cateDetailButton.grid(row=3, column=8)
        # ________________________________________
        lbl = Label(frame2, text="待预测条件")
        lbl.grid(row=0, column=0, columnspan=5, rowspan=1, pady=4, padx=5)

        lbl = Label(frame2, text="初始组成(<1 英文逗号分割):")
        lbl.grid(row=1, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.Y0_input = Entry(frame2)
        self.Y0_input.grid(row=1, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="温度(K)")
        lbl.grid(row=2, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.T_input = Entry(frame2)

        self.T_input.grid(row=2, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="压力(KPa)")
        lbl.grid(row=3, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.p_input = Entry(frame2)
        self.p_input.grid(row=3, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="剂油比")
        lbl.grid(row=4, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.roil_input = Entry(frame2)
        self.roil_input.grid(row=4, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="停留时间(s)")
        lbl.grid(row=5, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.t_input = Entry(frame2)
        self.t_input.grid(row=5, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="碱氮含量(<1)")
        lbl.grid(row=6, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.yn_input = Entry(frame2)
        self.yn_input.insert(0, 0.0)
        self.yn_input.grid(row=6, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="重芳烃含量(<1)")
        lbl.grid(row=7, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.ya_input = Entry(frame2)
        self.ya_input.grid(row=7, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="微分方程步长")
        lbl.grid(row=8, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        self.step_input = Entry(frame2)
        self.step_input.insert(0, 0.1)
        self.step_input.grid(row=8, column=2, columnspan=3, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="图表设置")
        lbl.grid(row=0, column=6, columnspan=5, rowspan=1, pady=4, padx=5)

        lbl = Label(frame2, text="条件变量")
        lbl.grid(row=1, column=6, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.var = ttk.Combobox(frame2, textvariable=StringVar())
        if not self.catObj.withTemp:
            self.var['values'] = (u'压力', u'剂油比', u'停留时间')
            self.p_input.insert(0, 0)
            self.T_input.insert(0, self.catObj.t)
            self.T_input.configure(state='readonly')
            self.p_input.configure(state='readonly')
            self.lastVar = u'压力'
        else:
            self.T_input.delete(0, 'end')
            self.T_input.insert(0, 0)
            self.T_input.configure(state='readonly')
            self.var['values'] = (u'温度', u'压力', u'剂油比', u'停留时间', u'温度+压力',u'温度+剂油比',u'剂油比+压力')
            self.lastVar = u'温度'
        self.var.bind('<<ComboboxSelected>>', self.onSelecetedVar)
        self.var.current(0)
        self.var.grid(row=1, column=8, columnspan=2, rowspan=1, sticky=W, pady=4, padx=5)

        self.rangeLbl = Label(frame2, text="条件范围")
        self.rangeLbl.grid(row=2, column=6, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        lbl = Label(frame2, text="上限")
        lbl.grid(row=3, column=6, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        lbl = Label(frame2, text="下限")
        lbl.grid(row=4, column=6, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.rangeMin = Entry(frame2)
        self.rangeMax = Entry(frame2)

        self.rangeMin.grid(row=3, column=8, columnspan=1, sticky=W, rowspan=1, pady=4, padx=5)
        self.rangeMax.grid(row=4, column=8, columnspan=1, sticky=W, rowspan=1, pady=4, padx=5)

        lbl = Label(frame2, text="结果集(英文逗号分割)")
        lbl.grid(row=5, column=6, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.chartResultId = Entry(frame2)
        self.chartResultId.insert(0, '1,2,3,4,5,6,7,8,9,10,11,12')
        self.chartResultId.grid(row=5, column=8, columnspan=3, rowspan=1, sticky=W, pady=4, padx=5)

        lbl = Label(frame2, text="结果名(英文逗号分割\n尽量使用英文)")
        lbl.grid(row=6, column=6, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.chartResultName = Entry(frame2)
        #TODO,get the default value from lump model
        self.chartResultName.insert(0, 'HS,HA,HR,DIESEL,GS,GO,GA,DGAS,LO3,LO4,LPGD,COKE')
        self.chartResultName.grid(row=6, column=8, columnspan=3, rowspan=1, sticky=W, pady=4, padx=5)

        lbl = Label(frame2, text="点数")
        lbl.grid(row=7, column=6, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.stepNum = Entry(frame2)
        self.stepNum.grid(row=7, column=8, columnspan=3, rowspan=1, sticky=W, pady=4, padx=5)

        cateDetailButton = Button(frame2, text="预测趋势", command=self.doChart)
        cateDetailButton.grid(row=8, column=6, columnspan=2)
Esempio n. 38
0
class GroupSelect(Frame):
    """This is a widget with ability to choose specific group for further
    actions.
    """

    def __init__(self, parent=None, default_type="Classical", **kw):
        Frame.__init__(self, parent, **kw)
        self._parent = parent
        self._init_components()
        self._type_radio_buttons[default_type].select()

    def _init_components(self):
        # group type selection (alternating, classical, sporadic, exceptional)
        group_type_frame = LabelFrame(self, text="Group type")
        group_type_frame.pack(expand=True, fill="x", padx=10, pady=5)

        # group type radio buttons (Alternating, Classical etc.)
        self._group_type = StringVar()
        self._type_radio_buttons = dict()
        for type in ("Alternating", "Classical", "Exceptional", "Sporadic"):
            self._type_radio_buttons[type] = Radiobutton(
                group_type_frame, variable=self._group_type, value=type, text=type
            )
            self._type_radio_buttons[type].pack(anchor="nw", padx=10)

        # set group type selection handler
        self._group_type.trace("w", lambda n, i, m: self._group_type_selection())

        # parameters for each group (degree for alternating, field and
        # dimension for classical etc.
        group_params_frame = LabelFrame(self, text="Parameters")
        group_params_frame.pack(expand=True, fill="x", padx=10, pady=5)

        # alternating
        self._alt_params = Frame(group_params_frame)
        self._alt_params.columnconfigure(1, weight=1)
        Label(self._alt_params, text="Degree").grid(sticky="w")
        self._alt_degree = NumberBox(self._alt_params, constraints=Constraints(min=5))
        self._alt_degree.grid(row=0, column=1, sticky="we")

        # classical
        self._clas_params = Frame(group_params_frame)
        self._clas_params.columnconfigure(1, weight=1)
        Label(self._clas_params, text="Type").grid(row=0, sticky="w")
        self._clas_type = OptionList(self._clas_params, values=ClassicalGroup.types())

        self._clas_type.variable.trace("w", lambda n, i, m: self._classical_group_type_selection())

        self._clas_type.grid(row=0, column=1, sticky="we")

        Label(self._clas_params, text="Dimension").grid(row=1, sticky="w")
        self._clas_dim = NumberBox(self._clas_params)
        self._clas_dim.grid(row=1, column=1, sticky="we")
        Label(self._clas_params, text="Field order").grid(row=2, sticky="w")
        self._clas_field = NumberBox(self._clas_params, constraints=Constraints(primality=numeric.PRIME_POWER))
        self._clas_field.grid(row=2, column=1, sticky="we")

        self._classical_group_type_selection()

        # exceptional
        self._ex_params = Frame(group_params_frame)
        self._ex_params.columnconfigure(1, weight=1)
        Label(self._ex_params, text="Type").grid(row=0, sticky="w")
        self._ex_type = OptionList(self._ex_params, values=ExceptionalGroup.types())
        self._ex_type.setvar(value=ExceptionalGroup.types()[0])
        self._ex_type.grid(row=0, column=1, sticky="we")
        Label(self._ex_params, text="Field order").grid(row=1, sticky="w")
        self._ex_field = NumberBox(self._ex_params, constraints=Constraints(primality=numeric.PRIME_POWER))
        self._ex_field.grid(row=1, column=1, sticky="we")

        # sporadic
        self._spor_params = Frame(group_params_frame)
        self._spor_params.columnconfigure(1, weight=1)
        Label(self._spor_params, text="Group").grid(row=0, sticky="w")
        self._sporadic_group = OptionList(self._spor_params, values=SporadicGroup.all_groups())
        self._sporadic_group.grid(row=0, column=1, sticky="we")

        # pack params frames
        for child_frame in group_params_frame.winfo_children():
            child_frame.pack(expand=True, fill="x", padx=10)

    @property
    def selected_group(self):
        """Returns currently selected group
        """
        if self._group_type.get() == "Alternating":
            self._alt_degree.refresh_input()
            return AlternatingGroup(int(self._alt_degree.get()))
        if self._group_type.get() == "Classical":
            self._clas_dim.refresh_input()
            self._clas_field.refresh_input()
            return ClassicalGroup(
                self._clas_type.variable.get(), int(self._clas_dim.get()), int(self._clas_field.get())
            )
        if self._group_type.get() == "Sporadic":
            return SporadicGroup(self._sporadic_group.variable.get())
        if self._group_type.get() == "Exceptional":
            self._ex_field.refresh_input()
            return ExceptionalGroup(self._ex_type.variable.get(), int(self._ex_field.get()))

    def _group_type_selection(self):
        """Process the change of selected group type
        """

        def set_visible(widget, visible):
            if visible:
                widget.pack(expand=True, fill="both", padx=10, anchor="nw")
            else:
                widget.forget()

        type = self._group_type.get()
        set_visible(self._alt_params, type == "Alternating")
        set_visible(self._clas_params, type == "Classical")
        set_visible(self._spor_params, type == "Sporadic")
        set_visible(self._ex_params, type == "Exceptional")

    def _classical_group_type_selection(self):
        name = self._clas_type.variable.get()
        self._clas_dim.set_constraints(ClassicalGroup.dim_constraints(name))
        self._clas_field.set_constraints(ClassicalGroup.field_constraints(name))
Esempio n. 39
0
class SigBridgeUI(Tk):
    server = None
    server_thread = None

    def __init__(self):
        Tk.__init__(self)

        self.columnconfigure(0, weight=1)
        self.rowconfigure(0, weight=1)

        # 2 rows: firts with settings, second with registrar data
        self.main_frame = Frame(self)
        # Commands row doesn't expands
        self.main_frame.rowconfigure(0, weight=0)
        # Logs row will grow
        self.main_frame.rowconfigure(1, weight=1)
        # Main frame can enlarge
        self.main_frame.columnconfigure(0, weight=1)
        self.main_frame.columnconfigure(1, weight=1)
        self.main_frame.grid(row=0, column=0)

        # Run/Stop button
        self.server_button = Button(self.main_frame, text="Connect", command=self.start_server)
        self.server_button.grid(row=0, column=0)

        # Clear button
        self.clear_button = Button(self.main_frame, text="Clear Log", command=self.clear_log)
        self.clear_button.grid(row=0, column=1)

        # Logs Widget
        self.log_widget = ScrolledText(self.main_frame)
        self.log_widget.grid(row=1, column=0, columnspan=2)
        # made not editable
        self.log_widget.config(state='disabled')

        # Queue where the logging handler will write
        self.log_queue = Queue.Queue()

        # Setup the logger
        self.uilogger = logging.getLogger('SigBridgeUI')
        self.uilogger.setLevel(logging.INFO)
        formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')

        # Use the QueueLogger as Handler
        hl = QueueLogger(queue=self.log_queue)
        hl.setFormatter(formatter)
        self.uilogger.addHandler(hl)

        # self.log_widget.update_idletasks()
        self.set_geometry()

        # Setup the update_widget callback reading logs from the queue
        self.start_log()

    def clear_log(self):
        self.log_widget.config(state='normal')
        self.log_widget.delete(0.0, END)
        self.log_widget.config(state='disabled')

    def start_log(self):
        self.uilogger.info("SigBridge Started.")
        self.update_widget()
        # self.control_log_button.configure(text="Pause Log", command=self.stop_log)

    def update_widget(self):
        self.log_widget.config(state='normal')
        # Read from the Queue and add to the log widger
        while not self.log_queue.empty():
            line = self.log_queue.get()
            tag = "error" if " ERROR " in line else 'info'
            self.log_widget.insert(END, line, tag)
            self.log_widget.see(END)  # Scroll to the bottom
            self.log_widget.update_idletasks()
        self.log_widget.tag_config('error', foreground="red")
        self.log_widget.config(state='disabled')
        self.log_widget.after(10, self.update_widget)

    def set_geometry(self):
        # set position in window
        w = 600  # width for the Tk
        h = 300  # height for the Tk

        # get screen width and height
        ws = self.winfo_screenwidth()   # width of the screen
        hs = self.winfo_screenheight()  # height of the screen

        # calculate x and y coordinates for the Tk window
        x = (ws/2) - (w/2)
        y = (hs/2) - (h/2)

        # set the dimensions of the screen 
        # and where it is placed
        self.geometry('%dx%d+%d+%d' % (w, h, x, y))

    def start_server(self):
        try:
            self.server = SigServer(('0.0.0.0', 25), None, self.uilogger)
            self.server_thread = threading.Thread(name='server', target=self.server.run)
            self.server_thread.daemon = True
            self.server_thread.start()
            self.server_button.configure(text="Disconnect", command=self.stop_server)
        except Exception as err:
            self.uilogger("Cannot start the server: %s" % err.message)

        # self.label_variable.set(self.entry_variable.get()+"(Started Signal Server)")
        # self.entry.focus_set()
        # self.entry.selection_range(0, END)

    def stop_server(self):
        self.server.shutdown()
        self.server_button.configure(text="Connect", command=self.start_server)
        self.server = None
Esempio n. 40
0
class Notebook:    
    # initialization. receives the master widget
    # reference and the notebook orientation
    def __init__(self, master, width=0, height=0):

        self.active_fr = None
        self.count = 0
        self.choice = IntVar(0)

        self.dummy_x_fr = Frame(master, width=width, borderwidth=0)
        self.dummy_y_fr = Frame(master, height=height, borderwidth=0)
        self.dummy_x_fr.grid(row=0, column=1)
        self.dummy_x_fr.grid_propagate(0)
        self.dummy_y_fr.grid(row=1, rowspan=2, column=0)
        self.dummy_y_fr.grid_propagate(0)

        # creates notebook's frames structure
        self.rb_fr = Frame(master, borderwidth=0)
        self.rb_fr.grid(row=1, column=1, sticky=N + W)
        
        self.screen_fr = Frame(master, borderwidth=2, relief=RIDGE)
        self.screen_fr.grid(row=2, column=1, sticky=N + W + E)
        
        master.rowconfigure(2, weight=1)
        master.columnconfigure(1, weight=1)

    # return a master frame reference for the external frames (screens)
    def __call__(self):
        return self.screen_fr

    # add a new frame (screen) to the (bottom/left of the) notebook
    def add_screen(self, fr, title):

        b = Radiobutton(self.rb_fr, bd=1, text=title, indicatoron=0, \
                        variable=self.choice, value=self.count, \
                        command=lambda: self.display(fr))
        
        b.grid(column=self.count, row=0, sticky=N + E + W)
        self.rb_fr.columnconfigure(self.count, weight=1)

        fr.grid(sticky=N + W + E)
        self.screen_fr.columnconfigure(0, weight=1)
        fr.grid_remove()

        # ensures the first frame will be
        # the first selected/enabled
        if not self.active_fr:
            fr.grid()
            self.active_fr = fr

        self.count += 1

        # returns a reference to the newly created
        # radiobutton (allowing its configuration/destruction)
        return b


        # hides the former active frame and shows 
        # another one, keeping its reference
    def display(self, fr):
        self.active_fr.grid_remove()
        fr.grid()
        self.active_fr = fr
Esempio n. 41
0
    def show(self):
        self.__root.title(CONST.APP_NAME)
        mainFrame = Frame(self.__root)
        # Make Dialog stretchable (to EAST and WEST)
        top = mainFrame.winfo_toplevel()
        top.rowconfigure(0, weight=1)
        top.columnconfigure(0, weight=1)
        mainFrame.rowconfigure(0, weight=1)
        mainFrame.columnconfigure(0, weight=1)
        mainFrame.grid(sticky='ew')

        # Three Sections: Input-Settings, Output-Settings and Buttons
        inputFrame = LabelFrame(mainFrame, text='Input Settings')
        inputFrame.columnconfigure(1, weight=1)
        inputFrame.grid(column=0, row=0, padx=5, pady=5, sticky='ew')
        outputFrame = LabelFrame(mainFrame, text='Output Settings')
        outputFrame.columnconfigure(1, weight=1)
        outputFrame.grid(column=0, row=1, padx=5, pady=5, sticky='ew')
        buttonFrame = Frame(mainFrame)
        buttonFrame.grid(column=0, row=2, padx=5, pady=5, sticky='e')

        # Input-Settings
        scribusSourceFileLabel = Label(inputFrame, text='Scribus File:', width=15, anchor='w')
        scribusSourceFileLabel.grid(column=0, row=0, padx=5, pady=5, sticky='w')
        scribusSourceFileEntry = Entry(inputFrame, width=70, textvariable=self.__ctrl.getScribusSourceFileEntryVariable())
        scribusSourceFileEntry.grid(column=1, row=0, padx=5, pady=5, sticky='ew')
        scribusSourceFileButton = Button(inputFrame, text='...', command=self.__ctrl.scribusSourceFileEntryVariableHandler)
        scribusSourceFileButton.grid(column=2, row=0, padx=5, pady=5, sticky='e')

        dataSourceFileLabel = Label(inputFrame, text='Data File:', width=15, anchor='w')
        dataSourceFileLabel.grid(column=0, row=1, padx=5, pady=5, sticky='w')
        dataSourceFileEntry = Entry(inputFrame, width=70, textvariable=self.__ctrl.getDataSourceFileEntryVariable())
        dataSourceFileEntry.grid(column=1, row=1, padx=5, pady=5, sticky='ew')
        dataSourceFileButton = Button(inputFrame, text='...', command=self.__ctrl.dataSourceFileEntryVariableHandler)
        dataSourceFileButton.grid(column=2, row=1, padx=5, pady=5, sticky='e')

        # Output-Settings
        outputDirectoryLabel = Label(outputFrame, text='Output Directory:', width=15, anchor='w')
        outputDirectoryLabel.grid(column=0, row=0, padx=5, pady=5, sticky='w')
        outputDirectoryEntry = Entry(outputFrame, width=70, textvariable=self.__ctrl.getOutputDirectoryEntryVariable())
        outputDirectoryEntry.grid(column=1, row=0, padx=5, pady=5, sticky='ew')
        outputDirectoryButton = Button(outputFrame, text='...', command=self.__ctrl.outputDirectoryEntryVariableHandler)
        outputDirectoryButton.grid(column=2, row=0, padx=5, pady=5, sticky='e')

        outputFileNameLabel = Label(outputFrame, text='Output File Name:', width=15, anchor='w')
        outputFileNameLabel.grid(column=0, row=1, padx=5, pady=5, sticky='w')
        outputFileNameEntry = Entry(outputFrame, width=70, textvariable=self.__ctrl.getOutputFileNameEntryVariable())
        outputFileNameEntry.grid(column=1, row=1, padx=5, pady=5, sticky='ew')

        outputFormatLabel = Label(outputFrame, text='Output Format:', width=15, anchor='w')
        outputFormatLabel.grid(column=0, row=2, padx=5, pady=5, sticky='w')
        outputFormatListBox = OptionMenu(outputFrame, self.__ctrl.getSelectedOutputFormat(), self.__ctrl.getOutputFormatList())
        outputFormatListBox.grid(column=1, row=2, padx=5, pady=5, sticky='w')

        keepGeneratedScribusFilesLabel = Label(outputFrame, text='Keep Scribus Files:', width=15, anchor='w')
        keepGeneratedScribusFilesLabel.grid(column=0, row=3, padx=5, pady=5, sticky='w')
        keepGeneratedScribusFilesCheckbox = Checkbutton(outputFrame, variable=self.__ctrl.getKeepGeneratedScribusFilesCheckboxVariable())
        keepGeneratedScribusFilesCheckbox.grid(column=1, row=3, padx=5, pady=5, sticky='w')

        # Buttons to Cancel or to Run the Generator with the given Settings
        helpButton = Button(buttonFrame, text='Help', width=10, command=self.__ctrl.helpButtonHandler)
        helpButton.grid(column=0, row=0, padx=5, pady=5, sticky='e')
        cancelButton = Button(buttonFrame, text='Cancel', width=10, command=self.__ctrl.buttonCancelHandler)
        cancelButton.grid(column=1, row=0, padx=5, pady=5, sticky='e')
        generateButton = Button(buttonFrame, text='Generate', width=10, command=self.__ctrl.buttonOkHandler)
        generateButton.grid(column=2, row=0, padx=5, pady=5, sticky='e')

        # Finally show the Generator Dialog
        mainFrame.grid()
        self.__root.grid()
        self.__root.mainloop()
Esempio n. 42
0
class UIFrame(Frame):
    '''
    This class is responsible for creating configuring and laying out all controls on the main GUI window.  It returns UIFrame
    object (based on Frame) representing the populated window for the application to interact with.
    '''

    def __init__(self, parent):
        '''
        Creates and returns a new UIFrame object.
        
        _Parameters_
        parent (required) - The parent widget object under which this console is to be created.
        
        _Return_
        UIFrame Object
        '''
        Frame.__init__(self, parent)
        
        self.parent = parent
        
        #Main window frames
        self._optionsFrame = Frame(self.parent)
        self._runFrame = Frame(self.parent)
        self._consoleFrame = Frame(self.parent)
        
        #Member widget creation and configuration - widgets configured in their constructors
        self._lblLoopCount = Label(self._optionsFrame,
                                   text = "Loop Count")
        self.LoopSpinner = Spinbox(self._optionsFrame,
                                   from_ = 1,
                                   to = 5000,
                                   repeatdelay = 500,
                                   repeatinterval = 50)
        self._lblOptions = Label(self._optionsFrame, 
                                 text="Options String")
        self.OptionsEntry = Entry(self._optionsFrame,
                                  exportselection = False)
        self.ClearButton = Button(self._runFrame,
                                  text="Clear")
        self.RunButton = Button(self._runFrame, 
                                text="Run!!!")
        self.Console = ConsoleFrame(self._consoleFrame)
        
        #Geometry control
        #First pack the main window frames
        self._optionsFrame.pack(fill = "x")
        self._runFrame.pack()
        self._consoleFrame.pack(fill = "both",
                                expand = True,
                                padx = 2,
                                pady = 2)
        
        #This line is needed to allow the options column to have the correct width
        self._optionsFrame.columnconfigure(1, weight = 1)
        
        #widgets in options frame
        self._lblLoopCount.grid(row = 0, column = 0,
                                sticky = "w",
                                padx = 2,
                                pady = 2)
        self.LoopSpinner.grid(row = 1, column = 0,
                              sticky = "w",
                              padx = 2,
                              pady = 2)
        self._lblOptions.grid(row = 0, column = 1,
                              sticky = "w",
                              padx = 2,
                              pady = 2)
        self.OptionsEntry.grid(row = 1, column = 1,
                              sticky = "e"+"w",
                              padx = 2,
                              pady = 2)
        
        #widgets in run frame
        self.RunButton.pack(side = "left",
                            padx = 2,
                            pady = 2)
        self.ClearButton.pack(side = "left",
                              padx = 2,
                              pady = 2)
        
        #note - Console frame packed in constructor for console object
        
        #set minimum window size
        self.master.update_idletasks()
        self.master.minsize(self.master.winfo_width(), self.master.winfo_height())
        
Esempio n. 43
0
class CodexTypes(Frame):
    tooltips = {
        "Geology": "Geology: Vents and fumeroles",
        "Cloud": "Lagrange Clouds",
        "Anomaly": "Anomalous stellar phenomena",
        "Thargoid": "Thargoid sites or barnacles",
        "Biology": "Biological surface signals",
        "Guardian": "Guardian sites",
        "None": "Unclassified codex entry",
        "Human": "Human Sites",
        "Ring": "Planetary Ring Resources",
        "Other": "Other Sites",
        "Planets": "Valuable Planets",
        "Tourist": "Tourist Informatiom"
    }

    body_types = {
        'Metal-rich body': 'Metal-Rich Body',
        'Metal rich body': 'Metal-Rich Body',
        'Earth-like world': 'Earthlike World',
        'Earthlike body': 'Earthlike World',
        'Water world': 'Water World',
        'Ammonia world': 'Ammonia World'
    }

    bodycount = 0

    parentRadius = 0
    minPressure = 80

    close_orbit = 0.05
    eccentricity = 0.9

    waiting = True

    def __init__(self, parent, gridrow):
        "Initialise the ``Patrol``."
        Frame.__init__(
            self,
            parent
        )

        self.parent = parent
        self.bind('<<POIData>>', self.evisualise)
        self.hidecodexbtn = tk.IntVar(value=config.getint("Canonn:HideCodex"))
        self.hidecodex = self.hidecodexbtn.get()

        self.container = Frame(self)
        self.container.columnconfigure(1, weight=1)
        # self.tooltip=Frame(self)
        # self.tooltip.columnconfigure(1, weight=1)
        # self.tooltip.grid(row = 1, column = 0,sticky="NSEW")

        # self.tooltiplist=tk.Frame(self.tooltip)
        self.tooltiplist = tk.Frame(self)

        self.images = {}
        self.labels = {}
        self.tooltipcol1 = []
        self.tooltipcol2 = []

        self.addimage("Geology", 0)
        self.addimage("Cloud", 1)
        self.addimage("Anomaly", 2)
        self.addimage("Thargoid", 3)
        self.addimage("Biology", 4)
        self.addimage("Guardian", 5)
        self.addimage("Human", 6)
        self.addimage("Ring", 7)
        self.addimage("None", 8)
        self.addimage("Other", 9)
        self.addimage("Planets", 10)
        self.addimage("Tourist", 11)

        # self.grid(row = gridrow, column = 0, sticky="NSEW",columnspan=2)
        self.grid(row=gridrow, column=0)
        self.container.grid(row=0, column=0, sticky="W")
        self.poidata = []
        # self.tooltip.grid_remove()
        self.tooltiplist.grid_remove()
        self.grid_remove()


    # wrapper for visualise
    def evisualise(self,event):
        self.visualise()

    def getdata(self, system):
        debug("Getting POI data in thread")
        CodexTypes.waiting = True

        try:
            self.poidata = []
            url = "https://us-central1-canonn-api-236217.cloudfunctions.net/poiListSignals?system={}".format(
                quote_plus(system.encode('utf8')))
            debug(url)
            r = requests.get(url)
            if r.status_code == requests.codes.ok:
                poidata = r.json()

            for r in poidata:
                self.merge_poi(r.get("hud_category"), r.get("english_name"), r.get("body"))

            usystem = urllib2.unquote(system)

            edsm = "https://www.edsm.net/api-system-v1/bodies?systemName={}".format(quote_plus(system.encode('utf8')))
            debug(edsm)
            r = requests.get(edsm)
            if r.status_code == requests.codes.ok:

                bodies = r.json().get("bodies")
                if bodies:
                    CodexTypes.bodycount = len(bodies)
                    debug("bodycount: {}".format(CodexTypes.bodycount))

                    if bodies[0].get("solarRadius"):
                        CodexTypes.parentRadius = self.light_seconds("solarRadius", bodies[0].get("solarRadius"))

                    for b in bodies:
                        debug(b.get("subType"))
                        body_code = b.get("name").replace(usystem, '')
                        body_name = b.get("name")

                        # Terraforming
                        if b.get('terraformingState') == 'Candidate for terraforming':
                            self.merge_poi("Planets", "Terraformable", body_code)

                        # Landable Volcanism
                        if b.get('type') == 'Planet' and b.get('volcanismType') != 'No volcanism' and b.get('isLandable'):
                            self.merge_poi("Geology", b.get('volcanismType'), body_code)

                        # water ammonia etc
                        if b.get('subType') in CodexTypes.body_types.keys():
                            self.merge_poi("Planets", CodexTypes.body_types.get(b.get('subType')), body_code)

                        # fast orbits
                        if b.get('orbitalPeriod'):
                            if abs(float(b.get('orbitalPeriod'))) <= 0.042:
                                self.merge_poi("Tourist", 'Fast Orbital Period', body_code)

                        # Ringed ELW etc
                        if b.get('subType') in ('Earth-like world', 'Water world', 'Ammonia world'):
                            if b.get("rings"):
                                self.merge_poi("Tourist",
                                               'Ringed {}'.format(CodexTypes.body_types.get(b.get('subType'))),
                                               body_code)
                            if b.get("parents")[0].get("Planet"):
                                self.merge_poi("Tourist",
                                               '{} Moon'.format(CodexTypes.body_types.get(b.get('subType'))),
                                               body_code)
                        if b.get('subType') in ('Earth-like world') and b.get('rotationalPeriodTidallyLocked'):
                            self.merge_poi("Tourist", 'Tidal Locked Earthlike Word',
                                           body_code)

                        #  Landable with surface pressure
                        if b.get('type') == 'Planet' and surface_pressure("surfacePressure",b.get('surfacePressure')) > CodexTypes.minPressure and b.get('isLandable'):
                            self.merge_poi("Tourist", 'Landable with atmosphere', body_code)

                        #    Landable high-g (>3g)
                        if b.get('type') == 'Planet' and b.get('gravity') > 3 and b.get('isLandable'):
                            self.merge_poi("Tourist", 'High Gravity', body_code)

                        #    Landable large (>18000km radius)
                        if b.get('type') == 'Planet' and b.get('radius') > 18000 and b.get('isLandable'):
                            self.merge_poi("Tourist", 'Large Radius Landable', body_code)

                        # orbiting close to the star we need the solar radius for this...
                        if b.get('type') == 'Planet' and self.surface_distance(b.get("distanceToArrival"),
                                                                               CodexTypes.parentRadius,
                                                                               self.light_seconds('radius', b.get(
                                                                                   "radius"))) < 10:
                            self.merge_poi("Tourist", 'Surface Close to parent star', body_code)

                        #    Orbiting close to parent body less than 5ls
                        if b.get('type') == 'Planet' and self.aphelion('semiMajorAxis', b.get("semiMajorAxis"),
                                                                       b.get(
                                                                           "orbitalEccentricity")) < CodexTypes.close_orbit:
                            self.merge_poi("Tourist", 'Close Orbit', body_code)

                        #   Shepherd moons (orbiting closer than a ring)
                        #    Close binary pairs
                        #   Colliding binary pairs
                        #    Moons of moons

                        #    Tiny objects (<300km radius)
                        if b.get('type') == 'Planet' and b.get('radius') < 300 and b.get('isLandable'):
                            self.merge_poi("Tourist", 'Tiny Radius Landable', body_code)

                        #    Fast and non-locked rotation
                        if b.get('type') == 'Planet' and abs(float(b.get('rotationalPeriod'))) < 1 / 24 and not b.get(
                                "rotationalPeriodTidallyLocked"):
                            self.merge_poi("Tourist", 'Fast unlocked rotation', body_code)

                        #    High eccentricity
                        if float(b.get("orbitalEccentricity") or 0) > CodexTypes.eccentricity:
                            self.merge_poi("Tourist", 'Highly Eccentric Orbit', body)
                        #    Wide rings
                        #    Good jumponium availability (5/6 materials on a single body)
                        #    Full jumponium availability within a single system
                        #    Full jumponium availability on a single body

            else:
                CodexTypes.bodycount = 0
                debug("bodycount: {}".format(CodexTypes.bodycount))
        except:
            debug("Error fetching data")

        CodexTypes.waiting = False
        debug("event_generate")
        self.event_generate('<<POIData>>', when='tail')
        debug("Finished getting POI data in thread")

    def enter(self, event):

        type = event.widget["text"]
        # clear it if it exists
        for col in self.tooltipcol1:
            col["text"] = ""
            try:
                col.grid_remove()
            except:
                error("Col1 grid_remove error")
        for col in self.tooltipcol2:
            col["text"] = ""
            try:
                col.grid_remove()
            except:
                error("Col2 grid_remove error")

        poicount = 0

        # need to initialise if not exists
        if len(self.tooltipcol1) == 0:
            self.tooltipcol1.append(tk.Label(self.tooltiplist, text=""))
            self.tooltipcol2.append(tk.Label(self.tooltiplist, text=""))

        for poi in self.poidata:
            if poi.get("hud_category") == type:
                ## add a new label if it dont exist
                if len(self.tooltipcol1) == poicount:
                    self.tooltipcol1.append(tk.Label(self.tooltiplist, text=poi.get("english_name")))
                    self.tooltipcol2.append(tk.Label(self.tooltiplist, text=poi.get("body")))
                else:  ## just set the label
                    self.tooltipcol1[poicount]["text"] = poi.get("english_name")
                    self.tooltipcol2[poicount]["text"] = poi.get("body")

                # remember to grid them
                self.tooltipcol1[poicount].grid(row=poicount, column=0, columnspan=1, sticky="NSEW")
                self.tooltipcol2[poicount].grid(row=poicount, column=1, sticky="NSEW")
                poicount = poicount + 1

        if poicount == 0:
            self.tooltipcol1[poicount]["text"] = CodexTypes.tooltips.get(type)
            self.tooltipcol1[poicount].grid(row=poicount, column=0, columnspan=2)
            self.tooltipcol2[poicount].grid_remove()

        # self.tooltip.grid(sticky="NSEW")
        self.tooltiplist.grid(sticky="NSEW")

        ##self.tooltip["text"]=CodexTypes.tooltips.get(event.widget["text"])

    def leave(self, event):
        # self.tooltip.grid_remove()

        self.tooltiplist.grid_remove()

    def addimage(self, name, col):

        grey = "{}_grey".format(name)
        self.images[name] = tk.PhotoImage(file=os.path.join(CodexTypes.plugin_dir, "icons", "{}.gif".format(name)))
        self.images[grey] = tk.PhotoImage(file=os.path.join(CodexTypes.plugin_dir, "icons", "{}.gif".format(grey)))
        self.labels[name] = tk.Label(self.container, image=self.images.get(grey), text=name)
        self.labels[name].grid(row=0, column=col)

        self.labels[name].bind("<Enter>", self.enter)
        self.labels[name].bind("<Leave>", self.leave)
        self.labels[name].bind("<ButtonPress>", self.enter)
        self.labels[name]["image"] = self.images[name]

    def set_image(self, name, enabled):
        grey = "{}_grey".format(name)

        if enabled:
            setting = name
        else:
            setting = grey

        if enabled and self.labels.get(name):
            self.labels[name].grid()
        else:
            self.labels[name].grid_remove()

    def merge_poi(self, hud_category, english_name, body):
        debug("Merge POI")
        found = False
        signals = self.poidata
        for i, v in enumerate(signals):
            if signals[i].get("english_name") == english_name and signals[i].get("hud_category") == hud_category:
                if not body in signals[i].get("body").split(','):
                    self.poidata[i]["body"] = "{},{}".format(signals[i].get("body"), body)
                found = True
        if not found:
            self.poidata.append({"hud_category": hud_category, "english_name": english_name, "body": body})

    def remove_poi(self, hud_category, english_name):
        debug("Remove POI")
        signals = self.poidata
        for i, v in enumerate(signals):
            if signals[i].get("english_name") == english_name and signals[i].get("hud_category") == hud_category:
                del self.poidata[i]


    def light_seconds(self, tag, value):
        debug("light seconds {} {}".format(tag, value))
        if tag in ("distanceToArrival", "DistanceFromArrivalLS"):
            return value

        # Things measured in meters
        if tag in ("Radius", "SemiMajorAxis"):
            # from journal metres
            return value * 299792000

        # Things measure in kilometres
        if tag == "radius":
            # from journal metres
            return value * 1000 * 299792000

        # Things measure in astronomical units
        if tag == "semiMajorAxis":
            return value * 499.005

        # Things measured in solar radii
        if tag == "solarRadius":
            return value * 2.32061

    def semi_minor_axis(self, tag, major, eccentricity):
        a = float(self.light_seconds(tag, major))
        e = float(eccentricity or 0)
        minor = sqrt(pow(a, 2) * (1 - pow(e, 2)))

        return minor

    # The focus is the closest point of the orbit
    # return value is in light seconds
    def perihelion(self, tag, major, eccentricity):
        a = float(self.light_seconds(tag, major))
        e = float(eccentricity or 0)
        focus = a * (1 - e)
        debug("focus  {}ls".format(a))

        return focus

    def aphelion(self, tag, major, eccentricity):
        a = float(self.light_seconds(tag, major))
        e = float(eccentricity or 0)
        focus = a * (1 + e)
        debug("focus  {}ls".format(a))

        return focus

    def surface_distance(self, d, r1, r2):
        return d - r1, r2;

    def visualise(self):

        debug("visualise")
        # we may want to try again if the data hasn't been fetched yet
        if CodexTypes.waiting:
            debug("Still waiting");
        else:

            self.set_image("Geology", False)
            self.set_image("Cloud", False)
            self.set_image("Anomaly", False)
            self.set_image("Thargoid", False)
            self.set_image("Biology", False)
            self.set_image("Guardian", False)
            self.set_image("Human", False)
            self.set_image("Ring", False)
            self.set_image("None", False)
            self.set_image("Other", False)
            self.set_image("Planets", False)
            self.set_image("Tourist", False)

            if self.poidata:
                self.grid()
                for r in self.poidata:
                    debug(r)
                    self.set_image(r.get("hud_category"), True)
            else:
                self.grid_remove()

    def journal_entry(self, cmdr, is_beta, system, station, entry, state, x, y, z, body, lat, lon, client):
        debug("CodeTypes journal_entry")

        if entry.get("event") == "StartJump" and entry.get("JumpType") == "Hyperspace":
            # go fetch some data.It will 
            poiTypes(entry.get("StarSystem"), self.getdata).start()
            self.grid_remove()

        if entry.get("event") in ("Location", "StartUp"):
            debug("Looking for POI data in {}".format(system))
            poiTypes(system, self.getdata).start()

        if entry.get("event") in ("Location", "StartUp","FSDJump"):
            if entry.get("SystemAllegiance") in ("Thargoid","Guardian"):
                self.merge_poi(entry.get("SystemAllegiance"), "{} Controlled".format(entry.get("SystemAllegiance")), "")

        if entry.get("event") in ("FSSDiscoveryScan"):
            CodexTypes.fsscount = entry.get("BodyCount")
            debug("body reconciliation: {} {}".format(CodexTypes.bodycount, CodexTypes.fsscount))
            if CodexTypes.fsscount > CodexTypes.bodycount:
                self.merge_poi("Planets", "Unexplored Bodies", "")


        if entry.get("event") == "FSSSignalDiscovered" and entry.get("SignalName") in (
                '$Fixed_Event_Life_Ring;', '$Fixed_Event_Life_Cloud;'):
            if entry.get("SignalName") == '$Fixed_Event_Life_Cloud;':
                self.merge_poi("Cloud", "Life Cloud", "")
            else:
                self.merge_poi("Cloud", "Life Ring", "")


        if entry.get("event") == "FSSSignalDiscovered" and entry.get("SignalName") in ('Guardian Beacon'):
            self.merge_poi("Guardian", "Guardian Beacon", "")


        if entry.get("event") == "FSSSignalDiscovered":
            if "NumberStation" in entry.get("SignalName"):
                self.merge_poi("Human", "Unregistered Comms Beacon", body)
            if "Mega" in entry.get("SignalName"):
                self.merge_poi("Human", "Megaship", body)
            if "ListeningPost" in entry.get("SignalName"):
                self.merge_poi("Human", "Listening Post", body)
            if "CAPSHIP" in entry.get("SignalName"):
                self.merge_poi("Human", "Capital Ship", body)

        if entry.get("event") == "FSSAllBodiesFound":
            self.remove_poi("Planets", "Unexplored Bodies")

        if entry.get("event") == "Scan" and entry.get("ScanType") in("Detailed","AutoScan"):
            self.remove_poi("Planets", "Unexplored Bodies")
            body = entry.get("BodyName").replace(system, '')
            english_name = CodexTypes.body_types.get(entry.get("PlanetClass"))
            if entry.get("PlanetClass") in CodexTypes.body_types.keys():
                debug("PlanetClass".format(entry.get("PlanetClass")))
                self.merge_poi("Planets", english_name, body)
            debug("Volcanism {} landable {}".format(entry.get("Volcanism"), entry.get("Landable")))
            if entry.get("Volcanism") != "" and entry.get("Landable"):
                self.merge_poi("Geology", entry.get("Volcanism"), body)
            if entry.get('TerraformState') == 'Terraformable':
                self.merge_poi("Planets", "Terraformable", body)

            if entry.get('OrbitalPeriod'):
                if abs(float(entry.get('OrbitalPeriod'))) < 3600:
                    self.merge_poi("Tourist", "Fast Orbit", body)

            if entry.get('PlanetClass') in ('Earthlike body', 'Water world', 'Ammonia world'):
                if entry.get("Rings"):
                    self.merge_poi("Tourist", 'Ringed {}'.format(CodexTypes.body_types.get(entry.get('PlanetClass'))),
                                   body)
                if entry.get("Parents")[0].get("Planet"):
                    self.merge_poi("Tourist", '{} Moon'.format(CodexTypes.body_types.get(entry.get('PlanetClass'))),
                                   body)

            if entry.get('PlanetClass') and entry.get('PlanetClass') in ('Earthlike body') and entry.get('TidalLock'):
                self.merge_poi("Tourist",'Tidal Locked Earthlike Word',
                               body)

            #  Landable with surface pressure
            if entry.get('PlanetClass') and surface_pressure("SurfacePressure",entry.get('SurfacePressure')) > CodexTypes.minPressure and entry.get('Landable'):
                self.merge_poi("Tourist", 'Landable with atmosphere', body)

            #    Landable high-g (>3g) looks like the journal is tenths of G therefor 3.257900 = 0.33G
            if entry.get('PlanetClass') and entry.get('SurfaceGravity') > 30 and entry.get('Landable'):
                self.merge_poi("Tourist", 'High Gravity', body)

            #    Landable large (>18000km radius)
            if entry.get('PlanetClass') and entry.get('Radius') > 18000000 and entry.get('Landable'):
                self.merge_poi("Tourist", 'Large Radius Landable', body)

            #    Orbiting close to parent body
            if entry.get('PlanetClass') and self.aphelion('SemiMajorAxis', entry.get("SemiMajorAxis"),
                                                          entry.get("Eccentricity")) < CodexTypes.close_orbit:
                self.merge_poi("Tourist", 'Close Orbit', body)
            #   Shepherd moons (orbiting closer than a ring)
            #    Close binary pairs
            #   Colliding binary pairs
            #    Moons of moons

            #    Tiny objects (<300km radius)
            if entry.get('Radius') < 300000 and entry.get('Landable'):
                self.merge_poi("Tourist", 'Tiny Radius Landable', body)

            #    Fast and non-locked rotation < 1 hour
            if entry.get('PlanetClass') and entry.get('RotationPeriod') and abs(entry.get('RotationPeriod')) < 3600 and not entry.get("TidalLock"):
                self.merge_poi("Tourist", 'Fast unlocked rotation', body)

            #    High eccentricity
            if float(entry.get("Eccentricity") or 0) > CodexTypes.eccentricity:
                self.merge_poi("Tourist", 'Highly Eccentric Orbit', body)
            #    Wide rings
            #    Good jumponium availability (5/6 materials on a single body)
            #    Full jumponium availability within a single system
            #    Full jumponium availability on a single body

        if entry.get("event") == "Scan" and entry.get("AutoScan") and entry.get("BodyID") == 1:
            CodexTypes.parentRadius = self.light_seconds("Radius", entry.get("Radius"))

        if entry.get("event") == "SAASignalsFound":
            # if we arent waiting for new data
            bodyName = entry.get("BodyName")
            bodyVal = bodyName.replace(system, '')

            debug("SAASignalsFound")

            signals = entry.get("Signals")
            for i, v in enumerate(signals):
                found = False
                type = signals[i].get("Type")
                english_name = type.replace("$SAA_SignalType_", "").replace("ical;", "y").replace(";", '')
                if " Ring" in bodyName:
                    cat = "Ring"
                if "$SAA_SignalType_" in type:
                    cat = english_name
                for x, r in enumerate(self.poidata):
                    if r.get("hud_category") == cat and r.get("english_name") == english_name:
                        found = True
                        if not bodyVal in r.get("body"):
                            self.poidata[x]["body"] = "{},{}".format(self.poidata[x]["body"], bodyVal)
                if not found:
                    self.set_image(cat, True)
                    self.poidata.append({'body': bodyVal, 'hud_category': cat, 'english_name': english_name})

                debug(self.poidata)
                debug("cat {} name  {} body {}".format(cat, english_name, bodyVal))

        # we can do this on every event can't we
        self.visualise()
        debug(json.dumps(self.poidata))

    @classmethod
    def plugin_start(cls, plugin_dir):
        cls.plugin_dir = plugin_dir

    def plugin_prefs(self, parent, cmdr, is_beta, gridrow):
        "Called to get a tk Frame for the settings dialog."

        self.hidecodexbtn = tk.IntVar(value=config.getint("Canonn:HideCodex"))

        self.hidecodex = self.hidecodexbtn.get()

        frame = nb.Frame(parent)
        frame.columnconfigure(1, weight=1)
        frame.grid(row=gridrow, column=0, sticky="NSEW")

        nb.Label(frame, text="Codex Settings").grid(row=0, column=0, sticky="NW")
        nb.Checkbutton(frame, text="Hide Codex Icons", variable=self.hidecodexbtn).grid(row=1, column=0, sticky="NW")

        return frame

    def prefs_changed(self, cmdr, is_beta):
        "Called when the user clicks OK on the settings dialog."
        config.set('Canonn:HideCodex', self.hidecodexbtn.get())

        self.hidecodex = self.hidecodexbtn.get()

        # dont check the retval
        # self.visible()

    def visible(self):

        noicons = (self.hidecodex == 1)

        if noicons:
            self.grid_remove()
            self.isvisible = False
            return False
        else:
            self.grid()
            self.isvisible = True
            return True
Esempio n. 44
0
    def show(self):
        self.__root.title(CONST.APP_NAME)
        mainFrame = Frame(self.__root)

        top = mainFrame.winfo_toplevel()
        top.rowconfigure(0, weight=1)
        top.columnconfigure(0, weight=1)
        mainFrame.rowconfigure(0, weight=1)
        mainFrame.columnconfigure(0, weight=1)
        mainFrame.grid(sticky='ew')

        # Three Sections: Input-Settings, Output-Settings and Buttons
        inputFrame = LabelFrame(mainFrame, text='Input Settings')
        inputFrame.columnconfigure(2, weight=1)
        inputFrame.grid(column=0, row=0, padx=5, pady=5, sticky='ew')
        outputFrame = LabelFrame(mainFrame, text='Output Settings')
        outputFrame.columnconfigure(2, weight=1)
        outputFrame.grid(column=0, row=1, padx=5, pady=5, sticky='ew')
        buttonFrame = Frame(mainFrame)
        buttonFrame.columnconfigure(3, weight=1)
        buttonFrame.grid(column=0, row=2, padx=5, pady=5, sticky='ew')

        # Input-Settings
        scribusSourceFileLabel = Label(inputFrame,
                                       text='Scribus File:',
                                       width=15,
                                       anchor='w')
        scribusSourceFileLabel.grid(column=0,
                                    row=0,
                                    padx=5,
                                    pady=5,
                                    sticky='w')
        scribusSourceFileEntry = Entry(
            inputFrame,
            textvariable=self.__ctrl.getScribusSourceFileEntryVariable())
        scribusSourceFileEntry.grid(column=1,
                                    columnspan=3,
                                    row=0,
                                    padx=5,
                                    pady=5,
                                    sticky='ew')
        scribusSourceFileButton = Button(
            inputFrame,
            text='⏏',
            command=self.__ctrl.scribusSourceFileEntryVariableHandler)
        scribusSourceFileButton.grid(column=4,
                                     row=0,
                                     padx=5,
                                     pady=5,
                                     sticky='e')
        scribusLoadSettingsButton = Button(
            inputFrame,
            text='↺',
            command=self.__ctrl.scribusLoadSettingsHandler)  # ⟲ ⟳ ↻ ↺ ⌂ ⌘ ⎗
        scribusLoadSettingsButton.grid(column=5,
                                       row=0,
                                       padx=5,
                                       pady=5,
                                       sticky='e')

        dataSourceFileLabel = Label(inputFrame,
                                    text='Data File:',
                                    width=15,
                                    anchor='w')
        dataSourceFileLabel.grid(column=0, row=1, padx=5, pady=5, sticky='w')
        dataSourceFileEntry = Entry(
            inputFrame,
            textvariable=self.__ctrl.getDataSourceFileEntryVariable())
        dataSourceFileEntry.grid(column=1,
                                 columnspan=4,
                                 row=1,
                                 padx=5,
                                 pady=5,
                                 sticky='ew')
        dataSourceFileButton = Button(
            inputFrame,
            text='⏏',
            command=self.__ctrl.dataSourceFileEntryVariableHandler)
        dataSourceFileButton.grid(column=5, row=1, padx=5, pady=5, sticky='e')

        dataSeparatorLabel = Label(inputFrame,
                                   text='Data Field Separator:',
                                   width=15,
                                   anchor='w')
        dataSeparatorLabel.grid(column=0, row=2, padx=5, pady=5, sticky='w')
        dataSeparatorEntry = Entry(
            inputFrame,
            width=3,
            textvariable=self.__ctrl.getDataSeparatorEntryVariable())
        dataSeparatorEntry.grid(column=1, row=2, padx=5, pady=5, sticky='w')

        fromLabel = Label(inputFrame,
                          text='(opt.) use partial data, only from:',
                          anchor='e')
        fromLabel.grid(column=2, row=2, padx=5, pady=5, sticky='e')
        fromEntry = Entry(inputFrame,
                          width=3,
                          textvariable=self.__ctrl.getFromVariable())
        fromEntry.grid(column=3, row=2, padx=5, pady=5, sticky='w')

        toLabel = Label(inputFrame, text='to:', width=3, anchor='e')
        toLabel.grid(column=4, row=2, padx=5, pady=5, sticky='e')
        toEntry = Entry(inputFrame,
                        width=3,
                        textvariable=self.__ctrl.getToVariable())
        toEntry.grid(column=5, row=2, padx=5, pady=5, sticky='w')

        # Output-Settings
        outputDirectoryLabel = Label(outputFrame,
                                     text='Output Directory:',
                                     width=15,
                                     anchor='w')
        outputDirectoryLabel.grid(column=0, row=0, padx=5, pady=5, sticky='w')
        outputDirectoryEntry = Entry(
            outputFrame,
            textvariable=self.__ctrl.getOutputDirectoryEntryVariable())
        outputDirectoryEntry.grid(column=1,
                                  columnspan=4,
                                  row=0,
                                  padx=5,
                                  pady=5,
                                  sticky='ew')
        outputDirectoryButton = Button(
            outputFrame,
            text='⏏',
            command=self.__ctrl.outputDirectoryEntryVariableHandler)
        outputDirectoryButton.grid(column=5, row=0, padx=5, pady=5, sticky='e')

        outputFileNameLabel = Label(outputFrame,
                                    text='Output File Name:',
                                    width=15,
                                    anchor='w')
        outputFileNameLabel.grid(column=0, row=1, padx=5, pady=5, sticky='w')
        outputFileNameEntry = Entry(
            outputFrame,
            textvariable=self.__ctrl.getOutputFileNameEntryVariable())
        outputFileNameEntry.grid(column=1,
                                 columnspan=3,
                                 row=1,
                                 padx=5,
                                 pady=5,
                                 sticky='ew')

        saveLabel = Label(outputFrame,
                          text='Save Settings:',
                          width=15,
                          anchor='w')
        saveLabel.grid(column=4, row=1, padx=5, pady=5, sticky='w')
        saveCheckbox = Checkbutton(
            outputFrame, variable=self.__ctrl.getSaveCheckboxVariable())
        saveCheckbox.grid(column=5, row=1, padx=5, pady=5, sticky='w')

        mergeOutputLabel = Label(outputFrame,
                                 text='Merge in Single File:',
                                 width=15,
                                 anchor='w')
        mergeOutputLabel.grid(column=0, row=2, padx=5, pady=5, sticky='w')
        mergeOutputCheckbox = Checkbutton(
            outputFrame, variable=self.__ctrl.getMergeOutputCheckboxVariable())
        mergeOutputCheckbox.grid(column=1, row=2, padx=5, pady=5, sticky='w')

        self.keepGeneratedScribusFilesLabel = Label(outputFrame,
                                                    text='Keep Scribus Files:',
                                                    width=15,
                                                    anchor='e')
        self.keepGeneratedScribusFilesLabel.grid(column=4,
                                                 row=2,
                                                 padx=5,
                                                 pady=5,
                                                 sticky='e')
        self.keepGeneratedScribusFilesCheckbox = Checkbutton(
            outputFrame,
            variable=self.__ctrl.getKeepGeneratedScribusFilesCheckboxVariable(
            ),
            anchor='w')
        self.keepGeneratedScribusFilesCheckbox.grid(column=5,
                                                    row=2,
                                                    padx=5,
                                                    pady=5,
                                                    sticky='w')

        outputFormatLabel = Label(outputFrame,
                                  text='Output Format:',
                                  anchor='e')
        outputFormatLabel.grid(column=2, row=2, padx=5, pady=5, sticky='e')
        outputFormatListBox = OptionMenu(
            outputFrame,
            self.__ctrl.getSelectedOutputFormat(),
            *self.__ctrl.getOutputFormatList(),
            command=lambda v=self.__ctrl.getSelectedOutputFormat(
            ): self.updateState(v))
        outputFormatListBox.grid(column=3, row=2, padx=5, pady=5, sticky='w')

        # Bottom Buttons
        generateButton = Button(buttonFrame,
                                text='✔\nGenerate',
                                width=10,
                                command=self.__ctrl.buttonOkHandler)
        generateButton.grid(column=0, row=0, padx=5, pady=5, sticky='w')
        cancelButton = Button(buttonFrame,
                              text='✘\nCancel',
                              width=10,
                              command=self.__ctrl.buttonCancelHandler)
        cancelButton.grid(column=1, row=0, padx=5, pady=5, sticky='e')
        helpButton = Button(buttonFrame,
                            text='❓\nHelp',
                            width=7,
                            command=self.__ctrl.helpButtonHandler)
        helpButton.grid(column=3, row=0, padx=5, pady=5, sticky='e')

        # general layout
        mainFrame.grid()
        self.__root.grid()
Esempio n. 45
0
class GroupSelect(Frame):
    """This is a widget with ability to choose specific group for further
    actions.
    """

    def __init__(self, parent=None, default_type="Classical", **kw):
        Frame.__init__(self, parent, **kw)
        self._parent = parent
        self._init_components()
        self._type_radio_buttons[default_type].select()

    def _init_components(self):
        # group type selection (alternating, classical, sporadic, exceptional)
        group_type_frame = LabelFrame(self, text="Group type", padx=10, pady=5)
        group_type_frame.pack(expand=True, fill='x')

        # group type radio buttons (Alternating, Classical etc.)
        self._group_type = StringVar()
        self._type_radio_buttons = dict()
        for group_type in ("Alternating", "Classical", "Exceptional", "Sporadic"):
            radiobutton = Radiobutton(group_type_frame, variable=self._group_type, value=group_type, text=group_type)
            radiobutton.pack(anchor='nw')
            self._type_radio_buttons[group_type] = radiobutton

        # set group type selection handler
        self._group_type.trace("w", lambda n, i, m: self._group_type_selection())

        # spacer
        Frame(self, height=10).pack()

        # parameters for each group (degree for alternating, field and dimension for classical etc.)
        # notice that we do not pack LabelFrame contents. We do that in _group_type_selection method instead.
        group_params_frame = LabelFrame(self, text="Parameters", padx=10, pady=5)
        group_params_frame.pack(expand=True, fill='x')

        # alternating
        self._alt_params = Frame(group_params_frame)
        self._alt_params.columnconfigure(1, weight=1)
        Label(self._alt_params, text="Degree").grid(sticky='w')
        self._alt_degree = NumberBox(self._alt_params, constraints=Constraints(min=5))
        self._alt_degree.grid(row=0, column=1, sticky='we')

        # classical
        self._clas_params = Frame(group_params_frame)
        self._clas_params.columnconfigure(1, weight=1)

        Label(self._clas_params, text="Type").grid(row=0, sticky='w')
        self._clas_type = OptionList(self._clas_params, values=ClassicalGroup.types())
        self._clas_type.variable.trace("w", lambda n, i, m: self._classical_group_type_selection())
        self._clas_type.grid(row=0, column=1, sticky='we')

        Label(self._clas_params, text="Dimension").grid(row=1, sticky='w')
        self._clas_dim = NumberBox(self._clas_params)
        self._clas_dim.grid(row=1, column=1, sticky='we')

        Label(self._clas_params, text="Field order").grid(row=2, sticky='w')
        self._clas_field = NumberBox(self._clas_params, constraints=Constraints(primality=numeric.PRIME_POWER))
        self._clas_field.grid(row=2, column=1, sticky='we')

        self._classical_group_type_selection()

        # exceptional
        self._ex_params = Frame(group_params_frame)
        self._ex_params.columnconfigure(1, weight=1)

        Label(self._ex_params, text="Type").grid(row=0, sticky='w')
        self._ex_type = OptionList(self._ex_params, values=ExceptionalGroup.types())
        self._ex_type.setvar(value=ExceptionalGroup.types()[0])
        self._ex_type.grid(row=0, column=1, sticky='we')

        Label(self._ex_params, text="Field order").grid(row=1, sticky='w')
        self._ex_field = NumberBox(self._ex_params, constraints=Constraints(primality=numeric.PRIME_POWER))
        self._ex_field.grid(row=1, column=1, sticky='we')

        # sporadic
        self._spor_params = Frame(group_params_frame)
        self._spor_params.columnconfigure(1, weight=1)

        Label(self._spor_params, text="Group").grid(row=0, sticky='w')
        self._sporadic_group = OptionList(self._spor_params, values=SporadicGroup.all_groups())
        self._sporadic_group.grid(row=0, column=1, sticky='we')

    @property
    def selected_group(self):
        """Returns currently selected group
        """
        if self._group_type.get() == "Alternating":
            self._alt_degree.refresh_input()
            return AlternatingGroup(self._alt_degree.get_number())
        if self._group_type.get() == "Classical":
            self._clas_dim.refresh_input()
            self._clas_field.refresh_input()
            return ClassicalGroup(self._clas_type.variable.get(),
                                  self._clas_dim.get_number(), self._clas_field.get_number())
        if self._group_type.get() == "Sporadic":
            return SporadicGroup(self._sporadic_group.variable.get())
        if self._group_type.get() == "Exceptional":
            self._ex_field.refresh_input()
            return ExceptionalGroup(self._ex_type.variable.get(), self._ex_field.get_number())

    def _group_type_selection(self):
        """Process the change of selected group type
        """

        def set_visible(widget, visible):
            if visible:
                widget.pack(expand=True, fill='both')
            else:
                widget.forget()

        group_type = self._group_type.get()
        set_visible(self._alt_params, group_type == "Alternating")
        set_visible(self._clas_params, group_type == "Classical")
        set_visible(self._spor_params, group_type == "Sporadic")
        set_visible(self._ex_params, group_type == "Exceptional")

    def _classical_group_type_selection(self):
        name = self._clas_type.variable.get()
        self._clas_dim.set_constraints(ClassicalGroup.dim_constraints(name))
        self._clas_field.set_constraints(ClassicalGroup.field_constraints(name))
Esempio n. 46
0
    def __init__(self, root, modifstruct, param_visu, mess):
        """!Creation de l'interface pour le calcul de condensation de la mesure

        """
        Frame.__init__(self, root, relief='sunken', borderwidth=1)
        self.root = root
        self.modif_struct = modifstruct
        self.param_visu = param_visu
        self.mess = mess
        self.columnconfigure(0, weight=1)
        self.columnconfigure(1, weight=1)
        self.columnconfigure(2, weight=1)
        self.rowconfigure(1, weight=1)
        self.term = []

        objects = self.root.objects
        # Déclaration des variables Tk
        self.var_resu_exp = StringVar()
        self.condens_meth = StringVar()
        self.var_modl_sup = StringVar()
        self.var_grno_capt = StringVar()
        self.var_grno_intf = StringVar()
        self.var_raid_name = StringVar()
        self.var_modlx = StringVar()
        self.sumail_name = StringVar()

        self.param_mode_iter_simult_lmme = None
        self.param_dlg = None

        # -----------------------------------------------------------------
        # Titre
        #
        Label(self, text="Choix de la base d'expansion", font=self.root.font2
              ).grid(row=0, column=0, columnspan=3, sticky="ew")

        # -----------------------------------------------------------------
        # Definition du modele support
        f = Frame(self)
        f.grid(row=1, column=0, sticky='nsew', padx=60)
        f.columnconfigure(0, weight=3)

        # menu de selection des modes identifies
        Label(f, text="Modes experimentaux").grid(row=0, column=0, sticky='w')
        self.menu_resu_exp = MyMenu(f, objects.get_mode_meca_name(),
                                    self.var_resu_exp, self.refresh_list_exp)
        self.menu_resu_exp.grid(row=0, column=1, sticky='ew')

        # menu de selection du modele support
        Label(f, text="Modele support").grid(row=1, column=0, sticky='w')
        self.menu_modl_sup = MyMenu(f, objects.get_model_name(),
                                    self.var_modl_sup, self.modele_support_changed)
        self.menu_modl_sup.grid(row=1, column=1, sticky='ew')

        # menu de selection de la matrice de raideur assemblee du modele
        # support
        Label(f, text="Matrice raideur (support)",
              justify='left').grid(row=2, column=0, sticky='w')
        self.menu_raid_name = MyMenu(f, objects.get_matr_name(),
                                     self.var_raid_name,
                                     self.mat_raideur_changed)
        self.menu_raid_name.grid(row=2, column=1, sticky='ew')

        Label(f, text="Methode (base expansion)").grid(
            row=3, column=0, sticky='w')

        self.dic_condens_meth = {
            "ES": "Expansion statique",
            "LMME": "Expansion statique projetee",
        }

        self.menu_condens_meth = MyMenu(f, self.dic_condens_meth.keys(),
                                        self.condens_meth,
                                        self.condens_changed)
        self.menu_condens_meth.grid(row=3, column=1, sticky='ew')
        self.condens_meth.set("ES")

        # menu selection du modele modification
        Label(f, text="Modele modification").grid(row=4, column=0, sticky='w')
        self.menu_modlx = MyMenu(f, objects.get_model_name(),
                                 self.var_modlx, self.modele_modif_changed)
        self.menu_modlx.grid(row=4, column=1, sticky='ew')

        # menu de selection du groupe de noeuds capteur
        self.capteur = SelectionNoeuds(f, "Noeuds et DDL capteur",
                                       bg='#90a090', command=self.capteur_changed)
        self.capteur.grid(row=5, column=0, columnspan=2, pady=3, sticky='ew')

        # menu de selection du groupe de noeuds interface
        self.iface = SelectionNoeuds(f, "Noeuds et DDL interface",
                                     bg='#9090a0', command=self.iface_changed)
        self.iface.grid(row=6, column=0, columnspan=2, pady=3, sticky='ew')

        Label(f, text="Nom de la super maille : ").grid(
            row=7, column=0, sticky='w')
        Entry(f, textvariable=self.sumail_name).grid(row=7, column=1)
        self.sumail_name.set("SUMAIL")

        Button(f, text="Valider", command=self.anything_changed).grid(row=8,
                                                                      column=1,
                                                                      sticky='e')

        # -----------------------------------------------------------------
        # menu de selection des modes identifies experimentalement
        f = Frame(self)
        f.grid(row=1, column=1, sticky='nsew')
        f.rowconfigure(0, weight=1)
        self.liste_exp = ModeFreqList(f, "Modes du modele experimental")
        self.liste_exp.grid(row=0, column=0, columnspan=2, sticky='nsew')
        Button(f, text="Voir", command=self.view_model_exp).grid(row=1,
                                                                 column=0,
                                                                 columnspan=2)

        # -----------------------------------------------------------------
        # menu de selection de la methode pour
        # le calcul de la base d'expansion
        f = Frame(self)
        f.grid(row=1, column=2, sticky='nsew')
        f.rowconfigure(0, weight=1)
        self.liste_sup = ModeFreqList(f, "Base d'expansion")
        self.liste_sup.grid(row=0, column=0, sticky='snew')

        Button(f, text="Voir", command=self.view_expansion).grid(
            row=1, column=0)

        self.reglage_lmme_visible = IntVar()
        self.button_reglage_lmme = Checkbutton(f, text="Reglages LMME",
                                               variable=self.reglage_lmme_visible,
                                               command=self.show_param_dialog,
                                               state='disabled', indicatoron=0)

        self.reglage_lmme_visible.set(0)
        self.button_reglage_lmme.grid(row=1, column=1)
        self.configure_param_lmme_dialog()
Esempio n. 47
0
    def show_items(self, items, upper=[]):
        """
        Creates a new page on the stack, automatically adds a back button when there are
        pages on the stack already

        :param items: list the items to display
        :param upper: list previous levels' ids
        :return: None
        """
        num = 0

        # create a new frame
        wrap = Frame(self, bg="black")
        # when there were previous frames, hide the top one and add a back button for the new one
        if len(self.framestack):
            self.hide_top()
            back = FlatButton(
                wrap,
                text='back…',
                image=self.get_icon("arrow.left"),
                command=self.go_back,
            )
            back.set_color("#00a300")  # green
            back.grid(row=0, column=0, padx=1, pady=1, sticky=TkC.W + TkC.E + TkC.N + TkC.S)
            num += 1
        # add the new frame to the stack and display it
        self.framestack.append(wrap)
        self.show_top()

        # calculate tile distribution
        all = len(items) + num
        rows = floor(sqrt(all))
        cols = ceil(all / rows)

        # make cells autoscale
        for x in range(int(cols)):
            wrap.columnconfigure(x, weight=1)
        for y in range(int(rows)):
            wrap.rowconfigure(y, weight=1)

        # display all given buttons
        for item in items:
            act = upper + [item['name']]

            if 'icon' in item:
                image = self.get_icon(item['icon'])
            else:
                image = self.get_icon('scrabble.'+item['label'][0:1].lower())

            btn = FlatButton(
                wrap,
                text=item['label'],
                image=image
            )

            if 'items' in item:
                # this is a deeper level
                btn.configure(command=lambda act=act, item=item: self.show_items(item['items'], act), text=item['label']+'…')
                btn.set_color("#2b5797")  # dark-blue
            else:
                # this is an action
                btn.configure(command=lambda act=act: self.go_action(act), )

            if 'color' in item:
                btn.set_color(item['color'])

            # add buton to the grid
            btn.grid(
                row=int(floor(num / cols)),
                column=int(num % cols),
                padx=1,
                pady=1,
                sticky=TkC.W + TkC.E + TkC.N + TkC.S
            )
            num += 1
Esempio n. 48
0
    def __init__(self, root, modif_struct, param_visu, mess):
        """!Creation de l'interface pour le couplage des deux modeles : mesure condense / modification

        """
        Frame.__init__(self, root, relief='sunken', borderwidth=1)
        self.root = root
        self.modif_struct = modif_struct
        self.param_visu = param_visu
        self.mess = mess
        self.term = []

        # Titre du panneau
        # ----------------
        Label(self, text="Couplage modification / modele condense",
              bg='#f0f0f0', font=self.root.font2,
              ).grid(row=0, column=0, padx=60, columnspan=3, sticky='new')

        self.columnconfigure(0, weight=1)
        self.columnconfigure(1, weight=1)
        # self.columnconfigure(2,weight=1)
        self.rowconfigure(1, weight=1)

        # Parametres de PROJ_MESU_MODAL pour le couplage
        # ----------------------------------------------
        f1 = Frame(self, relief='sunken', borderwidth=1)
        f1.rowconfigure(0, weight=1)
        f1.grid(row=1, column=0, sticky='nsew', padx=60)

        Label(f1, text=" Parametres de PROJ_MESU_MODAL",
              bg='#f0f0f0').grid(row=0, column=0, sticky='nw')

        self.var_expans_param_frame_visible = IntVar()
        Checkbutton(f1, text="Reglages",
                    command=self.display_expans_param_frame,
                    variable=self.var_expans_param_frame_visible,
                    indicatoron=0).grid(row=1, column=1, sticky='e')

        self.expans_param_frame = frm1 = Toplevel()
        frm1.rowconfigure(0, weight=1)
        frm1.columnconfigure(0, weight=1)

        self.param_proj_mesu = ParamProjMesuModal(
            frm1, "Parametres de PROJ_MESU_MODAL")
        self.param_proj_mesu.grid(row=0, column=0, sticky='nsew')

        frm1.protocol("WM_DELETE_WINDOW", self.hide_expans_param_frame)
        Button(frm1, text="OK", command=self.hide_expans_param_frame).grid(
            row=1, column=0)
        frm1.withdraw()

        # Frame de parametrage du couplage : calcul modal
        # -----------------------------------------------
        f2 = Frame(self, relief='sunken', borderwidth=1)
        f2.rowconfigure(0, weight=1)
        f2.grid(row=2, column=0, sticky='nsew', padx=60)

        Label(f2, text="Calcul modal sur le modele couple",
              bg='#f0f0f0').grid(row=0, column=0, sticky='nw')

        Label(f2, text="Critère de recherche des modes ").grid(row=1, column=0, sticky='w')
        self.var_couplage_param_frame_visible = IntVar()
        Checkbutton(f2, text="Reglages",
                    command=self.display_couplage_param_frame,
                    variable=self.var_couplage_param_frame_visible,
                    indicatoron=0).grid(row=1, column=1, sticky='e')

        self.couplage_param_frame = frm2 = Toplevel()
        frm2.rowconfigure(0, weight=1)
        frm2.columnconfigure(0, weight=1)

        self.param_simult_modes_couple = ParamModelCouple(frm2, "Modele couple")
        self.param_simult_modes_couple.grid(row=0, column=0, sticky='nsew')

        frm2.protocol("WM_DELETE_WINDOW", self.hide_couplage_param_frame)
        Button(frm2, text="OK", command=self.hide_couplage_param_frame).grid(
            row=1, column=0)
        frm2.withdraw()

        f3 = Frame(self, borderwidth=1)
        f3.grid(row=3, column=0, padx=60)
        self.button_condensation = Button(f3, text='Calculer',
                                          command=self.calc_condensation)
        self.button_condensation.grid(row=0, column=0, sticky="es")

        f4 = Frame(self, relief='sunken', borderwidth=1)
        f4.rowconfigure(0, weight=1)
        # f4.grid(row=1,column=2,rowspan=3,sticky='nsew',padx=60)
        f4.grid(row=1, column=2, rowspan=4, sticky='nsew', padx=60)

        self.liste_resu = ModeFreqList(f4, "Frequences structure modifiee")
        self.liste_resu.grid(row=0, column=0, sticky='nsew')

        # Frame pour calcul de critere de qualite de la base d'expansion
        # -----------------------------------------------
        f5 = Frame(self, relief='sunken', borderwidth=1)
        f5.rowconfigure(0, weight=1)
        f5.grid(row=4, column=0, sticky='nsew', padx=60, pady=30,)

        Label(f5, text="Qualite de la base expansion",
              bg='#f0f0f0').grid(row=0, column=0, sticky='nw')

        self.dic_mac_meth = {
            "MAC": "Calcul de MAC classic",
            "IERI": "Critere IERI",
        }

        Label(f5, text="Critere").grid(row=1, column=0, sticky='w')
        self.mac_meth = StringVar()
        self.menu_mac_meth = MyMenu(f5, self.dic_mac_meth.keys(),
                                    self.mac_meth,
                                    self.mac_changed)
        self.menu_mac_meth.grid(row=1, column=1, sticky='e')

        Label(f5, text="Ponderation").grid(row=2, column=0, sticky='w')
        self.crit_ponder = StringVar()
        self.menu_ponder = MyMenu(f5, ['SANS', 'RIGIDITE', 'MASSE'],
                                  self.crit_ponder,
                                  self.choix_ponder)
        self.menu_ponder.grid(row=2, column=1, sticky='e')

        Button(f5, text="Valider", command=self.indic_qualite).grid(row=3,
                                                                    column=2,
                                                                    sticky='e')

        # Affichage de MAC_MODE / comparaison frequences
        # ---------------------
        f = Frame(self, relief='sunken', borderwidth=1)
        # f.grid(row=4,column=1,columnspan=2,pady =10,sticky='nsew')
        f.grid(row=6, column=0, padx=60, pady=10, sticky='nsew')
        f.rowconfigure(0, weight=1)
        f.columnconfigure(0, weight=1)

        self.mw = MacWindowFrame(
            f, "Critere de qualite de la base", "Frequences propres", "(structure modifiee)")
        self.mw.grid(row=1, column=0, columnspan=3, sticky='nsew')

        return
Esempio n. 49
0
plots = Frame(root)
plots.pack(side=LEFT, fill=BOTH, expand=1)

window = Frame(root)
window.pack(side=RIGHT, fill=BOTH, expand=1)

plotting = LabelFrame(window, text='Plotting')
plotting.pack(fill=BOTH, expand=1)

monitor = LabelFrame(window, text='Monitor')
monitor.pack(fill=BOTH, expand=1)

control = LabelFrame(window, text='Control')
control.pack(fill=BOTH, expand=1)

window.columnconfigure(0, weight=1)
window.columnconfigure(1, weight=1)
window.rowconfigure(0, weight=1)
window.rowconfigure(1, weight=1)
window.rowconfigure(2, weight=1)


server = sma.SubmillimeterArrayClient(server_host, server_port)
if options.remote:
    client = server
else:
    client = sma.BEE2CorrelatorClient(listen_host, listen_port)
try:
    server.subscribe(listen_host, listen_port) # the server's local UDP client
except:
    pass
Esempio n. 50
0
class Example(Frame):
    def __init__(self, parent):
        self.catFactors = {}
        Frame.__init__(self, parent)

        self.parent = parent
        self.initUI()

    def initUI(self):
        if hasattr(self, 'frame0'):
            self.frame0.destroy()
        self.initUIRoot()
        self.initUIFrame()

    def initUIRoot(self):
        self.parent.title("集总模型")
        self.pack(fill=BOTH, expand=1)

        menubar = Menu(self.parent)
        self.parent.config(menu=menubar)
        self.frame0 = Frame(self, relief=RAISED)
        self.frame0.pack(fill=BOTH, expand=True)

        fileMenu = Menu(menubar)
        fileMenu.add_command(label=u"新建催化剂", command=self.onNewCata)
        fileMenu.add_command(label=u"精确预测", command=self.onNewPre)
        fileMenu.add_command(label=u"趋势预测", command=self.onNewGraph)
        fileMenu.add_command(label=u"最优条件预测", command=self.onNewBest)
        helpMenu = Menu(menubar)
        helpMenu.add_command(label=u"关于", command=self.onHelp)

        mainPageMenu = Menu(menubar)
        mainPageMenu.add_command(label=u"主页", command=self.initUI)
        menubar.add_cascade(label="主页", menu=mainPageMenu)
        menubar.add_cascade(label="操作", menu=fileMenu)
        menubar.add_cascade(label="帮助", menu=helpMenu)

    def initUIFrame(self):
        self.frame0.columnconfigure(0, pad=5, weight=1)
        self.frame0.columnconfigure(1, pad=5, weight=1)
        self.frame0.columnconfigure(2, pad=5, weight=1)
        self.frame0.columnconfigure(3, pad=5, weight=1)
        self.frame0.columnconfigure(4, pad=5, weight=1)
        self.frame0.columnconfigure(5, pad=5, weight=1)
        self.frame0.rowconfigure(0, pad=37)
        self.frame0.rowconfigure(1, pad=7)
        self.frame0.rowconfigure(2, pad=7, weight=1)
        titleImg = ImageTk.PhotoImage(file="./imgs/title.png")
        catImg = ImageTk.PhotoImage(file="./imgs/cat.png")
        preImg = ImageTk.PhotoImage(file="./imgs/pre.png")
        chartImg = ImageTk.PhotoImage(file="./imgs/chart.png")
        bestImg = ImageTk.PhotoImage(file="./imgs/bestPoint.png")
        rareImg = ImageTk.PhotoImage(file="./imgs/rare.png")

        lbl = Label(self.frame0, image=titleImg)
        lbl.grid(row=0, column=1,columnspan=5,sticky=S+W)
        lbl.image = titleImg
        lbl = Label(self.frame0, image=rareImg)
        lbl.grid(row=3, column=1,columnspan=5,sticky=S)
        lbl.image = rareImg
        preButton = Button(self.frame0, command=self.onNewPre)
        preButton.config(image=preImg)
        preButton.image = preImg
        preButton.grid(row=1, column=2)
        cateButton = Button(self.frame0, command=self.onNewCata)
        cateButton.config(image=catImg)
        cateButton.image = catImg
        cateButton.grid(row=1, column=1)
        chartButton = Button(self.frame0, command=self.onNewGraph)
        chartButton.config(image=chartImg)
        chartButton.image = chartImg
        chartButton.grid(row=1, column=3)
        chartButton = Button(self.frame0, command=self.onNewBest)
        chartButton.config(image=bestImg)
        chartButton.image = bestImg
        chartButton.grid(row=1, column=4)

        lbl = Label(self.frame0, text="新建催化剂")
        lbl.grid(row=2, column=1, sticky=N)
        lbl = Label(self.frame0, text="精确预测")
        lbl.grid(row=2, column=2, sticky=N)
        lbl = Label(self.frame0, text="趋势预测")
        lbl.grid(row=2, column=3, sticky=N)
        lbl = Label(self.frame0, text="最优条件预测")
        lbl.grid(row=2, column=4, sticky=N)
    def bestUI(self):
        self.frame0.destroy()
        self.initUIRoot()
        frame1 = Frame(self.frame0, relief=RAISED, borderwidth=1)
        frame1.pack(fill=BOTH, expand=False)

        frame2 = Frame(self.frame0, relief=RAISED, borderwidth=1)
        frame2.pack(fill=BOTH, expand=True)

        frame1.columnconfigure(1, weight=1)
        # frame1.columnconfigure(9, weight=1)
        frame1.columnconfigure(10, pad=7)
        frame1.rowconfigure(5, weight=1)
        frame1.rowconfigure(5, pad=7)

        frame2.columnconfigure(11, pad=7, weight=1)
        frame2.rowconfigure(8, pad=7)

        lbl = Label(frame1, text="催化剂性质")
        lbl.grid(row=0, column=0, columnspan=8, rowspan=1, sticky=W, pady=4, padx=5)
        # K_Mat_Tree = ttk.Treeview(frame1)
        # K_Mat_Tree['show'] = 'headings'
        # K_Mat_Tree = self.makeMatrixUI(7, K_Mat_Tree, sourceDate.K_model)
        # K_Mat_Tree.grid(row=1, column=0, columnspan=6, rowspan=5, sticky=E + W + S + N, pady=4, padx=5)
        K_Mat_Tree = Text(frame1, height=18)
        self.makeMatrixUI(K_Mat_Tree, self.catObj)
        K_Mat_Tree.configure(state='normal')
        K_Mat_Tree.grid(row=1, column=0, columnspan=6, rowspan=6, sticky=E + W + S + N, pady=4, padx=5)

        lbl = Label(frame1, text="优化方法:")
        lbl.grid(row=0, column=6, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5)
        txt = Entry(frame1)
        txt.insert(0, self.catObj.optMethod)
        txt.configure(state='readonly')
        txt.grid(row=0, column=8, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5)

        lbl = Label(frame1, text="集总数:")
        lbl.grid(row=1, column=6, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5)
        txt = Entry(frame1)
        txt.insert(0, self.catObj.n)
        txt.configure(state='readonly')
        txt.grid(row=1, column=8, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5)

        lbl = Label(frame1, text="精确度:")
        lbl.grid(row=2, column=6, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5)
        txt = Entry(frame1)
        txt.insert(0, self.catObj.tol)
        txt.configure(state='readonly')
        txt.grid(row=2, column=8, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5)

        cateDetailButton = Button(frame1, text="查看催化剂详情")
        cateDetailButton.grid(row=3, column=8)
        # ________________________________________
        lbl = Label(frame2, text="待预测条件")
        lbl.grid(row=0, column=0, sticky=W, columnspan=5, rowspan=1, pady=4, padx=5)

        lbl = Label(frame2, text="初始组成(<1 英文逗号分割):")
        lbl.grid(row=1, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.Y0_input = Entry(frame2)
        self.Y0_input.grid(row=1, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="温度范围(K 英文逗号分割 )")
        lbl.grid(row=2, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.T_input = Entry(frame2)
        if not self.catObj.withTemp:
            self.T_input.insert(0, self.catObj.t)
            self.T_input.configure(state='readonly')
        self.T_input.grid(row=2, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="压力范围(KPa 英文逗号分割)")
        lbl.grid(row=3, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.p_input = Entry(frame2)
        self.p_input.grid(row=3, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="剂油比范围 (英文逗号分割)")
        lbl.grid(row=4, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.roil_input = Entry(frame2)
        self.roil_input.grid(row=4, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="停留时间范围(英文逗号分割s)")
        lbl.grid(row=5, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.t_input = Entry(frame2)
        self.t_input.grid(row=5, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="碱氮含量(<1)")
        lbl.grid(row=6, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.yn_input = Entry(frame2)
        self.yn_input.insert(0, 0.0)
        self.yn_input.grid(row=6, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="重芳烃含量(<1)")
        lbl.grid(row=7, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.ya_input = Entry(frame2)
        self.ya_input.grid(row=7, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="微分方程步长")
        lbl.grid(row=8, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.step_input = Entry(frame2)
        self.step_input.insert(0, 0.1)
        self.step_input.grid(row=8, column=2, columnspan=3, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="待预测组分编号(,)")
        lbl.grid(row=9, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.target = Entry(frame2)
        self.target.insert(0, '5,6,7')
        self.target.grid(row=9, column=2, columnspan=3, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="结果组成")
        lbl.grid(row=0, column=7, columnspan=2, rowspan=1, pady=4, padx=5, sticky=W)
        self.preResult_LB = Listbox(frame2)
        self.preResult_LB.grid(row=1, column=7, columnspan=2, rowspan=8, pady=4, padx=5, sticky=W)

        lbl = Label(frame2, text="最优温度:")
        lbl.grid(row=0, column=9, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.bestT = Entry(frame2)
        self.bestT.delete(0, 'end')
        self.bestT.configure(state='readonly')
        self.bestT.grid(row=0, column=11, columnspan=3, rowspan=1, sticky=W, pady=4, padx=5)
        lbl = Label(frame2, text="最优压力:")
        lbl.grid(row=1, column=9, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.bestP = Entry(frame2)
        self.bestP.delete(0, 'end')
        self.bestP.configure(state='readonly')
        self.bestP.grid(row=1, column=11, columnspan=3, rowspan=1, sticky=W, pady=4, padx=5)
        lbl = Label(frame2, text="最优剂油比:")
        lbl.grid(row=2, column=9, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.bestR = Entry(frame2)
        self.bestR.delete(0, 'end')
        self.bestR.configure(state='readonly')
        self.bestR.grid(row=2, column=11, columnspan=3, rowspan=1, sticky=W, pady=4, padx=5)
        lbl = Label(frame2, text="最优反应时间:")
        lbl.grid(row=3, column=9, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.bestTime = Entry(frame2)
        self.bestTime.delete(0, 'end')
        self.bestTime.configure(state='readonly')
        self.bestTime.grid(row=3, column=11, columnspan=3, rowspan=1, sticky=W, pady=4, padx=5)
        lbl = Label(frame2, text="目标结果:")
        lbl.grid(row=4, column=9, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.bestSum = Entry(frame2)
        self.bestSum.delete(0, 'end')
        self.bestSum.configure(state='readonly')
        self.bestSum.grid(row=4, column=11, columnspan=3, rowspan=1, sticky=W, pady=4, padx=5)
        cateDetailButton = Button(frame2, text="预测", command=self.doBest)
        cateDetailButton.grid(row=9, column=6, columnspan=2)

    def preUI(self):
        self.frame0.destroy()
        self.initUIRoot()
        frame1 = Frame(self.frame0, relief=RAISED, borderwidth=1)
        frame1.pack(fill=BOTH, expand=False)

        frame2 = Frame(self.frame0, relief=RAISED, borderwidth=1)
        frame2.pack(fill=BOTH, expand=True)

        frame1.columnconfigure(1, weight=1)
        # frame1.columnconfigure(9, weight=1)
        frame1.columnconfigure(10, pad=7)
        frame1.rowconfigure(5, weight=1)
        frame1.rowconfigure(5, pad=7)

        frame2.columnconfigure(8, pad=7, weight=1)
        frame2.rowconfigure(8, pad=7)

        lbl = Label(frame1, text="催化剂性质")
        lbl.grid(row=0, column=0, columnspan=8, rowspan=1, sticky=W, pady=4, padx=5)
        # K_Mat_Tree = ttk.Treeview(frame1)
        # K_Mat_Tree['show'] = 'headings'
        # K_Mat_Tree = self.makeMatrixUI(7, K_Mat_Tree, sourceDate.K_model)
        # K_Mat_Tree.grid(row=1, column=0, columnspan=6, rowspan=5, sticky=E + W + S + N, pady=4, padx=5)
        K_Mat_Tree = Text(frame1, height=18)
        self.makeMatrixUI(K_Mat_Tree, self.catObj)
        K_Mat_Tree.configure(state='normal')
        K_Mat_Tree.grid(row=1, column=0, columnspan=6, rowspan=6, sticky=E + W + S + N, pady=4, padx=5)

        lbl = Label(frame1, text="优化方法:")
        lbl.grid(row=0, column=6, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5)
        txt = Entry(frame1)
        txt.insert(0, self.catObj.optMethod)
        txt.configure(state='readonly')
        txt.grid(row=0, column=8, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5)

        lbl = Label(frame1, text="集总数:")
        lbl.grid(row=1, column=6, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5)
        txt = Entry(frame1)
        txt.insert(0, self.catObj.n)
        txt.configure(state='readonly')
        txt.grid(row=1, column=8, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5)

        lbl = Label(frame1, text="精确度:")
        lbl.grid(row=2, column=6, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5)
        txt = Entry(frame1)
        txt.insert(0, self.catObj.tol)
        txt.configure(state='readonly')
        txt.grid(row=2, column=8, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5)

        cateDetailButton = Button(frame1, text="查看催化剂详情")
        cateDetailButton.grid(row=3, column=8)
        # ________________________________________
        lbl = Label(frame2, text="待预测条件")
        lbl.grid(row=0, column=0, sticky=W, columnspan=5, rowspan=1, pady=4, padx=5)

        lbl = Label(frame2, text="初始组成(<1 英文逗号分割):")
        lbl.grid(row=1, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.Y0_input = Entry(frame2)
        self.Y0_input.grid(row=1, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="温度(K)")
        lbl.grid(row=2, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.T_input = Entry(frame2)
        if not self.catObj.withTemp:
            self.T_input.insert(0, self.catObj.t)
            self.T_input.configure(state='readonly')
        self.T_input.grid(row=2, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="压力(KPa)")
        lbl.grid(row=3, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.p_input = Entry(frame2)
        self.p_input.grid(row=3, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="剂油比")
        lbl.grid(row=4, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.roil_input = Entry(frame2)
        self.roil_input.grid(row=4, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="停留时间(s)")
        lbl.grid(row=5, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.t_input = Entry(frame2)
        self.t_input.grid(row=5, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="碱氮含量(<1)")
        lbl.grid(row=6, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.yn_input = Entry(frame2)
        self.yn_input.insert(0, 0.0)
        self.yn_input.grid(row=6, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="重芳烃含量(<1)")
        lbl.grid(row=7, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.ya_input = Entry(frame2)
        self.ya_input.grid(row=7, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="微分方程步长")
        lbl.grid(row=8, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.step_input = Entry(frame2)
        self.step_input.insert(0, 0.1)
        self.step_input.grid(row=8, column=2, columnspan=3, rowspan=1, sticky=E, pady=4, padx=5)
        self.preResult_LB = Listbox(frame2)
        self.preResult_LB.grid(row=1, column=7, columnspan=2, rowspan=6, pady=4, padx=5)

        cateDetailButton = Button(frame2, text="预测", command=self.doPre)
        cateDetailButton.grid(row=8, column=7, columnspan=2)

    def cateUI(self):
        self.frame0.destroy()
        self.initUIRoot()
        frame4 = Frame(self.frame0, relief=RAISED, borderwidth=1)
        frame4.pack(fill=BOTH)

        frame1 = Frame(self.frame0, relief=RAISED, borderwidth=1)
        frame1.pack(fill=BOTH, expand=True)

        frame1.columnconfigure(0, weight=1)
        # frame1.columnconfigure(9, weight=1)
        frame1.rowconfigure(0, weight=1)

        lbl = Label(frame4, text="已输入温度组数")
        lbl.grid(row=0, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.varCountT = StringVar()
        self.countT = Message(frame4, textvariable=self.varCountT)
        self.varCountT.set('0')

        self.countT.grid(row=0, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        factor_Tree = ttk.Treeview(frame1)
        factor_Tree['show'] = 'headings'
        factor_Tree["columns"] = ['t_resid', 't', 'r_oil', 'p', 'Y0', 'Y_results', 'w_aro', 'w_nitro']
        #
        factor_Tree.heading("t", text="温度")
        factor_Tree.column("t", width=self.winfo_width() / 8)
        factor_Tree.heading("r_oil", text="剂油比")
        factor_Tree.column("r_oil", width=self.winfo_width() / 8)
        factor_Tree.heading("p", text="压力")
        factor_Tree.column("p", width=self.winfo_width() / 8)
        factor_Tree.heading("Y0", text="初始组成")
        factor_Tree.column("Y0", width=self.winfo_width() / 8)
        factor_Tree.heading("Y_results", text="产物组成")
        factor_Tree.column("Y_results", width=self.winfo_width() / 8)
        factor_Tree.heading("w_aro", text="重芳烃含量")
        factor_Tree.column("w_aro", width=self.winfo_width() / 8)
        factor_Tree.heading("w_nitro", text="碱氮含量")
        factor_Tree.column("w_nitro", width=self.winfo_width() / 8)
        factor_Tree.heading("t_resid", text="停留时间")
        factor_Tree.column("t_resid", width=self.winfo_width() / 8)
        factor_Tree.grid(row=0, column=0, pady=4, padx=5)
        self.factor_Tree = factor_Tree
        frame2 = Frame(self.frame0, relief=RAISED, borderwidth=1)
        frame2.pack(fill=BOTH, expand=True)

        frame2.columnconfigure(0, weight=1)
        frame2.columnconfigure(8, weight=1)

        lbl = Label(frame2, text="停留时间(s)")
        lbl.grid(row=0, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.t_input = Entry(frame2)
        self.t_input.grid(row=0, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="温度(K)")
        lbl.grid(row=1, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.T_input = Entry(frame2)
        self.T_input.grid(row=1, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="剂油比")
        lbl.grid(row=2, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.roil_input = Entry(frame2)
        self.roil_input.grid(row=2, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="压力(KPa)")
        lbl.grid(row=3, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.p_input = Entry(frame2)
        self.p_input.grid(row=3, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="初始组成(<1 英文逗号分割):")
        lbl.grid(row=0, column=4, columnspan=2, rowspan=1, sticky=W, pady=4, padx=5)
        self.Y0_input = Entry(frame2)
        self.Y0_input.grid(row=0, column=6, columnspan=2, rowspan=1, sticky=W, pady=4, padx=5)

        lbl = Label(frame2, text="产物组成(<1 英文逗号分割):")
        lbl.grid(row=1, column=4, columnspan=2, rowspan=1, sticky=W, pady=4, padx=5)
        self.Y_results_input = Entry(frame2)
        self.Y_results_input.grid(row=1, column=6, columnspan=2, rowspan=1, sticky=W, pady=4, padx=5)

        lbl = Label(frame2, text="碱氮含量(<1)")
        lbl.grid(row=2, column=4, columnspan=2, rowspan=1, sticky=W, pady=4, padx=5)
        self.yn_input = Entry(frame2)
        self.yn_input.insert(0, 0.0)
        self.yn_input.grid(row=2, column=6, columnspan=2, rowspan=1, sticky=W, pady=4, padx=5)

        lbl = Label(frame2, text="重芳烃含量(<1)")
        lbl.grid(row=3, column=4, columnspan=2, rowspan=1, sticky=W, pady=4, padx=5)
        self.ya_input = Entry(frame2)
        self.ya_input.grid(row=3, column=6, columnspan=2, rowspan=1, sticky=W, pady=4, padx=5)

        lbl = Label(frame2, text="分子质量(逗号分割)")
        lbl.grid(row=4, column=4, columnspan=2, rowspan=1, sticky=W, pady=4, padx=5)
        self.Molmasses_input = Entry(frame2)
        self.Molmasses_input.grid(row=4, column=6, columnspan=2, rowspan=1, sticky=W, pady=4, padx=5)
        self.Molmasses_input.insert('0.8,1.1,1.8,0.2,0.2,0.2,0.11,0.016,0.042,0.056,0.05,0.012')
        addButton = Button(frame2, command=self.addFactors, text="添加条件")
        addButton.grid(row=9, column=2, sticky=E)

        self.newCatButton = Button(frame2, command=self.newCata, text="开始计算", state=DISABLED)
        self.newCatButton.grid(row=9, column=6, sticky=E)

    def graphUI(self):
        self.frame0.destroy()
        self.initUIRoot()
        frame1 = Frame(self.frame0, relief=RAISED, borderwidth=1)
        frame1.pack(fill=BOTH, expand=False)

        frame2 = Frame(self.frame0, relief=RAISED, borderwidth=1)
        frame2.pack(fill=BOTH, expand=True)

        frame1.columnconfigure(1, weight=1)
        # frame1.columnconfigure(9, weight=1)
        frame1.columnconfigure(10, pad=7)
        frame1.rowconfigure(5, weight=1)
        frame1.rowconfigure(5, pad=7)

        frame2.columnconfigure(8, pad=7, weight=1)
        frame2.columnconfigure(1, weight=1)
        frame2.columnconfigure(6, weight=1)
        frame2.rowconfigure(8, pad=7)

        lbl = Label(frame1, text="催化剂性质")
        lbl.grid(row=0, column=0, columnspan=8, rowspan=1, sticky=W, pady=4, padx=5)
        # K_Mat_Tree = ttk.Treeview(frame1)
        # K_Mat_Tree['show'] = 'headings'
        # K_Mat_Tree = self.makeMatrixUI(7, K_Mat_Tree, sourceDate.K_model)
        # K_Mat_Tree.grid(row=1, column=0, columnspan=6, rowspan=5, sticky=E + W + S + N, pady=4, padx=5)
        K_Mat_Tree = Text(frame1, height=18)
        self.makeMatrixUI(K_Mat_Tree, self.catObj)
        K_Mat_Tree.configure(state='normal')
        K_Mat_Tree.grid(row=1, column=0, columnspan=6, rowspan=6, sticky=E + W + S + N, pady=4, padx=5)

        lbl = Label(frame1, text="优化方法:")
        lbl.grid(row=0, column=6, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5)
        txt = Entry(frame1)
        txt.insert(0, self.catObj.optMethod)
        txt.configure(state='readonly')
        txt.grid(row=0, column=8, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5)

        lbl = Label(frame1, text="集总数:")
        lbl.grid(row=1, column=6, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5)
        txt = Entry(frame1)
        txt.insert(0, self.catObj.n)
        txt.configure(state='readonly')
        txt.grid(row=1, column=8, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5)

        lbl = Label(frame1, text="精确度:")
        lbl.grid(row=2, column=6, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5)
        txt = Entry(frame1)
        txt.insert(0, self.catObj.tol)
        txt.configure(state='readonly')
        txt.grid(row=2, column=8, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5)

        cateDetailButton = Button(frame1, text="查看催化剂详情")
        cateDetailButton.grid(row=3, column=8)
        # ________________________________________
        lbl = Label(frame2, text="待预测条件")
        lbl.grid(row=0, column=0, columnspan=5, rowspan=1, pady=4, padx=5)

        lbl = Label(frame2, text="初始组成(<1 英文逗号分割):")
        lbl.grid(row=1, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.Y0_input = Entry(frame2)
        self.Y0_input.grid(row=1, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="温度(K)")
        lbl.grid(row=2, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.T_input = Entry(frame2)

        self.T_input.grid(row=2, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="压力(KPa)")
        lbl.grid(row=3, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.p_input = Entry(frame2)
        self.p_input.grid(row=3, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="剂油比")
        lbl.grid(row=4, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.roil_input = Entry(frame2)
        self.roil_input.grid(row=4, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="停留时间(s)")
        lbl.grid(row=5, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.t_input = Entry(frame2)
        self.t_input.grid(row=5, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="碱氮含量(<1)")
        lbl.grid(row=6, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.yn_input = Entry(frame2)
        self.yn_input.insert(0, 0.0)
        self.yn_input.grid(row=6, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="重芳烃含量(<1)")
        lbl.grid(row=7, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.ya_input = Entry(frame2)
        self.ya_input.grid(row=7, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="微分方程步长")
        lbl.grid(row=8, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)

        self.step_input = Entry(frame2)
        self.step_input.insert(0, 0.1)
        self.step_input.grid(row=8, column=2, columnspan=3, rowspan=1, sticky=E, pady=4, padx=5)

        lbl = Label(frame2, text="图表设置")
        lbl.grid(row=0, column=6, columnspan=5, rowspan=1, pady=4, padx=5)

        lbl = Label(frame2, text="条件变量")
        lbl.grid(row=1, column=6, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.var = ttk.Combobox(frame2, textvariable=StringVar())
        if not self.catObj.withTemp:
            self.var['values'] = (u'压力', u'剂油比', u'停留时间')
            self.p_input.insert(0, 0)
            self.T_input.insert(0, self.catObj.t)
            self.T_input.configure(state='readonly')
            self.p_input.configure(state='readonly')
            self.lastVar = u'压力'
        else:
            self.T_input.delete(0, 'end')
            self.T_input.insert(0, 0)
            self.T_input.configure(state='readonly')
            self.var['values'] = (u'温度', u'压力', u'剂油比', u'停留时间', u'温度+压力',u'温度+剂油比',u'剂油比+压力')
            self.lastVar = u'温度'
        self.var.bind('<<ComboboxSelected>>', self.onSelecetedVar)
        self.var.current(0)
        self.var.grid(row=1, column=8, columnspan=2, rowspan=1, sticky=W, pady=4, padx=5)

        self.rangeLbl = Label(frame2, text="条件范围")
        self.rangeLbl.grid(row=2, column=6, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        lbl = Label(frame2, text="上限")
        lbl.grid(row=3, column=6, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        lbl = Label(frame2, text="下限")
        lbl.grid(row=4, column=6, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.rangeMin = Entry(frame2)
        self.rangeMax = Entry(frame2)

        self.rangeMin.grid(row=3, column=8, columnspan=1, sticky=W, rowspan=1, pady=4, padx=5)
        self.rangeMax.grid(row=4, column=8, columnspan=1, sticky=W, rowspan=1, pady=4, padx=5)

        lbl = Label(frame2, text="结果集(英文逗号分割)")
        lbl.grid(row=5, column=6, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.chartResultId = Entry(frame2)
        self.chartResultId.insert(0, '1,2,3,4,5,6,7,8,9,10,11,12')
        self.chartResultId.grid(row=5, column=8, columnspan=3, rowspan=1, sticky=W, pady=4, padx=5)

        lbl = Label(frame2, text="结果名(英文逗号分割\n尽量使用英文)")
        lbl.grid(row=6, column=6, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.chartResultName = Entry(frame2)
        #TODO,get the default value from lump model
        self.chartResultName.insert(0, 'HS,HA,HR,DIESEL,GS,GO,GA,DGAS,LO3,LO4,LPGD,COKE')
        self.chartResultName.grid(row=6, column=8, columnspan=3, rowspan=1, sticky=W, pady=4, padx=5)

        lbl = Label(frame2, text="点数")
        lbl.grid(row=7, column=6, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5)
        self.stepNum = Entry(frame2)
        self.stepNum.grid(row=7, column=8, columnspan=3, rowspan=1, sticky=W, pady=4, padx=5)

        cateDetailButton = Button(frame2, text="预测趋势", command=self.doChart)
        cateDetailButton.grid(row=8, column=6, columnspan=2)

    def onSelecetedVar(self, event):
        varName = self.var.get()
        if self.lastVar == u'温度':
            # u'温度',,,u'停留时间'
            self.T_input.configure(state="normal")
        elif self.lastVar == u'压力':
            self.p_input.configure(state="normal")
        elif self.lastVar == u'剂油比':
            self.roil_input.configure(state="normal")
        elif self.lastVar == u'停留时间':
            self.t_input.configure(state="normal")
        elif self.lastVar == u'温度+压力':
            self.T_input.configure(state="normal")
            self.p_input.configure(state="normal")
        elif self.lastVar == u'温度+剂油比':
            self.roil_input.configure(state="normal")
            self.T_input.configure(state="normal")
        elif self.lastVar == u'剂油比+压力':
            self.roil_input.configure(state="normal")
            self.p_input.configure(state="normal")

        if varName == u'温度':
            self.rangeLbl.config(text='条件范围')

            self.T_input.delete(0, 'end')
            self.T_input.insert(0, 0)
            self.T_input.configure(state="readonly")
        elif varName == u'压力':
            self.rangeLbl.config(text='条件范围')

            self.p_input.delete(0, 'end')
            self.p_input.insert(0, 0)
            self.p_input.configure(state="readonly")
        elif varName == u'剂油比':
            self.rangeLbl.config(text='条件范围')

            self.roil_input.delete(0, 'end')
            self.roil_input.insert(0, 0)
            self.roil_input.configure(state="readonly")
        elif varName == u'停留时间':
            self.rangeLbl.config(text='条件范围')

            self.t_input.delete(0, 'end')
            self.t_input.insert(0, 0)
            self.t_input.configure(state="readonly")
        elif varName == u'温度+压力':
            self.rangeLbl.config(text='条件范围,格式:温度,压力')

            self.T_input.delete(0, 'end')
            self.T_input.insert(0, 0)
            self.T_input.configure(state="readonly")
            self.p_input.delete(0, 'end')
            self.p_input.insert(0, 0)
            self.p_input.configure(state="readonly")
        elif varName == u'温度+剂油比':
            self.rangeLbl.config(text='条件范围,格式:温度,剂油比')
            self.roil_input.delete(0, 'end')
            self.roil_input.insert(0, 0)
            self.roil_input.configure(state="readonly")
            self.T_input.delete(0, 'end')
            self.T_input.insert(0, 0)
            self.T_input.configure(state="readonly")

        elif varName == u'剂油比+压力':
            self.rangeLbl.config(text='条件范围,格式:剂油比,压力')
            self.roil_input.delete(0, 'end')
            self.roil_input.insert(0, 0)
            self.roil_input.configure(state="readonly")

            self.p_input.delete(0, 'end')
            self.p_input.insert(0, 0)
            self.p_input.configure(state="readonly")

        self.lastVar = varName

    def onNewCata(self):
        self.catFactors = {}
        ftypes = [('集总模型', '*.lp')]
        dlg = tkFileDialog.Open(self, filetypes=ftypes)
        fl = dlg.show()
        # print flmakePreResultUI
        if fl != '':
            self.lumpObj = self.readFile(fl)
            print self.lumpObj
            self.cateUI()

    def onNewPre(self):
        ftypes = [('催化剂存档文件', '*.cat')]
        dlg = tkFileDialog.Open(self, filetypes=ftypes)
        fl = dlg.show()
        print fl
        if fl != '':
            self.catObj = self.readFile(fl)
            self.preUI()
    def onNewBest(self):
        ftypes = [('催化剂存档文件', '*.cat')]
        dlg = tkFileDialog.Open(self, filetypes=ftypes)
        fl = dlg.show()
        print fl
        if fl != '':
            self.catObj = self.readFile(fl)
            self.bestUI()
    def onNewGraph(self):
        ftypes = [('催化剂存档文件', '*.cat')]
        dlg = tkFileDialog.Open(self, filetypes=ftypes)
        fl = dlg.show()
        print fl
        if fl != '':
            self.catObj = self.readFile(fl)
            self.graphUI()

    def saveCate(self):
        ftypes = [('催化剂存档文件', '*.cat')]
        filename = tkFileDialog.asksaveasfilename(title='保存催化剂存档文件', defaultextension='.cat', filetypes=ftypes)
        return filename

    def onHelp(self):
        mbox.showinfo("集总模型软件", "中国石油\n兰州化工研究中心")

    def doPre(self):
        catObj = self.catObj
        t_resid = float(self.t_input.get())
        p = float(self.p_input.get())
        Y0 = numpy.mat(self.Y0_input.get().split(',')).astype(numpy.float)
        const_r = 8.3145
        w_aro = float(self.ya_input.get())
        w_nitro = float(self.yn_input.get())
        t = float(self.T_input.get())
        r_oil = float(self.roil_input.get())
        stepLength = float(self.step_input.get())
        n = catObj.n
        print [t_resid, p, Y0, const_r, w_aro, w_nitro, t, r_oil, n]
        result = newPre(catObj, t_resid, p, Y0, const_r, w_aro, w_nitro, t, r_oil, n, stepLength).tolist()[0]
        self.makePreResultUI(self.preResult_LB, result)
    def doBest(self):
        catObj = self.catObj
        t_resid = [float(self.t_input.get().split(',')[0]),float(self.t_input.get().split(',')[1])]
        p = [float(self.p_input.get().split(',')[0]),float(self.p_input.get().split(',')[1])]
        Y0 = numpy.mat(self.Y0_input.get().split(',')).astype(numpy.float)
        const_r = 8.3145
        w_aro = float(self.ya_input.get())
        w_nitro = float(self.yn_input.get())
        t = [float(self.T_input.get().split(',')[0]),float(self.T_input.get().split(',')[1])]
        r_oil = [float(self.roil_input.get().split(',')[0]),float(self.roil_input.get().split(',')[1])]
        stepLength = float(self.step_input.get())
        n = catObj.n
        target = self.target.get().split(',')
        print [t_resid, p, Y0, const_r, w_aro, w_nitro, t, r_oil, n,target]
        result = newBest(catObj, t_resid, p, Y0, const_r, w_aro, w_nitro, t, r_oil, n, stepLength,target)
        self.bestP.configure(state='normal')
        self.bestT.configure(state='normal')
        self.bestR.configure(state='normal')
        self.bestTime.configure(state='normal')
        self.bestSum.configure(state='normal')
        self.bestP.insert('end',round(result['bestP'], 4))
        self.bestT.insert('end',round(result['bestT'], 4))
        self.bestR.insert('end',round(result['bestR'], 4))
        self.bestTime.insert('end',round(result['bestTime'], 4))
        self.bestSum.insert('end',round(result['sum'], 4))
        self.makePreResultUI(self.preResult_LB, result['Y'])
    def doChart(self):
        catObj = self.catObj
        t_resid = float(self.t_input.get())
        p = float(self.p_input.get())
        Y0 = numpy.mat(self.Y0_input.get().split(',')).astype(numpy.float)
        const_r = 8.3145
        w_aro = float(self.ya_input.get())
        w_nitro = float(self.yn_input.get())
        t = float(self.T_input.get())
        r_oil = float(self.roil_input.get())
        stepNum = int(self.stepNum.get())
        resultId = self.chartResultId.get()
        resultName = self.chartResultName.get()

        stepLength = float(self.step_input.get())
        n = catObj.n
        varName = ''
        if self.lastVar == u'温度':
            varName = 't'
            varMin = float(self.rangeMin.get())
            varMax = float(self.rangeMax.get())
        elif self.lastVar == u'压力':
            varName = 'p'
            varMin = float(self.rangeMin.get())
            varMax = float(self.rangeMax.get())
        elif self.lastVar == u'剂油比':
            varName = 'r'
            varMin = float(self.rangeMin.get())
            varMax = float(self.rangeMax.get())
        elif self.lastVar == u'停留时间':
            varName = 'time'
            varMin = float(self.rangeMin.get())
            varMax = float(self.rangeMax.get())
        elif self.lastVar == u'温度+压力':
            varName = 't,p'.split(',')
            varMin = self.rangeMin.get().split(',')
            varMax = self.rangeMax.get().split(',')
        elif self.lastVar == u'温度+剂油比':
            varName = 't,r'.split(',')
            varMin = self.rangeMin.get().split(',')
            varMax = self.rangeMax.get().split(',')
        elif self.lastVar == u'剂油比+压力':
            varName = 'r,p'.split(',')
            varMin = self.rangeMin.get().split(',')
            varMax = self.rangeMax.get().split(',')
        chartConfig = {}
        chartConfig['varName'] = varName
        chartConfig['stepNum'] = stepNum

        chartConfig['varMin'] = varMin
        chartConfig['varMax'] = varMax
        chartConfig['resultId'] = resultId
        chartConfig['resultName'] = resultName
        # t_resid=3
        # p=175
        # const_r=8.3145
        # Y0=mat([0.481,0.472,0.047,0,0,0,0])
        # w_aro=0.472
        # w_nitro=0
        # t=685
        # n=7
        # r_oil=8.79
        # chartConfig={'varName': 'time', 'varMax': 0.001, 'varMin': 15.0, 'resultId': '1,2,3,4,5,6,7', 'stepNum': 100,'resultName':u'Hs,Ha,Hr,柴油,汽油,气体,焦炭'}

        print chartConfig
        print [catObj, t_resid, p, Y0, const_r, w_aro, w_nitro, t, r_oil, n, chartConfig]
        if len(varName)>1:
            result = new3dChart(catObj, t_resid, p, Y0, const_r, w_aro, w_nitro, t, r_oil, n, chartConfig, stepLength)

        else:
            result = new2dChart(catObj, t_resid, p, Y0, const_r, w_aro, w_nitro, t, r_oil, n, chartConfig, stepLength)

    def addFactors(self):
        t_resid = float(self.t_input.get())
        p = float(self.p_input.get())
        Y0_raw = self.Y0_input.get()
        Y0 = numpy.mat(Y0_raw.split(',')).astype(numpy.float)
        Y_results_raw = self.Y_results_input.get()
        Y_results = numpy.mat(Y_results_raw.split(',')).astype(numpy.float)
        w_aro = float(self.ya_input.get())
        w_nitro = float(self.yn_input.get())
        t = float(self.T_input.get())
        r_oil = float(self.roil_input.get())
        self.Molmasses = numpy.mat(self.Molmasses_input.get().split(',')).astype(numpy.float)
        self.factor_Tree.insert('', END, values=[t_resid, t, r_oil, p, Y0_raw, Y_results_raw, w_aro, w_nitro])
        if self.catFactors.has_key(t):
            self.catFactors[t].append(
                {'t_resid': t_resid, 't': t, 'r_oil': r_oil, 'p': p, 'Y0': Y0, 'Y_results': Y_results, 'w_aro': w_aro,
                 'w_nitro': w_nitro})
        else:
            self.catFactors[t] = [
                {'t_resid': t_resid, 't': t, 'r_oil': r_oil, 'p': p, 'Y0': Y0, 'Y_results': Y_results, 'w_aro': w_aro,
                 'w_nitro': w_nitro}]
        print self.catFactors
        self.varCountT.set(len(self.catFactors))
        self.Molmasses_input.configure(state='readonly')
        self.newCatButton.configure(state='active')

    def newCata(self):
        filename = self.saveCate()
        print filename
        if len(self.catFactors) == 1:
            newCatNoKa(filename, self.lumpObj, 1, 0, 1, self.lumpObj, self.Molmasses, self.catFactors.values()[0],
                       'L-BFGS-B',
                       1e-5, self.lumpObj.shape[0])
        else:
            newCatWithKa(filename, self.lumpObj, 1, 0, 1, self.lumpObj, self.Molmasses, self.catFactors, 'L-BFGS-B',
                         1e-5,
                         self.lumpObj.shape[0])

    def makeMatrixUI(self, targetTree, catObj):
        n = catObj.n
        if not catObj.withTemp:
            targetTree.insert('end', '催化剂模型是在同一温度下,只能计算K\n------------------\nK=\n')
            K = numpy.around(self.makeMatrixByResult(catObj.K_model, catObj.X0_result, catObj.n)['K_result'], 4)
            self.makeMatrixOutput(n, targetTree, K)
            targetTree.insert('end', '\n------------------\n重芳烃影响因数:\n')
            targetTree.insert('end', self.makeMatrixByResult(catObj.K_model, catObj.X0_result, catObj.n)['Ka'])
            targetTree.insert('end', '\n------------------\n碱氮影响因数:\n')
            targetTree.insert('end', self.makeMatrixByResult(catObj.K_model, catObj.X0_result, catObj.n)['Kn'])
            targetTree.insert('end', '\n------------------\n')

        else:
            K = self.makeMatrixByResult(catObj.K_model, catObj.X0_result, catObj.n)['K_result']
            print catObj.X0_result
            Ka = numpy.around(self.makeMatrixByResult(catObj.K_model, catObj.Ka, catObj.n)['K_result'], 4)
            print catObj.Ka
            Ea = numpy.around(self.makeMatrixByResult(catObj.K_model, catObj.Ea, catObj.n)['K_result'], 4)
            print catObj.Ea
            targetTree.insert('end', '\n------------------\nK=\n')
            print len(K)
            for i in K:
                self.makeMatrixOutput(n, targetTree, numpy.round(i, 4))
                targetTree.insert('end', '\n------------------\n')
            targetTree.insert('end', '\n------------------\nKa=\n')
            self.makeMatrixOutput(n, targetTree, Ka)
            targetTree.insert('end', '\n------------------\n')
            targetTree.insert('end', '\n------------------\nEa=\n')
            self.makeMatrixOutput(n, targetTree, Ea)
            targetTree.insert('end', '\n------------------\n')

    def makeMatrixOutput(self, n, targetTree, mat):
        for i in range(n):
            targetTree.insert('end', ','.join(mat[i].astype(numpy.string_).tolist()))
            targetTree.insert('end', '\n')
        return targetTree

    def makeMatrixByResult(self, K_model, result, n):
        if type(result) != type([]):
            K = result[:-3].tolist()
            args = result[-3:]
            K_raw_result = []
            for i in K_model.T.flat:
                if i:
                    K_raw_result.append(K.pop(0))
                else:
                    K_raw_result.append(0)
            K_result = reshape(K_raw_result, (n, n)).T.T.T
            ka_result, kn_result, cata_result = args
            return {'K_result': K_result, 'ka_result': ka_result, 'kn_result': kn_result, 'cata_result': cata_result}
        else:
            K_results = []

            args = result[0][-3:]
            for i in result:
                K = i[:-3].tolist()
                K_raw_result = []
                for i in K_model.T.flat:
                    if i:
                        K_raw_result.append(K.pop(0))
                    else:
                        K_raw_result.append(0)
                K_result = reshape(K_raw_result, (n, n)).T.T.T
                K_results.append(K_result)
            ka_result, kn_result, cata_result = args
            return {'K_result': K_results, 'ka_result': ka_result, 'kn_result': kn_result,
                    'cata_result': cata_result}

    def makePreResultUI(self, target, result):
        target.delete(0, END)
        if type(result)!=type([]):
            result=result.tolist()[0]
        for i in result:
            target.insert(END, round(i, 3))
        return target

    def readFile(self, filename):
        f = open(filename, "r")
        obj = pickle.load(f)
        return obj
Esempio n. 51
0
class ImportDialog(Toplevel):
    """
    Dialog window which prompts user for a selection of objects to import as well as
    showing a customizable list for displaying the data

    :param: root: root Tk widget, often Tk()
    :param: master: the main window, for access of polygonList
    """

    # This dialog should be a singleton, so the caller will ensure no other
    # windows are open by checking this variable
    singleton = False

    def __init__(self, root, master):
        ImportDialog.singleton = True  # creation of a pseudo singleton

        logger.info('Instantiating ImportDialog')
        Toplevel.__init__(self, root)
        self.transient(root)

        self.protocol('WM_DELETE_WINDOW', self.free)
        self.session = db.get_session()  # import window holds a session
        self.__internal_list = list()  # internal list of db objs
        self.__stack = collections.deque(maxlen=15)  # stack for searching
        self.__search_string = ''  # search string
        self.__master = master  # CALIPSO class
        self.__root = root
        self.title('Import from existing database')  # window title
        self.tree = None  # tree viewing class
        self.e = None  # entry box for searching
        self.top_frame = None  # top Tkinter frame
        self.bottom_frame = None  # bottom Tkinter frame
        self.bottom_button_frame = None  # bottom BUTTON Tkinter frame
        self.separator = None  # separator line
        self.filter_file = IntVar()  # int_var for filtering by file
        self.advance_dialog = False
        self.extract_dialog = False
        self.column_titles = [
            'name', 'plot', 'time range', 'latitude range', 'altitude range',
            'attributes', 'notes', 'last edited', 'file'
        ]

        self.plot_type = StringVar()
        self.beg_time = None
        self.end_time = None
        self.beg_lat = None
        self.end_lat = None
        self.beg_alt = None
        self.end_alt = None
        self.file = None

        center(self, (constants.IMPORTWIDTH, constants.IMPORTHEIGH))

        self.container = Frame(self)  # create center frame,
        self.container.pack(side=TOP, fill=BOTH, expand=True)  # place

        self.create_top_frame(
        )  # create the top frame and pack buttons / etc. on it
        self.create_bottom_frame()  # create the bottom frame and pack

    def create_top_frame(self):
        """
        Initialize the upper frame of the window in charge of buttons, in order:
        creates a top_frame, sets a 'Search' label and binds an entry box beside
        it, which calls ``refine_search`` upon a user releasing a key after pressing.
        Then binds the *delete* button to ``data_from_db``
        """
        logger.info('Creating top frame')
        self.top_frame = Frame(self.container)
        self.top_frame.pack(side=TOP, fill=X, expand=False)

        label = Label(self.top_frame, text='Search ')
        self.e = Entry(self.top_frame)
        create_tool_tip(self.e, 'Search in Name, Attributes, Notes')
        self.e.bind('<KeyRelease>', self.refine_search)
        label.grid(row=0, column=0, padx=5, pady=10)
        self.e.grid(row=0, column=1, padx=5, pady=10)

        check_button = Checkbutton(self.top_frame,
                                   text='Filter for this file',
                                   variable=self.filter_file,
                                   command=self.filter_by_current_file)
        check_button.grid(row=0, column=2, padx=5, pady=10)

        advanced_filter = Button(self.top_frame,
                                 text='Advanced',
                                 command=self.advanced_prompt)
        advanced_filter.grid(row=0, column=3, padx=5, pady=10)

        reset = Button(self.top_frame, text='Reset', command=self.reset)
        reset.grid(row=0, column=4, padx=5, pady=10)

        spacer = Label(self.top_frame, width=30)
        spacer.grid(row=0, column=5)
        self.top_frame.columnconfigure(5, weight=1)

        delete_button = Button(self.top_frame,
                               text='Delete',
                               command=self.delete_from_db,
                               width=10)
        delete_button.grid(row=0, column=6, padx=15)

    def create_bottom_frame(self):
        """
        Create and display database in listbox, also add lower button frame for import
        button
        """
        logger.info('Creating bottom frame')
        self.bottom_frame = Frame(self.container)  # create bottom frame
        self.bottom_frame.pack(side=BOTTOM, fill=BOTH, expand=True)
        self.separator = Frame(
            self.bottom_frame, relief=RIDGE, height=2,
            bg='gray')  # tiny separator splitting the top and bottom frame
        self.separator.pack(side=TOP, fill=X, expand=False)
        self.bottom_button_frame = Frame(
            self.bottom_frame)  # bottom frame for import button
        self.bottom_button_frame.pack(side=BOTTOM, fill=X, expand=False)

        self.tree = TreeListBox(self.bottom_frame, self.column_titles)

        for obj in self.session.query(DatabasePolygon).all():
            self.__internal_list.append(
                obj)  # insert JSON obj representation into internal list

        self.__display_all()

        Label(self.bottom_button_frame, width=35).grid(row=0, column=0)

        Button(self.bottom_button_frame,
               text='Import',
               width=30,
               command=self.import_selection).grid(row=0,
                                                   column=1,
                                                   padx=10,
                                                   pady=10)

        Button(self.bottom_button_frame,
               text='Extract Column Contents',
               width=25,
               command=self.extract_columns_dialog).grid(row=0,
                                                         column=2,
                                                         padx=10,
                                                         pady=10)

    def filter_by_current_file(self):
        """
        Command function for the check button located beside the entry box in Import Dialog.
        Lists all shapes given by only the current file when checked. If unchecked displays
        all entries.
        """
        if self.filter_file.get():
            fn = self.__master.get_file().rpartition('/')[2]
            lst = self.get_current_file_shapes()
            logger.info('Displaying %d shapes contained in %s' %
                        (len(lst), fn))
            # Only return list of objects in the current view, otherwise we would
            # just append lst
            lst = [x for x in lst if x in self.tree.info]
            self.__stack.append(self.tree.info)
            self.tree.info = lst
            self.tree.update()
        else:
            self.tree.info = self.__stack.pop()
            self.tree.update()

    def get_current_file_shapes(self):
        """
        Return a list of all shapes contained in the current file, queries the
        database looking for all entries with the column *tag* that match the
        file returned by the rpartitioned ``Calipso.get_file()`` function

        :rtype: list
        """
        fn = self.__master.get_file().rpartition('/')[2]
        lst = list()
        for obj in self.session.query(DatabasePolygon).filter_by(hdf=fn):
            time_range = '%s - %s' % (obj.begin_time.strftime(DATEFORMAT),
                                      obj.end_time.strftime('%H:%M:%S'))
            altitude_range = '%.3f - %.3f' % (obj.begin_alt, obj.end_alt)
            lat_range = '%.3f - %.3f' % (obj.begin_lat, obj.end_lat)
            lst.append((obj.tag, obj.plot, time_range, lat_range,
                        altitude_range, obj.attributes[1:-1], obj.notes,
                        obj.time_.strftime(DATEFORMAT), obj.hdf))
        if not lst:
            logger.warning('Query returned None, no shapes found')
        return lst

    def refine_search(self, event):
        """
        Function to dynamically narrow the results of a search while the
        user types into the search bar. Checks if the character is
        alpha numeric , and if so queries the database for the combined
        string. A backend stack keeps track of past searches, when the
        user enters the backspace code a previous instance is popped
        and reloaded.
        :param event: search box events
        """
        # append to search string
        self.__search_string += event.char
        # if the entry box is NOT empty
        if self.e.get() != '':
            # but If a backspace is entered that means we want to pop the stack
            if event.keysym == 'BackSpace':
                # remove one letter from search string and pop stack
                #new code should go here
                self.__search_string = self.__search_string[:-1]
                if self.__stack:
                    self.tree.info = self.__stack.pop()
                    self.tree.update()
            # else if the character is alphanumeric
            elif event.char.isalnum():
                # temporary variable to create new list
                lst = list()
                # for all objects in the database
                for obj in self.session.query(DatabasePolygon).filter(
                        or_(  # query the database for if search_string is contained in
                            # self.__search_string.strip() to remove leading and ending spaces
                            DatabasePolygon.tag.contains(
                                self.__search_string.strip()),
                            DatabasePolygon.attributes.contains(
                                self.__search_string.strip()),
                            DatabasePolygon.notes.contains(
                                self.__search_string.strip()))):
                    time_range = '%s - %s' % (obj.begin_time.strftime(
                        DATEFORMAT), obj.end_time.strftime('%H:%M:%S'))
                    altitude_range = '%.3f - %.3f' % (obj.begin_alt,
                                                      obj.end_alt)
                    lat_range = '%.3f - %.3f' % (obj.begin_lat, obj.end_lat)
                    lst.append(  # append any objects that were returned by the query
                        (obj.tag, obj.plot, time_range, lat_range,
                         altitude_range, obj.attributes[1:-1], obj.notes,
                         obj.time_.strftime(DATEFORMAT), obj.hdf))
                # push new query onto the stack and set display to list
                if self.filter_file.get():
                    sub_list = set(self.get_current_file_shapes())
                    lst = [x for x in lst if x in sub_list]
                self.__stack.append(self.tree.info)
                self.tree.info = lst
                self.tree.update()
        else:
            if self.filter_file.get():
                sub_list = set(self.get_current_file_shapes())
                self.__search_string = ''
                self.tree.info = sub_list
                self.tree.update()
            else:
                self.__search_string = ''
                self.__display_all()
        logger.info('Displaying refined search')

    def import_selection(self):
        """
        Import selected objects from internal_list into program
        """
        items = self.tree.tree.selection()
        logger.info('Parsing selection')
        # For all selected items in window
        skip = False
        for tag in items:
            # Find those items in internal list and import them
            tag = self.tree.tree.item(tag, option='values')
            fname = tag[-1]
            cfname = self.__master.get_file().rpartition('/')[2]
            if fname[-25:-4] != cfname[-25:-4]:
                skip = not tkMessageBox.\
                    askyesno('Unmatched files',
                             '%s is from a different file than currently'
                             % tag[0] +
                             ' loaded, proceed anyways? \ncurrent:%s \nloaded:%s'
                             % (tag[-1], cfname))
            if not skip:
                logger.info('Encoding \'%s\' to JSON' % tag[0])
                names = [x.tag for x in self.__internal_list]
                logger.info('Forwarding JSON to be read')
                self.__master.get_shapemanager().read_plot(read_from_str=str(
                    self.__internal_list[names.index(tag[0])]))
            else:
                logger.info('skipping loading for %s' % tag[0])
        self.free()

    def delete_from_db(self):
        """
        Delete selected objects from database
        """
        items = self.tree.tree.selection()
        if tkMessageBox.askyesno('Delete?',
                                 'Really delete these items?',
                                 parent=self):
            for tag in items:
                tag = self.tree.tree.item(tag, option='values')
                idx = self.__internal_list[[
                    x.tag for x in self.__internal_list
                ].index(tag[0])].id
                logger.info(
                    'Notifying db of deletion for \'%s\' from selection' %
                    tag[0])
                db.delete_item(idx)
            self.__display_all()

    def advanced_prompt(self):
        logger.info('Opening advanced search window')
        if (not AdvancedSearchDialog.singleton):
            AdvancedSearchDialog(self, self.__root). \
                wm_iconbitmap(ICO)
        else:
            logger.warning('Found existing advanced search window, canceling')

    def extract_columns_dialog(self):
        if not self.extract_dialog:
            ExtractColumnsDialog(self, self.__root)
            self.extract_dialog = True
        else:
            pass

    def __display_all(self):
        """
        Helper function to simply display all objects in the database
        """
        logger.info('Refreshing dialog view')
        lst = list()
        # Push previous display to stack
        if self.tree.info:
            self.__stack.append(self.tree.info)
        for obj in self.session.query(DatabasePolygon).all():
            time_range = '%s - %s' % (obj.begin_time.strftime(DATEFORMAT),
                                      obj.end_time.strftime('%H:%M:%S'))
            altitude_range = '%.3f - %.3f' % (obj.begin_alt, obj.end_alt)
            lat_range = '%.3f - %.3f' % (obj.begin_lat, obj.end_lat)
            lst.append(  # user see's this list
                (obj.tag, obj.plot, time_range, lat_range,
                 altitude_range, obj.attributes[1:-1], obj.notes,
                 obj.time_.strftime(DATEFORMAT), obj.hdf))

        self.tree.info = lst
        self.tree.update()

    def reset(self):
        """
        Reset the view of the tree within the import window, clears the stack as well
        """
        logger.info('Resetting tree view & stack')
        self.__display_all()
        self.__stack.clear()

    def receive_advanced_search(self, observer):
        """
        Receiving method called internally by an observer. When AdvancedSearchDialog is
        opened an observer is attached to this class, and upon the new ranges being updated
        this method is procd. The new ranges to query by are given by the dict received, so
        we can display the advanced search items. Below is a list of all items within the
        dictionary, with the format Key -> Format -> Type -> Desc

        date  -> '0000-00-00' -> y-m-d  -> The outer date of the time range
        btime -> '00-00-00'   -> hr-m-s -> Beginning time range (*btime* -> *etime*)
        etime -> '00-00-00'   -> hr-m-s -> Ending time range
        blat  -> '0.0'        -> float  -> Beginning latitude range (*blat* -> *elat*)
        elat  -> '0.0'        -> float  -> Ending latitude range
        balt  -> '0.0'        -> float  -> Beginning altitude range (*balt* -> *ealt*)
        ealt  -> '0.0'        -> float  -> Ending altitude range
        plot  -> PLOTS        -> string -> Type of plot ('backscattered' etc..)
        ampm  -> 'am'/'pm'    -> string -> Whether the time range is AM or PM
        file  -> '.....hdf'   -> string -> File name

        :param observer: An ``advancedsearchdialog.Query`` object
        """
        if 'free' in observer.ranges:
            self.advance_dialog = False
            return

        rng = observer.ranges

        # TODO: Fix this implementation

        query_result = self.session.query(DatabasePolygon)

        if rng['plot']:
            query_result = query_result.filter(
                DatabasePolygon.plot.is_(rng['plot']))

        if rng['file']:
            query_result = query_result.filter(
                DatabasePolygon.hdf.is_(rng['file']))

        if rng['blat']:
            query_result = query_result.filter(
                DatabasePolygon.begin_lat >= rng['blat'])

        if rng['elat']:
            query_result = query_result.filter(
                DatabasePolygon.end_lat <= rng['elat'])

        if rng['balt']:
            query_result = query_result.filter(
                DatabasePolygon.begin_alt >= rng['balt'])

        if rng['ealt']:
            query_result = query_result.filter(
                DatabasePolygon.end_alt <= rng['ealt'])

        lazy_list = list()

        for obj in query_result:
            time_range = '%s - %s' % (obj.begin_time.strftime(DATEFORMAT),
                                      obj.end_time.strftime('%H:%M:%S'))
            altitude_range = '%.3f - %.3f' % (obj.begin_alt, obj.end_alt)
            lat_range = '%.3f - %.3f' % (obj.begin_lat, obj.end_lat)
            # If we're parsing a date, we can't just filter as we must transform
            # coordinates into time_range first, so we need to manually check and
            # skip which is PROBABLY not the best solution.
            if rng['date'] and rng['date'] not in time_range:
                continue

            if rng['btime'] and obj.begin_time.time() < datetime.strptime(
                    rng['btime'], '%H:%M:%S').time():
                continue

            if rng['etime'] and obj.end_time.time() > datetime.strptime(
                    rng['etime'], '%H:%M:%S').time():
                continue

            lazy_list.append((obj.tag, obj.plot, time_range, lat_range,
                              altitude_range, obj.attributes[1:-1], obj.notes,
                              obj.time_.strftime(DATEFORMAT), obj.hdf))

        self.tree.info = lazy_list
        self.tree.update()

    def receive_extract_columns(self, observer):
        """
        Receiving method called internally by an observer bound to an ``ExtractColumnsDialog``
        instance. Upon the creation of a ``ExtractColumnDialog`` instance an observer is attached
        to the `ImportDialog`. Once the user finalizes the extraction details this function will
        be called with a dictionary of value .

        :param observer: An ``extractcolumnsdialog.ExtractionList`` object
        """
        if 'free' in observer.data:
            self.extract_dialog = False
            return

        columns_to_extract = [
            x for x in observer.data
            if observer.data[x] == 1 and x in self.column_titles
        ]
        filetype = observer.data['filetype']
        dataset = [[
            self.tree.tree.set(child, x)
            for child in self.tree.tree.get_children('')
        ] for x in columns_to_extract]

        if len(columns_to_extract) == 0:
            logger.error('No columns selected for extraction')
            tkMessageBox.showerror('Extract Columns',
                                   'No columns selected for extraction')
            return

        if filetype == TXT:
            f = tkFileDialog.\
                asksaveasfilename(defaultextension='.txt',
                                  filetypes=[('text files', '*.txt'), ('All files', '*')])
            if f == '':
                logger.info('canceling export column data as txt')
                return
            with open(f, 'w+') as outfile:
                outfile.write(' '.join(columns_to_extract) + '\n')
                for i in range(0, len(dataset[0])):
                    for j in range(0, len(dataset)):
                        outfile.write(str(dataset[j][i]) + ' ')
                    outfile.write('\n')
        if filetype == CSV:
            f = tkFileDialog.\
                asksaveasfilename(defaultextension='.csv',
                                  filetypes=[('csv files', '*.csv'), ('All files', '*')])
            if f == '':
                logger.info('canceling export column data as csv')
                return
            logger.info('Writing to .csv')
            dataset.insert(0, columns_to_extract)
            with open(f, 'w+') as outfile:
                for i in range(len(dataset[0])):
                    if i == len(dataset[0]) - 1:
                        outfile.write(str(dataset[0][i]))
                    else:
                        outfile.write(str(dataset[0][i]) + ',')
                outfile.write('\n')
                for i in range(len(dataset[1])):
                    for j in range(1, len(dataset)):
                        if j == len(dataset) - 1:
                            outfile.write(str(dataset[j][i]))
                        else:
                            outfile.write(str(dataset[j][i]) + ',')
                    outfile.write('\n')

    def free(self):
        """
        Commit the session, destroy the window and ensure the session is
        closed correctly
        """
        # Singleton no longer exists, so set it to false
        ImportDialog.singleton = False
        logger.info('Closing ImportDialog')
        self.session.commit()
        self.session.close()
        self.destroy()
Esempio n. 52
0
class FilePickEdit(Frame):
    def __init__(self,
                 master,
                 file_mask,
                 default_file,
                 edit_height=None,
                 user_onChange=None,
                 rename_on_edit=0,
                 font=None,
                 coloring=True,
                 allowNone=False,
                 highlighter=None,
                 directory='.'):
        '''
            file_mask: file mask (e.g. "*.foo") or list of file masks (e.g. ["*.foo", "*.abl"])
        '''
        self.master = master
        self.directory = directory
        self.user_onChange = user_onChange
        Frame.__init__(self, master)
        row = 0
        self.unmodified = True
        self.allowNone = allowNone
        self.file_extension = ""
        if type(file_mask) != list:
            file_mask = [file_mask]
        if "." in file_mask[0]:
            self.file_extension = file_mask[0][file_mask[0].rfind('.'):]
        # read filenames
        self.file_mask = file_mask
        self.updateList()
        # filename frame
        self.list_frame = Frame(self)
        self.list_frame.grid(row=row, column=0, sticky="WE")
        self.list_frame.columnconfigure(0, weight=1)
        # create list
        self.picked_name = StringVar(self)
        self.makelist()
        # refresh button
        self.refresh_button = Button(self.list_frame,
                                     text='<- refresh',
                                     command=self.refresh,
                                     height=1)
        self.refresh_button.grid(row=0, column=1, sticky='E')
        # save button
        self.save_button = Button(self.list_frame,
                                  text="save",
                                  command=self.save,
                                  height=1)
        self.save_button.grid(row=0, column=2, sticky="E")
        # editor
        row += 1
        if coloring:
            self.editor = SyntaxHighlightingText(self,
                                                 self.onEdit,
                                                 highlighter=highlighter)
        else:
            self.editor = ScrolledText2(self, self.onEdit)
        if font != None:
            self.editor.configure(font=font)
        if edit_height is not None:
            self.editor.configure(height=edit_height)
        self.editor.grid(row=row, column=0, sticky="NEWS")
        self.rowconfigure(row, weight=1)
        self.columnconfigure(0, weight=1)
        # option to change filename on edit
        row += 1
        self.options_frame = Frame(self)
        self.options_frame.grid(row=row, column=0, sticky=W)
        self.rename_on_edit = IntVar()
        self.cb = Checkbutton(self.options_frame,
                              text="rename on edit",
                              variable=self.rename_on_edit)
        self.cb.pack(side=LEFT)
        self.cb.configure(command=self.onChangeRename)
        self.rename_on_edit.set(rename_on_edit)
        # filename frame
        row += 1
        self.filename_frame = Frame(self)
        self.filename_frame.grid(row=row, column=0, sticky="WE")
        self.filename_frame.columnconfigure(0, weight=1)
        # save as filename
        self.save_name = StringVar(self)
        self.save_edit = Entry(self.filename_frame,
                               textvariable=self.save_name)
        self.save_edit.grid(row=0, column=0, sticky="WE")
        self.save_name.trace("w", self.onSaveChange)
        # pick default if applicableButton
        self.select(default_file)
        self.row = row

    def setDirectory(self, directory, keep=False):
        self.directory = directory
        self.updateList()
        self.makelist()
        #         menu = self.list["menu"] scrolledlist
        #         menu = self.list.listbox#["scrolledlist"]
        #         menu.delete(0, 'end')
        # add the new ones
        #         for filename in self.files:
        #             menu.add_command(label=filename, command=_setit(self.picked_name, filename, None))
        # if keep is true, only the files list will be updated but the content of the
        # text area will not be altered/removed
        if not keep: self.select("")

    def refresh(self):
        sel = self.get()
        self.updateList()
        self.select(sel, notify=False)

    def reloadFile(self):
        self.editor.delete("1.0", END)
        filename = self.picked_name.get()
        if os.path.exists(os.path.join(self.directory, filename)):
            new_text = file(os.path.join(self.directory, filename)).read()
            if new_text.strip() == "":
                new_text = "// %s is empty\n" % filename
            new_text = new_text.replace("\r", "")
        else:
            new_text = ""
        self.editor.insert(INSERT, new_text)

    def setText(self, txt):
        '''
        Replaces the text in the edit field as by typing
        into it.
        '''
        self.select("")
        if txt.strip() == "":
            txt = "// empty database\n"
        self.editor.insert(INSERT, txt)
        self.onEdit()

    def onSelChange(self, name, index=0, mode=0):
        self.reloadFile()
        filename = self.picked_name.get()
        self.save_name.set(filename)
        self.save_edit.configure(state=DISABLED)
        self.unmodified = True
        if self.user_onChange != None:
            self.user_onChange(filename)

    def onSaveChange(self, name, index, mode):
        pass

    #         if self.user_onChange != None:
    #             self.user_onChange(self.save_name.get())

    def autoRename(self):
        # modify "save as" name
        filename = self.picked_name.get()
        if filename == "":
            filename = "new" + self.file_extension  # if no file selected, create new filename
        ext = ""
        extpos = filename.rfind(".")
        if extpos != -1: ext = filename[extpos:]
        base = filename[:extpos]
        hpos = base.rfind("-")
        num = 0
        if hpos != -1:
            try:
                num = int(base[hpos + 1:])
                base = base[:hpos]
            except:
                pass
        while True:
            num += 1
            filename = "%s-%d%s" % (base, num, ext)
            if not os.path.exists(filename):
                break
        self.save_name.set(filename)
        # user callback
        if self.user_onChange != None:
            self.user_onChange(filename)

    def onEdit(self):
        if self.unmodified == True:
            self.unmodified = False
            # do auto rename if it's enabled or there is no file selected (editing new file)
            if self.rename_on_edit.get() == 1 or self.picked_name.get() == "":
                self.autoRename()
            # enable editing of save as name
            self.save_edit.configure(state=NORMAL)

    def onChangeRename(self):
        # called when clicking on "rename on edit" checkbox
        if self.rename_on_edit.get() == 1:
            if (not self.unmodified
                ) and self.save_name.get() == self.picked_name.get():
                self.autoRename()
        else:
            self.save_name.set(self.picked_name.get())

    def updateList(self):
        self.files = []
        if self.allowNone:
            self.files.append("")
        if os.path.exists(self.directory):
            for filename in os.listdir(self.directory):
                for fm in self.file_mask:
                    if fnmatch(filename, fm):
                        self.files.append(filename)
        self.files.sort()
        if len(self.files) == 0 and not self.allowNone:
            self.files.append("(no %s files found)" % str(self.file_mask))

    def select(self, filename, notify=True):
        ''' selects the item given by filename '''
        if filename in self.files:
            if not havePMW:
                self.picked_name.set(filename)
            else:
                self.list.selectitem(self.files.index(filename))
                if notify: self.onSelChange(filename)
        else:
            self.editor.delete("1.0", END)

    def makelist(self):
        if havePMW:
            self.list = Pmw.ComboBox(
                self.list_frame,
                selectioncommand=self.onSelChange,
                scrolledlist_items=self.files,
            )
            self.list.grid(row=0, column=0, padx=0, pady=0, sticky="NEWS")
            self.list.component('entryfield').component('entry').configure(
                state='readonly', relief='raised')
            self.picked_name = self.list
        else:
            self.list = apply(OptionMenu, (self.list_frame, self.picked_name) +
                              tuple(self.files))
            self.list.grid(row=0, column=0, sticky="NEW")
            self.picked_name.trace("w", self.onSelChange)

    def save(self):
        self.get()

    def set(self, selected_item):
        self.select(selected_item)

    def get(self):
        ''' gets the name of the currently selected file, saving it first if necessary '''
        filename = self.save_name.get()
        if self.unmodified == False:
            self.unmodified = True
            # save the file
            f = file(os.path.join(self.directory, filename), "w")
            f.write(self.editor.get("1.0", END).encode('utf-8'))
            f.close()
            # add it to the list of files
            #             if not filename in self.files:
            #                 self.files.append(filename)
            #                 self.files.sort()
            #                 self.list.destroy()
            #                 self.makelist()
            # set it as the new pick
            #if havePMW:
            #    self.picked_name.selectitem(self.files.index(filename), 1)
            #else:
            #    self.picked_name.set(filename)
            #             self.select(filename)
            self.refresh()
            self.select(filename, notify=False)
            self.save_edit.configure(state=DISABLED)
        return filename

    def get_text(self):
        return self.editor.get("1.0", END)

    def get_filename(self):
        return self.save_name.get()

    def set_enabled(self, state):
        self.editor.configure(state=state)
        if havePMW:
            self.list.component('entryfield_entry').configure(state=state)
            #             self.list.component('arrowbutton').configure(state=state)
            self.list.component('arrowbutton').bind(
                '<1>', (lambda a: 'break')
                if state == DISABLED else self.list._postList)
        else:
            self.list.configure(state=state)
        self.save_button.configure(state=state)
        self.cb.configure(state=state)
        self.save_edit.configure(state=state)