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')
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
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()
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
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
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)
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
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()
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
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
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)
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"
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
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"
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)
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()
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)
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)
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
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)
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)
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
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)
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
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
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)
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 )
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
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)
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)
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)
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)
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))
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)
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))
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
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
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()
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())
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
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()
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))
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()
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
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
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
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
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()
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)