예제 #1
0
    def init_chipseq_gui(self):
        self.clear()

        logo = Label(self, image=self.logoimage)
        logo.grid(row=0, column=0)

        note = Notebook(self)
        main = Frame(note)
        motif_scan = Frame(note)
        topkmer = Frame(note)
        kmer_query = Frame(note)

        note.add(main, text="Chip-Seq Main")
        note.add(motif_scan, text="Motif Scan")
        note.add(topkmer, text='Top kmer')
        note.add(kmer_query, text='Kmer query')

        self.init_chipseq_gui_tabmain(main)
        self.init_motifscan_guitab(motif_scan)
        self.init_topkmer_guitab(topkmer)
        self.init_kmerquery_guitab(kmer_query)

        note.grid(row=1, column=0)

        self.master.grid_columnconfigure(0, weight=1)
        self.master.grid_rowconfigure(0, weight=1)
        self.master.grid_rowconfigure(1, weight=5)
예제 #2
0
 def init_window(self):
     self.parent.title("SupMold: SpringCalc")
     self.grid(column=0, row=0, sticky="nwse")
     mainFrame = Frame(self, relief='raised', borderwidth=1)
     mainFrame.grid(column=0, row=0, sticky='nsew')
     closeButton = Button(mainFrame, text='Cerrar', command=self.appQuit)
     closeButton.grid(column=0, row=3, padx=5, pady=5)
     nb = Notebook(mainFrame)
     tab1 = Frame(nb)
     tab2 = Frame(nb)
     tab3 = Frame(nb)
     nb.add(tab1, text="Compresión")
     nb.add(tab2, text="Extensión")
     nb.add(tab3, text="Torsión")
     nb.grid(column=0, row=1, sticky='nsew', padx=5, pady=5)
     msg = consoleFrame(mainFrame, 'Mensages')
     dataB = resource_path('wires.db')
     if not os.path.isfile(dataB):
         self.centerWindow()
         messagebox.showerror(
             "ERROR", "Base de datos {} inaccesible. "
             "Favor verificar permisos de lectura o "
             "ubicación de la misma".format(dataB))
         return
     self.sub1 = subWindow(tab1, Spring(database=dataB))
     self.sub1.init_widgets()
     self.sub2 = subWindow2(tab2, eSpring(database=dataB))
     self.sub2.init_widgets()
     self.sub3 = subWindow3(tab3, tSpring(database=dataB))
     self.sub3.init_widgets()
     self.centerWindow()
     nb.bind("<<NotebookTabChanged>>", self.tabChangedEvent)
예제 #3
0
    def setupSelectedModuleConfig(self, selectedModuleFileName):

        groupDesctiptionNotebook = Notebook(self)
        groupDesctiptionNotebook.grid(row=3, column=0, columnspan=4, sticky=E + W)

        groupNameList = jsonHelper.getAllGroups()

        groupDescriptionFrameList = []

        for groupName in groupNameList:
            groupDescriptionFrame = GroupDescriptionCheckboxFrame(groupDesctiptionNotebook, groupName)

            modulesForGroupList = jsonHelper.getModuleListForGroup(groupName)
            isEnabled = selectedModuleFileName in modulesForGroupList
            groupDescriptionFrame.enableCheckButtonInt.set(isEnabled)

            groupDescriptionFrameList.append(groupDescriptionFrame)
            groupDescriptionFrame.pack(fill=BOTH, expand=True)
            groupDesctiptionNotebook.add(groupDescriptionFrame, text=groupName)

        Button(
            self,
            text="Apply & Close",
            relief=RAISED,
            command=lambda: self.applyModuleButtonPressed(selectedModuleFileName, groupDescriptionFrameList),
        ).grid(row=4, column=1, columnspan=1, sticky=S + E)
예제 #4
0
    def machineLoadButtonPressed(self, loadButton):
        filePath = filedialog.askopenfilename(filetypes=[('Python file','*.py')])
        
        if filePath != '':
            components = filePath.split('/')
            fileName = components[-1]

            if os.path.isfile(os.getcwd()+'/machineConfig/'+fileName) == False:
                # [isValid, errorString] = MachineConfigTest(filePath).runTests() //TODO
                isValid = 1

                if isValid:
                    loadButton.config(text=filePath)

                    groupDesctiptionNotebook = Notebook(self)
                    groupDesctiptionNotebook.grid(row=2, column=0, columnspan=4, sticky=E+W)
                    

                    tabNameList = jsonHelper.getAllGroups()
                    groupDescriptionFrameList = [];

                    for tabName in tabNameList:
                        groupDescriptionFrame = GroupDescriptionCheckboxFrame(groupDesctiptionNotebook, tabName)
                        groupDescriptionFrameList.append(groupDescriptionFrame)
                        groupDescriptionFrame.pack(fill=BOTH, expand=True)
                        groupDesctiptionNotebook.add(groupDescriptionFrame, text=tabName)
                      

                    Button(self, text='Apply & Close', relief=RAISED, command=lambda: self.applyMachineButtonPressed(filePath, groupDescriptionFrameList)).grid(row=3,column=1,columnspan=1,sticky=S+E)
                
                else:
                    messagebox.showinfo("Error", errorString)

            else:
                messagebox.showinfo("Error", "File already exists in machineConfig directory: " + fileName)
예제 #5
0
    def __init__(self,fen):
        tkinter.Frame.__init__(self,bg = "#%02x%02x%02x" % (71,86,82))
        self.grid()
        
        #Header
        self.title = tkinter.Label(self, text="Le-Mayzeur", fg="white", font=("bauhaus 93",22), bg = "#%02x%02x%02x" % (71,86,82))
        self.title.grid(row=0, column = 0)
        
        #Body
        onglet=Notebook(self, width=380, height=380)

        self.convert=tkinter.ttk.Panedwindow(orient=tkinter.VERTICAL)
        self.iso=tkinter.ttk.Panedwindow(orient=tkinter.VERTICAL)
        self.shutdown=tkinter.ttk.Panedwindow(orient=tkinter.VERTICAL)
        self.bootable=tkinter.ttk.Panedwindow(orient=tkinter.VERTICAL)

        onglet.add(self.iso,text='ISO file')
        onglet.add(self.convert,text='Convert')
        onglet.add(self.shutdown, text="Shutdown")
        onglet.add(self.bootable,text='Boot drive')
        onglet.grid(row=2, column=0)

        #Links --. inherit classes
        Convert.__init__(self)
        Shutd.__init__(self,fen)
        IsoFile.__init__(self,fen)
        Bootable.__init__(self)
        
        #footer
        self.footer = tkinter.Label(fen, width=480, bg="#%02x%02x%02x" % (71,86,82))
        self.footer.place(x=0,y=447)
        self.footer = tkinter.Label(fen, text="*****@*****.**", fg="white", bg="#%02x%02x%02x" % (71,86,82))
        self.footer.place(x=130,y=447)
예제 #6
0
def main():
    """Main function of the program."""
    main = tk.Tk()

    # Add Title
    main.title("Space Craft Creator")

    # Disable Resizing
    main.resizable(False, False)

    data = Data()

    spacecraft = Spacecraft(data)

    notebook = Notebook(main)

    spacecraft_tab = spacecraft.make_tab(notebook)

    notebook.add(spacecraft_tab, text="Spacecraft")
    for key, subsystem in spacecraft.subsections.items():
        notebook.add(subsystem.make_tab(notebook), text=key)
    notebook.add(spacecraft.sizes.make_tab(notebook), text="Sizes")
    notebook.add(spacecraft.velocities.make_tab(notebook),
                 text="Velocity Profiles")

    notebook.grid(column=0, row=0)
    notebook.enable_traversal()

    button = Button(main, text="Caclulate", command=spacecraft.calculate)
    button.grid(column=0, row=1)

    main.mainloop()
예제 #7
0
    def __initialize_gui__(self):
        notebook = Notebook(self.window)
        notebook.grid(row=0, column=0, rowspan=14, columnspan=4, sticky=EW)
        gmail_frame, nalanda_frame = Frame(notebook), Frame(notebook)
        notebook.add(gmail_frame, text='Gmail')
        notebook.add(nalanda_frame, text='Nalanda')
        # GMAIL
        Label(gmail_frame, text='Username:'******'W')
        Label(gmail_frame, text='Password:'******'W')
        Entry(gmail_frame, textvariable=self.username_variable, bd=5, relief=SUNKEN, width=30)\
            .grid(row=0, columnspan=3, column=1)
        Entry(gmail_frame, textvariable=self.password_variable, show='*', bd=5, relief=SUNKEN, width=30)\
            .grid(row=1, columnspan=3, column=1)
        self.submit_gmail_button = Button(gmail_frame, text='Submit', bd=5, relief=RAISED, width=10)
        self.submit_gmail_button.grid(row=10, sticky=E, columnspan=4)

        self.captcha_image = Label(gmail_frame, bd=5, relief=RAISED)
        self.captcha_entry = Entry(gmail_frame, textvariable=self.captcha_variable, bd=5, relief=SUNKEN)
        self.captcha_button = Button(gmail_frame, text='[R]', bd=2, relief=RAISED)

        # NALANDA
        Label(nalanda_frame, text='Username:'******'W')
        Label(nalanda_frame, text='Password:'******'W')
        Entry(nalanda_frame, textvariable=self.username_variable, bd=5, relief=SUNKEN, width=30) \
            .grid(row=0, columnspan=3, column=1)
        Entry(nalanda_frame, textvariable=self.password_variable, show='*', bd=5, relief=SUNKEN, width=30) \
            .grid(row=1, columnspan=3, column=1)
        self.submit_nalanda_button = Button(nalanda_frame, text='Submit', bd=5, relief=RAISED, width=10)
        self.submit_nalanda_button.grid(row=10, sticky=E, columnspan=4)

        # Attach the status bar
        self.busy_status.grid(row=15, column=3, sticky=EW)
        self.status_bar.grid(row=15, column=0, columnspan=3, sticky=EW)
        self.update_status('Enter Nalanda Login Details.')
        self.window.title('Authentication Window')
예제 #8
0
    def notebook_init(self):
        self.style.element_create('close', 'image', 'img_close',
                                  ('active', 'pressed', '!disabled', 'img_close_pressed'),
                                  ('active', '!disabled', 'img_close_mouse_over'))

        self.style.layout('NotebookBtn', [('Notebook.client', {'sticky': 'nsew'})])

        self.style.layout('NotebookBtn.Tab', [
            ('Notebook.tab', {'sticky': 'nsew', 'children': [
                ('Notebook.padding', {'side': 'top', 'sticky': 'nsew', 'children': [
                    ('Notebook.focus', {'side': 'top', 'sticky': 'nsew', 'children': [
                        ('Notebook.label', {'side': 'left', 'sticky': 'nsew'}),
                        ('Notebook.close', {'side': 'right', 'sticky': 'nsew'})
                    ]})
                ]})
            ]})
        ])

        self.style.configure('NotebookBtn.Tab', padding=2, image='tab_doc')
        self.style.map('NotebookBtn.Tab', background=[('selected', '#f0f0f0')])

        self.root.bind_class('TNotebook', '<ButtonPress-1>', self.tab_btn_press, True)
        self.root.bind_class('TNotebook', '<ButtonRelease-1>', self.tab_btn_release)

        tabs = Notebook(self.root, style='NotebookBtn')
        tabs.grid(column=0, row=1, sticky='nsew')
        tabs.columnconfigure(0, weight=1)
        tabs.rowconfigure(0, weight=1)

        return tabs
예제 #9
0
    def setupSelectedFilterType(self, selectedFilterFileName, filterType):

        groupDesctiptionNotebook = Notebook(self)
        groupDesctiptionNotebook.grid(row=3, column=0, columnspan=4, sticky=E + W)

        groupNameList = jsonHelper.getAllGroups()

        groupDescriptionFrameList = []

        for groupName in groupNameList:
            groupDescriptionFrame = GroupDescriptionCheckboxFrame(groupDesctiptionNotebook, groupName)
            # get selected filters for groupname
            selectedFilterList = []

            if filterType == "Head":
                selectedFilterList = jsonHelper.getHeadFiltersListForGroup(groupName)
            else:
                selectedFilterList = jsonHelper.getJawFiltersListForGroup(groupName)

            isEnabled = selectedFilterFileName in selectedFilterList
            groupDescriptionFrame.enableCheckButtonInt.set(isEnabled)
            groupDescriptionFrameList.append(groupDescriptionFrame)
            groupDescriptionFrame.pack(fill=BOTH, expand=True)
            groupDesctiptionNotebook.add(groupDescriptionFrame, text=groupName)

        Button(
            self,
            text="Apply & Close",
            relief=RAISED,
            command=lambda: self.applyFilterTypeButtonPressed(
                selectedFilterFileName, groupDescriptionFrameList, filterType
            ),
        ).grid(row=4, column=1, columnspan=1, sticky=S + E)
예제 #10
0
    def __initView(self):
        self.grid_columnconfigure(0, weight=1)
        self.grid_rowconfigure(0, weight=1)

        tabControl = Notebook(self)
        tabControl.grid(row=0, column=0, sticky='NSWE')

        #################################################################################################

        self.playsByWeekdayFrame = Frame(tabControl)
        self.playsByWeekdayFrame.grid_columnconfigure(0, weight=1)
        self.playsByWeekdayFrame.grid_rowconfigure(0, weight=1)
        tabControl.add(self.playsByWeekdayFrame, text=PLAYS_BY_WEEKDAY)

        #################################################################################################

        self.playsByHourFrame = Frame(tabControl)
        self.playsByHourFrame.grid_columnconfigure(0, weight=1)
        self.playsByHourFrame.grid_rowconfigure(0, weight=1)
        tabControl.add(self.playsByHourFrame, text=PLAYS_BY_HOUR)

        #################################################################################################

        self.topMusicUsageInAlbumFrame = Frame(tabControl)
        self.topMusicUsageInAlbumFrame.grid_columnconfigure(0, weight=1)
        self.topMusicUsageInAlbumFrame.grid_rowconfigure(0, weight=1)
        tabControl.add(self.topMusicUsageInAlbumFrame, text=TOP_MUSIC_USAGE_IN_ALBUMS)
예제 #11
0
    def init_selexseq_gui(self):
        self.clear()

        row_gen = NumGenerator()

        logo = Label(self, image=self.logoimage)
        logo.grid_columnconfigure(0, weight=1)
        logo.grid(row=row_gen.get())

        note = Notebook(self)
        main = Frame(note)
        motif_scan = Frame(note)
        topkmer = Frame(note)
        kmer_query = Frame(note)

        note.add(main, text="SELEX-SEQ Main")
        note.add(motif_scan, text="Motif Scan")
        note.add(topkmer, text='Top kmer')
        note.add(kmer_query, text='Kmer query')

        self.init_selexseq_gui_tabmain_step0(main)
        self.init_motifscan_guitab(motif_scan)
        self.init_topkmer_guitab(topkmer)
        self.init_kmerquery_guitab(kmer_query)

        note.grid(row=row_gen.get(), column=0)
        # self.columnconfigure(0,weight=1)

        self.master.grid_columnconfigure(0, weight=1)
        self.master.grid_rowconfigure(0, weight=1)
        self.master.grid_rowconfigure(1, weight=5)
예제 #12
0
 def _add_notebook_to_frame_grid(
         cls,
         frame_and_name: FrameAndName,
         row: int,
         column: int,
         sticky: GridPositionEnum = GridPositionEnum.NONE) -> Notebook:
     cls._debug(f'Add Notebook Grid Row [{row}] Column [{column}]')
     notebook = Notebook(frame_and_name.frame)
     notebook.grid(row=row, column=column, sticky=sticky.value)
     return notebook
예제 #13
0
class SQLiteReader(Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.master.option_add('*tearOff', False)
        self.master.title('SQLite Reader')
        self.master.geometry('800x400+10+10')
        self.grid(column=0, row=0, sticky=(N, W, E, S))
        self.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(0, weight=1)
        self.create_menu()
        self.create_widget()
        self.tabs = []

    def create_widget(self):
        self.tab_parent = Notebook(self)
        self.tab_parent.grid(column=0, row=0, sticky=(N, W, S, E))

    def create_menu(self):
        self._menu = Menu(self.master)
        self.master.config(menu=self._menu)

        self.file_menu = Menu(self._menu)
        self.file_menu.add_command(label='Open', command=self.open_database)
        self.file_menu.add_command(label='Query', command=self.run_query, state='disabled')

        self._menu.add_cascade(label='File', menu=self.file_menu)
        self._menu.add_command(label='Reload', command=self.reload_current_table, state='disabled')
        self._menu.add_command(label='Exit', command=self.master.destroy)

    def open_database(self, new_folder=True):
        for item in self.tab_parent.winfo_children():
            item.destroy()
        if new_folder:
            self.file_name = filedialog.askopenfilename()

        self.db = SQLiteConnector(self.file_name)
        for idx, table in enumerate(self.db.tables):
            new_tab = SQLTableFrame(self.tab_parent, table, self.db)
            self.tab_parent.add(new_tab, text=table)

        self.tab_query = SQLTableFrameQuery(self.tab_parent)
        self.tab_parent.add(self.tab_query, text='queries')

        self._menu.entryconfig('Reload', state='normal')
        self.file_menu.entryconfig('Query', state='normal')

    def reload_current_table(self):
        if hasattr(self, 'query_window'):
            self.query_window.destroy()
        self.open_database(new_folder=False)

    def run_query(self):
        self.tab_parent.select(self.tab_query)
        self.query_window = SQLQueryWindow(self.master, db=self.db, query_tab=self.tab_query)
예제 #14
0
class MainWindow:
    def __init__(self):
        self.adb = adb.bridge
        config.global_config = load_config()
        twocaptcha.key = config.global_config.twocaptchaKey
        haoi.userstr = config.global_config.haoiUser
        haoi.rebate = config.global_config.haoiRebate

        self.window = Tk()
        self.size = config.global_config.screenSize

        self.window.title('Rise Of Kingdom Bot (v{})'.format(version))
        self.window.geometry('{}x{}'.format(self.size[0], self.size[1]))
        self.window.resizable(0, 0)

        self.curr_frame = None
        self.last_frame = None
        self.setting_frame = None

        self.notebook = Notebook(self.window, height=self.size[1] - 80)

        # device = self.adb.get_device('127.0.0.1', 5585)
        # mf = SelectedDeviceFrame(self.notebook, device, width=size[0], height=size[1])
        # self.curr_frame = mf
        # self.main_frame_list.append(mf)
        # mf.grid(row=0, column=0, sticky=N + W)
        # mf.grid_propagate(False)

        main_frame = Frame(self.notebook,
                           width=self.size[0],
                           height=self.size[1])

        dlf = DeviceListFrame(self.notebook,
                              main_frame,
                              width=self.size[0],
                              height=self.size[1])

        sf = SettingFrame(self.notebook,
                          width=self.size[0],
                          height=self.size[1])
        self.setting_frame = sf
        sf.grid(row=0, column=0, sticky=N + W)
        sf.grid_propagate(False)

        self.notebook.add(dlf, text='Device List')
        self.notebook.add(main_frame, text='Display Device')
        self.notebook.add(sf, text='Setting')
        self.notebook.grid(row=0, column=0, sticky=N + W, pady=(10, 0))

        bf = BottomFrame(self.window, width=self.size[0], height=self.size[1])
        bf.grid(row=1, column=0, sticky=N + W, padx=10, pady=(10, 0))

    def run(self):
        self.window.mainloop()
예제 #15
0
    def filterTypeLoadButtonPressed(self, filePath,filterType):
        groupDesctiptionNotebook = Notebook(self)
        groupDesctiptionNotebook.grid(row=2, column=0, columnspan=4, sticky=E+W)

        tabNameList = jsonHelper.getAllGroups()
        groupDescriptionFrameList = [];

        for tabName in tabNameList:
            groupDescriptionFrame = GroupDescriptionCheckboxFrame(groupDesctiptionNotebook, tabName)
            groupDescriptionFrameList.append(groupDescriptionFrame)
            groupDescriptionFrame.pack(fill=BOTH, expand=True)
            groupDesctiptionNotebook.add(groupDescriptionFrame, text=tabName)
          
        Button(self, text='Apply & Close',relief=RAISED,command=lambda:self.applyFilterTypeButtonPressed(filePath, groupDescriptionFrameList, filterType)).grid(row=3,column=1,columnspan=1,sticky=S+E)
예제 #16
0
class baseInterface(Tk):
    def __init__(self):
        Tk.__init__(self)

        self._controller = ArduinoController()
        self._controller.nbLeds = 21
        self._controller.clear()

        self._notebook = Notebook(self)
        self._notebook.grid(sticky=(E, W))

        self.__modules = {}

        self.__defaultSpeed = 60
        self._updateSpeed = self.__defaultSpeed

        self.protocol("WM_DELETE_WINDOW", self._handleClose)
        self.__update()

    def setSpeed(self, speed):
        if 5 <= speed <= 500:
            self._updateSpeed = speed
        else:
            self._updateSpeed = self.__defaultSpeed

    def getSpeed(self):
        return self._updateSpeed

    def resetSpeed(self):
        self._updateSpeed = self.__defaultSpeed

    def registerModule(self, name, obj):
        self.__modules[name] = obj(self)
        self.__modules[name].linkController(self._controller)
        self._notebook.add(self.__modules[name].mainFrame, text=name)

    def _handleClose(self):
        self._controller.clear()
        self._controller.send()
        self._controller.destroy()
        self.destroy()

    def _getCurrentTabName(self):
        return self._notebook.tab(self._notebook.select(), "text")

    def __update(self):
        if len(self.__modules) > 0:
            self.__modules[self._getCurrentTabName()].update()
        self.after(self._updateSpeed, self.__update)
예제 #17
0
파일: popups.py 프로젝트: crayix/coinz.py
class EditSettingsPopup(object):
    def __init__(self, overview, master):
        self.top = Toplevel(master)
        self.top.title("Settings")
        self.master = master
        self.overview = overview

        self.nb = Notebook(self.top, width=500, height=330)

        self.nb_t1 = Frame(self.top)
        self.nb_t2 = Frame(self.top)

        ex = [x.name for x in Exchange]

        #general tab
        self.t1_exchange = Combobox(self.nb_t1, values=ex, width=20)
        #replace with old val
        self.t1_exchange.set(ex[0])
        Label(self.nb_t1, text="Default exchange:").grid(row=0,
                                                         column=0,
                                                         sticky="NEWS")
        self.t1_exchange.grid(row=0, column=2, columnspan=1)
        Label(self.nb_t1, text="Update interval(sec):").grid(row=1,
                                                             column=0,
                                                             sticky="NEWS")
        self.t1_interval_var = StringVar()
        self.t1_interval = Spinbox(self.nb_t1,
                                   textvariable=self.t1_interval_var,
                                   values=(3, 5, 10, 15, 30, 60, 120, 300),
                                   width=20)
        ##replace with old val---set after making spinbox
        self.t1_interval_var.set("15")
        self.t1_interval.grid(row=1, column=2, columnspan=1)

        self.nb.add(self.nb_t1, text="General")
        self.nb.add(self.nb_t2, text="Sounds")

        self.nb.grid(row=0, column=0, columnspan=3, rowspan=3, sticky="NEWS")

        ##center after packing
        center(self.top, master)

    def cleanup(self):
        self.top.destroy()
예제 #18
0
    def init_selexseq_gui(self):
        self.clear()

        self.logoimage = PhotoImage(file="GUIgraphics/logo.png")
        self.logo = Label(self, image=self.logoimage)
        self.logo.place(relx=0.5, rely=0.1, anchor="n")

        note = Notebook()
        self.notebook  = note
        main = Frame(note)
        masker = Frame(note)
        note.add(main, text = "SELEX-SEQ Main")
        note.add(masker, text = "Masker")

        self.init_selexseq_gui_tabmain_step0(main)

        note.grid_rowconfigure(0, weight=1)
        note.grid_columnconfigure(0, weight=1)
        note.grid(row=0,column=0, sticky=N, pady=(250, 10))
예제 #19
0
class Controller(Tk):
    """
    Controller Class:
    - Serves as a hub for every page contained in the UI, allows for the flow of information between
        pages
    - Acts as the container for ContactsPage, and AddContactsPage by making use of ttk.Notebook

    === Public Attributes ===
    notebook: Widget containing tabs; each page is assigned a tab, and can be navigated to easily
    frames: Dictionary of all pages; allows for access of information across pages
            e.g. If I wanted to call a method from a separate class:
                self.controller.frames[<name of page>].<method I want to call>()

    === Methods ===
    None
    """

    def __init__(self, *args, **kwargs):
        Tk.__init__(self, *args, **kwargs)
        self.resizable(False, False)
        self.geometry("300x400")
        self.title("Contact Manager")
        self.iconbitmap("project/src/Phone.ico")
        for i in range(5):
            self.rowconfigure(i, weight=1)
            self.columnconfigure(i, weight=1)

        self.frames = {}

        self.notebook = Notebook(self)
        self.notebook.grid(row=0, column=0, columnspan=5, rowspan=5, sticky=N + S + E + W)

        for page in [ContactsPage, AddContactPage]:
            frame = page(self.notebook, self)
            self.notebook.add(frame, text=frame.page_name)
            self.frames[frame.page_name] = frame

    def hide(self):
        self.withdraw()

    def show(self):
        self.deiconify()
예제 #20
0
    def initUI(self):
        self.master.title("Client Modbus TCP")
        self.pack(fill=BOTH, expand=True)

        self.columnconfigure(1, weight=1)
        self.columnconfigure(3, pad=7)
        self.rowconfigure(3, weight=1)
        self.rowconfigure(5, pad=7)

        lbl = Label(self, text="Informatii")
        lbl.grid(sticky=W, pady=4, padx=5)
        n = Notebook(self)
        f3 = Frame(n)
        f4 = Frame(n)
        f5 = Frame(n)
        f6 = Frame(n)
        f7 = Frame(n)
        f8 = Frame(n)
        n.add(f3, text='Input Registers')
        n.add(f4, text='Hold Registers')
        n.add(f5, text='Internet connection')
        n.add(f6, text='Start connection')
        n.add(f7, text='Memory')
        n.add(f8, text='CPU')
        n.grid(row=1, column=0, columnspan=2, rowspan=4, padx=5, sticky=E + W + S + N)

        client = Client()
        #client.pornire_conexiune()

        button3 = Button(f3, text="Input Register", command=lambda: print("Input register este ", client.read_input_registers(0x00, 0x01, 0x00, 0x02)))
        button4 = Button(f4, text="Hold Register", command=lambda: print("Holding register este ", client.read_holding_registers(0x00, 0x01, 0x00, 0x03)))
        button5 = Button(f5, text="Internet", command=lambda: client.is_internet())
        button6 = Button(f6, text="Pornire Conexiune", command=lambda: client.pornire_conexiune())
        button7 = Button(f7, text="Memorie", command=lambda: print(client.memorie_procent()))
        button8 = Button(f8, text="CPU", command=lambda: print(client.cpu_procent()))
        # Asezarea butoanelor in fiecare frame
        button3.grid(row=4, column=3, padx=5)
        button4.grid(row=4, column=3, padx=5)
        button5.grid(row=4, column=3, padx=5)
        button6.grid(row=4, column=3, padx=5)
        button7.grid(row=4, column=3, padx=5)
        button8.grid(row=4, column=3, padx=5)
예제 #21
0
    def __init__(self, fen):
        tkinter.Frame.__init__(self, bg="#%02x%02x%02x" % (71, 86, 82))
        self.grid()

        #Header
        self.title = tkinter.Label(self,
                                   text="Le-Mayzeur",
                                   fg="white",
                                   font=("bauhaus 93", 22),
                                   bg="#%02x%02x%02x" % (71, 86, 82))
        self.title.grid(row=0, column=0)

        #Body
        onglet = Notebook(self, width=380, height=380)

        self.convert = tkinter.ttk.Panedwindow(orient=tkinter.VERTICAL)
        self.iso = tkinter.ttk.Panedwindow(orient=tkinter.VERTICAL)
        self.shutdown = tkinter.ttk.Panedwindow(orient=tkinter.VERTICAL)
        self.bootable = tkinter.ttk.Panedwindow(orient=tkinter.VERTICAL)

        onglet.add(self.iso, text='ISO file')
        onglet.add(self.convert, text='Convert')
        onglet.add(self.shutdown, text="Shutdown")
        onglet.add(self.bootable, text='Boot drive')
        onglet.grid(row=2, column=0)

        #Links --. inherit classes
        Convert.__init__(self)
        Shutd.__init__(self, fen)
        IsoFile.__init__(self, fen)
        Bootable.__init__(self)

        #footer
        self.footer = tkinter.Label(fen,
                                    width=480,
                                    bg="#%02x%02x%02x" % (71, 86, 82))
        self.footer.place(x=0, y=447)
        self.footer = tkinter.Label(fen,
                                    text="*****@*****.**",
                                    fg="white",
                                    bg="#%02x%02x%02x" % (71, 86, 82))
        self.footer.place(x=130, y=447)
예제 #22
0
class BetsApp:

    def __init__(self):
        self.win = Tk()
        self.win.title("Bets App")
        self.win.resizable(0, 0)

        # shared matches instance
        self.matches = MatchesObservable()

        # create tabs container
        self.tabs = Notebook(self.win)
        self.tabs.grid(column=0, row=0, padx=PAD_X, pady=PAD_Y, sticky=EW)

        # create tabs
        self.matches_tab = MatchesTabFrame(self.win, self.tabs, self.matches)
        self.scenarios_tab = ScenariosTabFrame(self.win, self.tabs, self.matches)
        self.stats_tab = StatsTabFrame(self.win, self.tabs)
        # create menus
        self.menu_bar = MenuBar(self.win, self.matches)
예제 #23
0
    def __init__(self, master):
        #initiate master title
        self.master = master
        self.master.title(config.options["project title"])
        self.records_per_page = config.options["records_per_page"]
        self.fieldnames = []
        for fieldname in Record._meta.sorted_field_names:
            if not fieldname == "id":
                self.fieldnames.append(fieldname)

        self.tab1 = Frame(Notebook)
        self.tab2 = Frame(Notebook)
        Notebook.add(self.tab1, text="list view")
        Notebook.add(self.tab2, text="data entry")
        Notebook.grid(row=0, column=0)

        self.create_db_tables()
        self.draw_list_page()
        self.populate_list_items()
        self.draw_footer()
        self.draw_data_entry_form()
예제 #24
0
def main():
    """main"""
    root = theme().addColor()
    root.title('Notebook Test Program')

    ###########################################################################
    ### guiBlox: Create Widgets
    ###########################################################################
    note = Notebook(root)
    tab1 = Frame(note)
    tab2 = Frame(note)
    tab3 = Frame(note)

    note.add(tab1, text="Tab1")
    note.add(tab2, text="Tab2")
    note.add(tab3, text="Tab3")

    ###########################################################################
    ### guiBlox: Place Widgets
    ###########################################################################
    note.grid(row=0, column=0, sticky="nsew")
    root.mainloop()
예제 #25
0
class GeneratorWindow:
    def __init__(self, parent, model):
        self.model = model
        self.parent = parent
        self.window = Toplevel(parent.window)
        self.window.title('Generator')
        self.window.geometry('600x400')
        self.window.transient(master=parent.window)
        self.tabs = Notebook(self.window)
        self.ioctl_frame = Frame(self.tabs)
        self.write_frame = Frame(self.tabs)
        self.mmap_frame = Frame(self.tabs)
        self.tabs.add(self.ioctl_frame, text='ioctl')
        self.tabs.add(self.write_frame, text='write')
        self.tabs.add(self.mmap_frame, text='mmap')
        self.window.rowconfigure(0, weight=1)
        self.window.columnconfigure(0, weight=1)
        self.tabs.grid(sticky=tk.NW + tk.S + tk.E)
        self.window.grab_set()

    def destroy(self):
        self.window.grab_release()
        self.window.destroy()
예제 #26
0
    def create_widgets(self):
        '''
        Crea todos los componentes de la ventana principal
        '''
        #### TABS ####
        tabController = Notebook(self.root)
        tabController.grid(column=0, row=0)

        self.frameInicio = Frame(tabController, padding=(10, 10))
        tabController.add(self.frameInicio, text="Inicio")

        self.frameCursantes = Frame(tabController, padding=(10, 10))
        tabController.add(self.frameCursantes, text="Alumnos")

        self.frameDocentes = Frame(tabController, padding=(10, 10))
        tabController.add(self.frameDocentes, text="Docentes")

        self.frameCursos = Frame(tabController, padding=(10, 10))
        tabController.add(self.frameCursos, text="Cursos")

        lbl_curso = Label(self.frameInicio,
                          text="Seleccione el curso:",
                          width=35)
        lbl_curso.grid(row=0, column=0, columnspan=35, padx=(400, 0))

        self.id_curso = StringVar()
        self.cb_curso = Combobox(self.frameInicio,
                                 textvariable=self.id_curso,
                                 width=20,
                                 state="readonly")
        self.cb_curso.grid(row=1, column=0, columnspan=20, padx=(400, 0))
        self.cb_curso.bind("<<ComboboxSelected>>", self.selection_changed)

        self.create_tab_alumnos()
        self.create_tab_cursos()
        self.create_tab_docentes()
        self.update_tablas()
예제 #27
0
class GraphicalApp(tk.Frame):
    """Interface graphique du jeu."""
    def __init__(self, dispatcher):
        self.dispatcher = dispatcher
        self.master = None
        self.treeview = None
        self.chats = {
        }  # contient des listes [id, treeview, entry, bouton, messageCpt]
        self.progress = None
        self.previousAngles = {}
        self.initializeGraphicalApp()

        self.dispatcher.setGraphicalApp(self)
        self.mainloop()

    def initializeGraphicalApp(self):
        """Initialise l'interface graphique."""
        self.master = tk.Tk()
        self.master.title("To the conquest of the dragon balls !")
        super().__init__(self.master)
        self.master.resizable(False, False)

        self.createWidgets()
        self.setUpBindingEvent()
        self.master.protocol("WM_DELETE_WINDOW", self.closeWindow)
        msg = "Welcome space travelers !\n\n"
        msg += "A brand new race has been created. "
        msg += "You may ask yourself : \"Why should i participate ?\" "
        msg += "Well because the reward is worth it, it's nothing more than the seven dragon balls !\n"
        msg += "Suddenly fell more excited right ?!\n"
        msg += "But watch out, you are not the only one interested...\n\n"
        msg += "In order to move your vehicle, use your keyboard's directional arrows.\n"
        msg += "You can also drop a bomb with the \"B\" button.\n\n"
        msg += "Good luck !"
        messagebox.showinfo(title="Welcome !", message=msg)

    def createWidgets(self):
        """Crée tous les widgets de l'interface."""
        tk.Label(self.master, text="Your pseudo",
                 font="-weight bold").grid(row=0, column=0, sticky=tk.W)
        self.pseudoEntry = tk.Entry(self.master)
        self.pseudoEntry.grid(row=0, column=1, sticky=tk.EW)

        self.pseudoEntry.focus_set()

        tk.Label(self.master, text="Status : ",
                 font="-weight bold").grid(row=1, column=0, sticky=tk.W)
        self.statusLabel = tk.Label(self.master, text="Not yet connected...")
        self.statusLabel.grid(row=1, column=1, sticky=tk.W)
        self.progress = Progressbar(self.master,
                                    orient=tk.HORIZONTAL,
                                    mode='indeterminate')
        self.progress.grid(row=1, column=2)

        self.exitButton = tk.Button(self.master)
        self.exitButton["text"] = "Exit"
        self.exitButton["state"] = tk.DISABLED
        self.exitButton["bg"] = "#FF0A2D"
        self.exitButton["activebackground"] = "#FF415C"
        self.exitButton["fg"] = "#FFFFFF"
        self.exitButton["activeforeground"] = "#FFFFFF"
        self.exitButton["relief"] = tk.FLAT
        self.exitButton["bd"] = 0
        self.exitButton["command"] = lambda: self.dispatcher.onExitClicked()
        self.exitButton.grid(row=2, column=1, sticky=tk.EW)

        self.connectionButton = tk.Button(self.master)
        self.connectionButton["text"] = "Connect to the server"
        self.connectionButton["bg"] = "#1296EC"
        self.connectionButton["activebackground"] = "#33A5EF"
        self.connectionButton["fg"] = "#FFFFFF"
        self.connectionButton["activeforeground"] = "#FFFFFF"
        self.connectionButton["relief"] = tk.FLAT
        self.connectionButton["bd"] = 0
        self.connectionButton["command"] = lambda: self.onConnectionClicked(
            self.connectionButton)
        self.connectionButton.grid(row=2, column=0, sticky=tk.EW)

        self.createScoreTable()
        self.createSpaceEnvironment()

        self.notebook = Notebook(self.master)
        self.notebook.grid(row=5,
                           column=3,
                           columnspan=2,
                           rowspan=3,
                           sticky=tk.NSEW)
        self.createChat("Public", enable=False)

    def setUpBindingEvent(self):
        """Met en place tous les événement permettant eu joueur de contrôler son pod."""
        # Les code de mise à jour du joueur doivent être exécutés dans un autre thread.
        # Dans le cas contraire, il y a un interblocage entre le thread de
        # l'interface graphique (celui-ci), et celui qui met à jour périodiquement les position des joueurs.
        self.master.bind('<Left>', self.dispatcher.antiClockEvent)
        self.master.bind('<Right>', self.dispatcher.clockEvent)
        self.master.bind('<Up>', self.dispatcher.thrustEvent)
        self.master.bind('b', self.dispatcher.putBomb)

    def createSpaceEnvironment(self):
        """Crée un décor spatial."""
        self.canvasLock = Lock()
        self.canvas = tk.Canvas(self.master,
                                width=dat.ARENA_L * 2,
                                height=dat.ARENA_H * 2,
                                bg="black")
        self.canvas.grid(row=5,
                         column=0,
                         columnspan=3,
                         rowspan=5,
                         pady=(10, 0))

        # Ajoute 200 étoiles
        for __ in range(0, 200):
            self.drawRandomStar()

    def drawRandomStar(self):
        """Dessine une étoile à une position aléatoire."""
        maxX = int(self.canvas["width"])
        maxY = int(self.canvas["height"])

        x = random.randint(0, maxX)
        y = random.randint(0, maxY)
        self.canvas.create_oval(x, y, x + 5, y + 5, fill="white")

    def createScoreTable(self):
        """Crée le tableau des scores."""
        tk.Label(self.master, text="Scores",
                 font="-weight bold").grid(row=3, column=0, columnspan=2)
        tv = Treeview(self.master, height=3)
        tv['columns'] = ('Score', "Bomb")
        tv.heading("#0", text='User', anchor=tk.W)
        tv.heading('Bomb', text='Bombs available', anchor=tk.W)
        tv.column('Bomb', anchor=tk.W, width=100)
        tv.heading('Score', text='Score', anchor=tk.W)
        tv.column('Score', anchor=tk.W, width=100)
        tv.grid(row=4, column=0, columnspan=3, sticky=tk.EW)
        self.treeview = tv

    def increaseBombOf(self, player):
        """Incrémente le nombre de bombe que possède un joueur dans le tableau d'affichage.
        
        Arguments:
            player - Le pseudo du joueur pour lequel on doit incrémenter son nombre de bombe.
        """
        for i in self.treeview.get_children():
            item = self.treeview.item(i)
            # Nous sommes bien sur l'item du joueur qui nous interesse
            if item["text"] == player:
                oldValue = item['values']
                oldValue[1] += 1
                self.treeview.item(i, values=oldValue)
                break

    def decreaseBombOf(self, player):
        """Décrémente le nombre de bombe que possède un joueur dans le tableau d'affichage.
        
        Arguments:
            player - Le pseudo du joueur pour lequel on doit décrémenter son nombre de bombe.
        """
        for i in self.treeview.get_children():
            item = self.treeview.item(i)
            # Nous sommes bien sur l'item du joueur qui nous interesse
            if item["text"] == player:
                oldValue = item['values']
                oldValue[1] -= 1
                self.treeview.item(i, values=oldValue)
                break

    def setBombOf(self, player, nbBomb):
        """Met à jour le nombre de bombe que possède un joueur dans le tableau d'affichage.
        
        Arguments:
            player - Le pseudo du joueur pour lequel on doit mettre à jour son nombre de bombe.
            nbBomb - Le nouveau nombre de bombe du joueur.
        """
        for i in self.treeview.get_children():
            item = self.treeview.item(i)
            # Nous sommes bien sur l'item du joueur qui nous interesse
            if item["text"] == player:
                oldValue = item['values']
                oldValue[1] = nbBomb
                self.treeview.item(i, values=oldValue)
                break

    def createChat(self, nom, enable=True):
        """Créer un nouveau chat pour un joueur donné.
        
        Arguments:
            nom - Le nom du joueur avec lequel l'utilisateur pourra parler avec ce chat
        
        Keyword Arguments:
            enable -- Est-ce que le chat doit être activer par défaut. (default: {True})
        """
        frame = tk.Frame(self.notebook)
        self.notebook.add(frame, text=nom)
        chat = Treeview(frame, height=15)
        chat['columns'] = ('Date')
        chat.heading("#0", text='Messages', anchor=tk.W)
        chat.heading('Date', text='Date', anchor=tk.W)
        chat.column('Date', anchor=tk.W, width=150)
        chat.grid(row=0, column=0, columnspan=2, rowspan=3, sticky=tk.NSEW)
        chat.tag_configure('even', background='#DAE5F4')
        chat.tag_configure('odd', background='#B8D1F3')
        chat.tag_configure('from_me', font=("Helvetica", 10, "bold"))
        chat.tag_configure('not_from_me', font=("Helvetica", 10))
        messageEntry = tk.Entry(frame)
        messageEntry.grid(row=4, column=0, sticky=tk.S)

        messageButton = tk.Button(frame)
        messageButton["text"] = "Envoyer"
        if not enable:
            messageButton["state"] = tk.DISABLED
        messageButton["bg"] = "#1296EC"
        messageButton["activebackground"] = "#33A5EF"
        messageButton["fg"] = "#FFFFFF"
        messageButton["activeforeground"] = "#FFFFFF"
        messageButton["relief"] = tk.FLAT
        messageButton["bd"] = 0
        messageButton["command"] = lambda: self.sendMessage(nom, messageEntry)
        messageButton.grid(row=4, column=1, sticky=tk.S)

        self.chats[nom] = [frame, chat, messageEntry, messageButton, 0]

    def deleteChat(self, name):
        """Supprime un chat permmetant de communiquer avec un joueur donnée.
        
        Arguments:
            name -- Le nom du joueur pour lequel on doit supprimer le chat.
        """
        self.notebook.forget(self.chats[name][0])

    def sendMessage(self, target, entry):
        """Signale au dispatcher la volonté de l'utilisateur d'envoyer un message.
        
        Arguments:
            target -- La cible à laquelle le joueur souhaite envoyer le message.
            entry -- L'entry source sur laquelle l'utilisateur a saisi son message.
        """
        message = entry.get()
        if message == "":
            messagebox.showerror(title="Empty message",
                                 message="You cannot send an empty message")
        else:
            self.dispatcher.sendMessage(target, message)
            entry.delete(0, tk.END)

    def addMessage(self, chatName, message, fromMe=False):
        """Ajout un message à un chat.
        
        Arguments:
            chatName -- Le nom du chat.
            message -- Le message.
        
        Keyword Arguments:
            fromMe -- Indique si le message vient de l'utilisateur de l'application cliente. (default: {False})
        """
        currentDate = strftime("%d/%m/%Y-%H:%M:%S", gmtime())
        fromMeTag = 'from_me' if fromMe else 'not_from_me'
        odd_even_tag = 'even' if (self.chats[chatName][4] % 2) == 0 else 'odd'

        self.chats[chatName][1].insert('',
                                       'end',
                                       text=message,
                                       values=currentDate,
                                       tags=(odd_even_tag, fromMeTag))
        self.chats[chatName][4] += 1

    def addScoreToTable(self, user, score):
        """ Ajoute un nouveau score au tableau des scores.
            Si le joueur est déjà présent, met à jour sa ligne.
        
        Arguments:
            user  -- Un pseudo.
            score -- Un score.
        """
        edited = False
        for i in self.treeview.get_children():
            item = self.treeview.item(i)
            # Nous sommes bien sur l'item du joueur qui nous interesse
            if item["text"] == user:
                oldValue = item['values']
                oldValue[0] = score
                self.treeview.item(i, values=oldValue)
                edited = True
                break

        if not edited:
            self.treeview.insert('',
                                 'end',
                                 text=str(user),
                                 values=(str(score), "0"))

    def createGraphicalPlayer(self, playerX, playerY):
        """Crée un joueur à une position spécifique.
        
        Arguments:
            playerX -- La coordonnée X du joueur.
            playerY -- La coordonnée Y du joueur.
        
        Returns:
            tuple -- Un tuple contenant le tag du joueur dans le canvas et ses images.
        """
        convertedPos = self.convertPosition(playerX, playerY)
        playerImage = Image.open('images/pod_sprite_50.png')
        podPicture = ImageTk.PhotoImage(playerImage)

        self.canvasLock.acquire()
        tagPlayer = self.canvas.create_image(convertedPos[0],
                                             convertedPos[1],
                                             image=podPicture)
        self.canvasLock.release()

        return (tagPlayer, playerImage, podPicture)

    def createGraphicalOpponent(self, playerX, playerY):
        """Crée un adversaire à une position spécifique.
        
        Arguments:
            playerX -- La coordonnée X de l'adversaire.
            playerY -- La coordonnée Y de l'adversaire.
        
        Returns:
            tuple -- Un tuple contenant le tag de l'adversaire dans le canvas et ses images.
        """
        convertedPos = self.convertPosition(playerX, playerY)
        opponentImage = Image.open('images/pod2_sprite_50.png')
        podPicture = ImageTk.PhotoImage(opponentImage)

        self.canvasLock.acquire()
        tagOpponent = self.canvas.create_image(convertedPos[0],
                                               convertedPos[1],
                                               image=podPicture)
        self.canvasLock.release()

        return (tagOpponent, opponentImage, podPicture)

    def createGraphicalObstacle(self, obstacleX, obstacleY):
        """Crée un obstacle à une position spécifique.
        
        Arguments:
            obstacleX -- La coordonnée X de l'obstacle.
            obstacleY -- La coordonnée Y de l'obstacle.
        
        Returns:
            tuple -- Un tuple contenant le tag de l'obstacle dans le canvas et sa photoImage.
        """
        convertedPos = self.convertPosition(obstacleX, obstacleY)
        obstacleImage = Image.open('images/obstacles/asteroid_sprite_55.png')
        obstaclePicture = ImageTk.PhotoImage(obstacleImage)

        self.canvasLock.acquire()
        tagOstacle = self.canvas.create_image(convertedPos[0],
                                              convertedPos[1],
                                              image=obstaclePicture)
        self.canvasLock.release()

        return (tagOstacle, obstaclePicture)

    def createGraphicalGenkidma(self, genkidamaX, genkidamaY):
        """Crée un genkidama à une position spécifique.
        
        Arguments:
            genkidamaX -- La coordonnée X du genkidama.
            genkidamaY -- La coordonnée Y du genkidama.
        
        Returns:
            tuple -- Un tuple contenant le tag du genkidama dans le canvas et sa photoImage.
        """
        convertedPos = self.convertPosition(genkidamaX, genkidamaY)
        genkidamaImage = Image.open('images/bombs/spirit_bomb_35.png')
        genkidamaPicture = ImageTk.PhotoImage(genkidamaImage)

        self.canvasLock.acquire()
        tagGenkidama = self.canvas.create_image(convertedPos[0],
                                                convertedPos[1],
                                                image=genkidamaPicture)
        self.canvasLock.release()

        return (tagGenkidama, genkidamaPicture)

    def deleteGraphicalGenkidma(self, genkidamaX, genkidamaY):
        """Enlève un genkidama situé à une position spécifique.
        
        Arguments:
            genkidamaX -- La coordonnée X du genkidama.
            genkidamaY -- La coordonnée Y du genkidama.
        
        Returns:
            tuple -- Un tuple contenant le tag du genkidama dans le canvas et sa photoImage.
        """
        convertedPos = self.convertPosition(genkidamaX, genkidamaY)

        self.canvasLock.acquire()
        tagGenki = self.canvas.find_closest(convertedPos[0], convertedPos[1])
        self.canvas.delete(tagGenki)
        self.canvasLock.release()

    def onConnectionClicked(self, button):
        """Handler du clique sur le bouton de connexion
        
        Arguments:
            button -- Le bouton source.
        """
        pseudo = self.pseudoEntry.get()
        if pseudo == "":
            msg = "No pseudo given. You have to give a pseudo in order to connect to the server."
            messagebox.showerror(title="No pseudo", message=msg)
        else:
            success = self.dispatcher.onConnectionClicked(pseudo)
            if success:
                button["state"] = tk.DISABLED
                self.exitButton["state"] = tk.NORMAL
                self.chats["Public"][3]["state"] = tk.NORMAL
                self.statusLabel["text"] = "Connection succeed !"
                self.pseudoEntry.delete(0, tk.END)
            else:
                msg = "Connection to the server failed.\nMake sure the server is running."
                messagebox.showerror(title="Connection failed", message=msg)

    def closeWindow(self):
        """Handler de la fermeture de la fenêtre.
           Signale au dispatcher que l'utilisateur souhaite quitter l'application et ferme l'interface.
        """
        self.dispatcher.onCloseWindow()
        # Il se peut qu'un thread soit bloqué en attente d'une réponse du thread de l'interface
        # En exécutant un update, on va le débloquer
        self.master.update()
        self.master.destroy()

    def updateUIPlayer(self, player):
        """Met à jour la position et l'angle de rotation d'un joueur.
        
        Arguments:
            player -- Le joueur.
        """
        self.canvasLock.acquire()
        if player.getPseudo(
        ) not in self.previousAngles or self.previousAngles[
                player.getPseudo()] != player.getAngle():
            self.rotatePlayer(player)
        self.updatePlayer(player)
        self.canvasLock.release()

    def updatePlayer(self, player):
        """Met à jour la position d'un joueur.
        
        Arguments:
            player -- Le joueur.
        """
        convertedPos = self.convertPosition(player.getPositionX(),
                                            player.getPositionY())
        self.canvas.coords(player.getCanvasTagId(),
                           (convertedPos[0], convertedPos[1]))

    def rotatePlayer(self, player):
        """Met à jour l'angle de rotation d'un joueur.
        
        Arguments:
            player -- Le joueur.
        """
        self.previousAngles[player.getPseudo()] = player.getAngle()
        self.canvas.delete(player.getCanvasTagId())
        podPicture = ImageTk.PhotoImage(player.getImage().rotate(
            player.getAngle()))
        convertedPos = self.convertPosition(player.getPositionX(),
                                            player.getPositionY())
        newId = self.canvas.create_image(convertedPos[0],
                                         convertedPos[1],
                                         image=podPicture)
        player.setCanvasTagId(newId)
        player.setPhotoImage(podPicture)

    def convertPosition(self, x, y):
        """Convertie des coordonnées pour qu'elle soit utilisable par le canvas.
        
        Arguments:
            x -- La coordonnée X.
            y -- La coordonnée Y.
        
        Returns:
            tuple(x, y) -- Un tuple contenant les positions converties.
        """
        newX = x + dat.ARENA_L
        newY = y + dat.ARENA_H

        return (newX, newY)

    def showDeniedMessage(self):
        """Affiche un message indiquant à l'utilisateur que sa tentative de connexion à été refusée."""
        msg = "The server refused the connection.\nYou may try again with an other pseudo"
        messagebox.showerror(title="Connection refused", message=msg)
        self.statusLabel["text"] = "Pseudo already used..."
        self.connectionButton["state"] = tk.NORMAL

    def showWaitingMessage(self):
        """Met à jour le label de status pour indiquer à l'utilisateur d'attendre le début de la partie."""
        print("Waiting")
        self.statusLabel["text"] = "Waiting for game to start..."
        self.progress.start(10)

    def showStartMessage(self):
        """Met à jour le label de status pour indiquer à l'utilisateur que la partie à commencé."""
        print("Good game")
        self.statusLabel["text"] = "Good game !"
        self.progress.stop()

    def showWinner(self, winnerName, iWin):
        """Affiche une fenêtre avec le nom du gagnant.
        
        Arguments:
            winnerName  -- Le nom du gagnant.
            iWin  -- Indique si le gagnant est le joueur actuel.
        """
        msg = ""
        if iWin:
            msg = "Congratulation you have won !"
        else:
            msg = winnerName + " has won !"
        messagebox.showinfo(title="We have a winner !", message=msg)

    def showObjectif(self, objectifX, objectifY, objectifNumber):
        """Ajoute un objectif (une dragon ball).
        
        Arguments:
            objectifX  -- La coordonnée X de l'objectif.
            objectifY  -- La coordonnée Y de l'objectif.
            objectifNumber  -- Le numéro de l'objectif (utiliser pour choisir quelle dragon ball utiliser).
        
        Returns:
            tuple(idTag, photoImage) -- Un tuple contenant le tag de l'objectif et son image.
        """
        converted = self.convertPosition(objectifX, objectifY)
        newImage = Image.open('images/dragon_ball/ball_' +
                              str(objectifNumber) + ".png")
        newPhotoImage = ImageTk.PhotoImage(newImage)

        self.canvasLock.acquire()
        tagImage = self.canvas.create_image(converted[0],
                                            converted[1],
                                            image=newPhotoImage)
        self.canvasLock.release()

        return (tagImage, newPhotoImage)

    def reset(self):
        """Remet à zéro l'application graphique."""
        self.resetScores()
        for (_, chat) in self.chats.items():
            self.notebook.forget(chat[0])

        self.chats = {}
        # On ajoute de nouveau le chat public
        self.createChat("Public", enable=True)

    def resetScores(self):
        """Remet à zéro le tableau des scores."""
        self.progress.stop()
        for i in self.treeview.get_children():
            self.treeview.delete(i)

    def removeOpponent(self, opponentName):
        """Supprime un adversaire dde l'interface graphique.
        
        Arguments:
            opponentName -- Le nom de l'adversaire.
        """
        for child in self.treeview.get_children():
            item = self.treeview.item(child)
            if (item["text"]) == opponentName:
                self.treeview.delete(child)

        if opponentName in self.chats:
            del self.chats[opponentName]

    def deleteFromCanvas(self, tag):
        """Supprime un élément du canavas identifié par son tag.
        
        Arguments:
            tag  -- Le tag de l'élément à supprimer.
        """
        self.canvas.delete(tag)

    def showElement(self, tag):
        self.canvas.itemconfigure(tag, state='normal')

    def hideElement(self, tag):
        self.canvas.itemconfigure(tag, state='hidden')
예제 #28
0
    def change_language(self):
        language = RUSSIAN_LANGUAGE if get_language(
        ) == UKRAINIAN_LANGUAGE else UKRAINIAN_LANGUAGE
        set_language(language)
        self.destroy_and_rebuild()
        self.update_table_data()

    def destroy_and_rebuild(self):
        for child in self.winfo_children():
            child.destroy()
        self.set_widgets()
        self.grid_widgets()


async def async_generator(generator):
    for item in generator:
        yield item


if __name__ == '__main__':
    Base.metadata.create_all(engine)
    root = tk.Tk()
    note = Notebook(root)
    tab1 = Application(note)
    tab2 = tk.Frame(note)
    note.add(tab1, text='Main app')
    note.add(tab2, text='Additional tab')
    note.grid()
    root.mainloop()
예제 #29
0
class Config(Toplevel):
    def __init__(self, master):
        Toplevel.__init__(self, master, class_=APP_NAME)
        self.title(_("Settings"))
        self.grab_set()
        self.columnconfigure(0, weight=1)
        self.columnconfigure(1, weight=1)
        self.rowconfigure(0, weight=1)
        self.resizable(True, True)
        self.minsize(470, 574)

        style = Style(self)
        self._bg = style.lookup('TFrame', 'background')

        self.notebook = Notebook(self)
        self._validate = self.register(self._validate_entry_nb)

        self.img_color = PhotoImage(master=self, file=IM_COLOR)

        self.lang = StringVar(self,
                              LANGUAGES[CONFIG.get("General", "language")])
        self.gui = StringVar(self,
                             CONFIG.get("General", "trayicon").capitalize())

        self._init_general()
        self._init_widget()

        self.notebook.grid(sticky='ewsn', row=0, column=0, columnspan=2)
        Button(self, text=_('Ok'), command=self.ok).grid(row=1,
                                                         column=0,
                                                         sticky='e',
                                                         padx=4,
                                                         pady=10)
        Button(self, text=_('Cancel'), command=self.destroy).grid(row=1,
                                                                  column=1,
                                                                  sticky='w',
                                                                  padx=4,
                                                                  pady=10)

    def _init_general(self):
        frame_general = Frame(self)
        self.notebook.add(frame_general, text=_("General"))
        # --- Language
        Label(frame_general, text=_("Language")).grid(row=0,
                                                      column=0,
                                                      padx=8,
                                                      pady=4,
                                                      sticky="e")

        menu_lang = Menu(frame_general, tearoff=False, background=self._bg)
        mb = Menubutton(frame_general, menu=menu_lang, textvariable=self.lang)
        mb.grid(row=0, column=1, padx=8, pady=4, sticky="w")
        for lang in LANGUAGES:
            language = LANGUAGES[lang]
            menu_lang.add_radiobutton(label=language,
                                      value=language,
                                      variable=self.lang,
                                      command=self.translate)

        # --- gui toolkit
        Label(frame_general,
              text=_("GUI Toolkit for the system tray icon")).grid(row=2,
                                                                   column=0,
                                                                   padx=8,
                                                                   pady=4,
                                                                   sticky="e")

        menu_gui = Menu(frame_general, tearoff=False, background=self._bg)
        Menubutton(frame_general,
                   menu=menu_gui,
                   width=9,
                   textvariable=self.gui).grid(row=2,
                                               column=1,
                                               padx=8,
                                               pady=4,
                                               sticky="w")
        for toolkit, b in TOOLKITS.items():
            if b:
                menu_gui.add_radiobutton(label=toolkit.capitalize(),
                                         value=toolkit.capitalize(),
                                         variable=self.gui,
                                         command=self.change_gui)
        # --- Update delay
        Label(frame_general,
              text=_("Feed update delay (min)")).grid(row=4,
                                                      column=0,
                                                      padx=8,
                                                      pady=4,
                                                      sticky="e")
        self.entry_delay = Entry(frame_general,
                                 width=10,
                                 justify='center',
                                 validate='key',
                                 validatecommand=(self._validate, '%P'))
        self.entry_delay.grid(row=4, column=1, padx=8, pady=4, sticky='w')
        self.entry_delay.insert(
            0,
            CONFIG.getint('General', 'update_delay') // 60000)
        # --- image loading timeout
        Label(frame_general,
              text=_("Image loading timeout (s)")).grid(row=5,
                                                        column=0,
                                                        padx=8,
                                                        pady=4,
                                                        sticky="e")
        self.entry_timeout = Entry(frame_general,
                                   width=10,
                                   justify='center',
                                   validate='key',
                                   validatecommand=(self._validate, '%P'))
        self.entry_timeout.grid(row=5, column=1, padx=8, pady=4, sticky='w')
        self.entry_timeout.insert(
            0, CONFIG.getint('General', 'img_timeout', fallback=10))
        # --- Notifications
        self.notifications = Checkbutton(frame_general,
                                         text=_("Activate notifications"))
        self.notifications.grid(row=6,
                                column=0,
                                padx=8,
                                pady=4,
                                columnspan=2,
                                sticky='w')
        if CONFIG.getboolean('General', 'notifications', fallback=True):
            self.notifications.state(('selected', '!alternate'))
        else:
            self.notifications.state(('!selected', '!alternate'))

        # --- Confirm remove feed
        self.confirm_feed_rem = Checkbutton(
            frame_general,
            text=_("Show confirmation dialog before removing feed"))
        self.confirm_feed_rem.grid(row=7,
                                   column=0,
                                   padx=8,
                                   pady=4,
                                   columnspan=2,
                                   sticky='w')
        if CONFIG.getboolean('General', 'confirm_feed_remove', fallback=True):
            self.confirm_feed_rem.state(('selected', '!alternate'))
        else:
            self.confirm_feed_rem.state(('!selected', '!alternate'))
        # --- Confirm remove cat
        self.confirm_cat_rem = Checkbutton(
            frame_general,
            text=_("Show confirmation dialog before removing category"))
        self.confirm_cat_rem.grid(row=8,
                                  column=0,
                                  padx=8,
                                  pady=4,
                                  columnspan=2,
                                  sticky='w')
        if CONFIG.getboolean('General', 'confirm_cat_remove', fallback=True):
            self.confirm_cat_rem.state(('selected', '!alternate'))
        else:
            self.confirm_cat_rem.state(('!selected', '!alternate'))
        # --- Confirm update
        self.confirm_update = Checkbutton(
            frame_general, text=_("Check for updates on start-up"))
        self.confirm_update.grid(row=9,
                                 column=0,
                                 padx=8,
                                 pady=4,
                                 columnspan=2,
                                 sticky='w')
        if CONFIG.getboolean('General', 'check_update', fallback=True):
            self.confirm_update.state(('selected', '!alternate'))
        else:
            self.confirm_update.state(('!selected', '!alternate'))

        # --- Splash supported
        self.splash_support = Checkbutton(
            frame_general,
            text=_("Check this box if the widgets disappear when you click"))
        self.splash_support.grid(row=10,
                                 column=0,
                                 padx=8,
                                 pady=4,
                                 columnspan=2,
                                 sticky='w')
        if not CONFIG.getboolean('General', 'splash_supported', fallback=True):
            self.splash_support.state(('selected', '!alternate'))
        else:
            self.splash_support.state(('!selected', '!alternate'))

    def _init_widget(self):
        frame_widget = Frame(self)
        self.notebook.add(frame_widget, text=_('Widget'))

        # --- font
        frame_font = Frame(frame_widget)
        self.title_font = FontFrame(frame_font,
                                    CONFIG.get("Widget", "font_title"), True)
        self.text_font = FontFrame(frame_font, CONFIG.get("Widget", "font"))
        frame_font.columnconfigure(1, weight=1)
        Label(frame_font, text=_('Title')).grid(row=0,
                                                column=0,
                                                sticky='nw',
                                                padx=4,
                                                pady=4)
        self.title_font.grid(row=0, column=1)
        Separator(frame_font, orient='horizontal').grid(row=1,
                                                        columnspan=2,
                                                        sticky='ew',
                                                        padx=4,
                                                        pady=4)
        Label(frame_font, text=_('Text')).grid(row=2,
                                               column=0,
                                               sticky='nw',
                                               padx=4,
                                               pady=4)
        self.text_font.grid(row=2, column=1)

        # --- opacity
        self.opacity_frame = OpacityFrame(frame_widget,
                                          CONFIG.get("Widget", "alpha"))

        # --- colors
        frame_color = Frame(frame_widget)
        frame_color.columnconfigure(1, weight=1)
        frame_color.columnconfigure(3, weight=1)
        self.color_bg = ColorFrame(frame_color,
                                   CONFIG.get("Widget", "background"),
                                   _('Background color'))
        self.color_fg = ColorFrame(frame_color,
                                   CONFIG.get("Widget", "foreground"),
                                   _('Foreground color'))
        self.color_feed_bg = ColorFrame(
            frame_color, CONFIG.get("Widget", "feed_background"),
            _('Background color'))
        self.color_feed_fg = ColorFrame(
            frame_color, CONFIG.get("Widget", "feed_foreground"),
            _('Foreground color'))
        self.color_link = ColorFrame(frame_color,
                                     CONFIG.get("Widget", "link_color"),
                                     _('Link color'))
        Label(frame_color, text=_('General')).grid(row=0,
                                                   column=0,
                                                   sticky='w',
                                                   padx=4,
                                                   pady=2)
        self.color_bg.grid(row=0, column=1, sticky='e', padx=4, pady=2)
        self.color_fg.grid(row=1, column=1, sticky='e', padx=4, pady=2)

        Separator(frame_color, orient='horizontal').grid(row=2,
                                                         columnspan=4,
                                                         sticky='ew',
                                                         padx=4,
                                                         pady=4)
        Label(frame_color, text=_('Feed entry')).grid(row=3,
                                                      column=0,
                                                      sticky='w',
                                                      padx=4,
                                                      pady=2)
        self.color_feed_bg.grid(row=3, column=1, sticky='e', padx=4, pady=2)
        self.color_feed_fg.grid(row=4, column=1, sticky='e', padx=4, pady=2)
        self.color_link.grid(row=5, column=1, sticky='e', padx=4, pady=2)

        # --- pack
        Label(frame_widget,
              text=_('Font'),
              font='TkDefaultFont 9 bold',
              anchor='w').pack(padx=4, fill='x')
        frame_font.pack(fill='x', padx=14)
        Separator(frame_widget, orient='horizontal').pack(fill='x', pady=6)
        self.opacity_frame.pack(padx=(4, 10), fill='x')
        Separator(frame_widget, orient='horizontal').pack(fill='x', pady=6)
        Label(frame_widget,
              text=_('Colors'),
              font='TkDefaultFont 9 bold',
              anchor='w').pack(padx=4, fill='x')
        frame_color.pack(fill='x', padx=14)

    def display_label(self, value):
        self.opacity_label.configure(text=" {val} %".format(
            val=int(float(value))))

    def translate(self):
        showinfo(
            "Information",
            _("The language setting will take effect after restarting the application"
              ),
            parent=self)

    @staticmethod
    def _config_size(variable, font):
        size = variable.get()
        if size:
            font.configure(size=size)

    @staticmethod
    def _validate_entry_nb(P):
        """ Allow only to enter numbers"""
        parts = P.split(".")
        b = len(parts) < 3 and P != "."
        for p in parts:
            b = b and (p == "" or p.isdigit())
        return b

    def change_gui(self):
        showinfo(
            "Information",
            _("The GUI Toolkit setting will take effect after restarting the application"
              ),
            parent=self)

    def ok(self):
        # --- general
        CONFIG.set("General", "language", REV_LANGUAGES[self.lang.get()])
        CONFIG.set("General", "trayicon", self.gui.get().lower())
        CONFIG.set("General", "update_delay",
                   "%i" % (int(self.entry_delay.get()) * 60000))
        CONFIG.set("General", "img_timeout",
                   "%i" % (int(self.entry_timeout.get())))
        CONFIG.set('General', 'confirm_feed_remove',
                   str(self.confirm_feed_rem.instate(('selected', ))))
        CONFIG.set('General', 'confirm_cat_remove',
                   str(self.confirm_cat_rem.instate(('selected', ))))
        CONFIG.set('General', 'check_update',
                   str(self.confirm_update.instate(('selected', ))))
        CONFIG.set('General', 'splash_supported',
                   str(not self.splash_support.instate(('selected', ))))
        CONFIG.set('General', 'notifications',
                   str(self.notifications.instate(('selected', ))))
        # --- widget
        CONFIG.set("Widget", "alpha", "%i" % self.opacity_frame.get_opacity())

        font_title_dic = self.title_font.get_font()
        font_title_dic[
            'underline'] = 'underline' if font_title_dic['underline'] else ''
        font_title_dic['family'] = font_title_dic['family'].replace(' ', '\ ')
        CONFIG.set(
            "Widget", "font_title",
            "{family} {size} {weight} {slant} {underline}".format(
                **font_title_dic))
        font_text_dic = self.text_font.get_font()
        font_text_dic['family'] = font_text_dic['family'].replace(' ', '\ ')
        CONFIG.set("Widget", "font", "{family} {size}".format(**font_text_dic))
        CONFIG.set("Widget", "foreground", self.color_fg.get_color())
        CONFIG.set("Widget", "background", self.color_bg.get_color())
        CONFIG.set("Widget", "feed_foreground", self.color_feed_fg.get_color())
        CONFIG.set("Widget", "feed_background", self.color_feed_bg.get_color())
        CONFIG.set("Widget", "link_color", self.color_link.get_color())
        self.destroy()
예제 #30
0
########
# Test code
if __name__ == "__main__":
    from DnDReferenceBook.src.dbase_manager import DatabaseManager
    from simple_location import SimpleLocationView
    from tkinter.ttk import Notebook

    root = Tk()

    dbm = DatabaseManager("../data/dnd_ref_book.db")
    dbm.reset("../src/tables.sql", "../src/real.sql")
    locList = dbm.get_location_list()

    nb = Notebook(root)
    lv = LocationView(nb)
    nb.add(lv, text="Default")
    for location in locList:
        temp = LocationView(nb, dbm.get_location(location["name"]))
        nb.add(temp, text=location["name"])
    nb.grid(row=0, column=0, sticky=N + W + E + S)

    top = Toplevel(root)
    slv = SimpleLocationView(top)
    slv.grid(row=0, column=0, sticky=W + E)
    for i in range(len(locList)):
        temp = SimpleLocationView(top,
                                  dbm.get_simple_location(locList[i]["name"]))
        temp.grid(row=i + 1, column=0, sticky=W + E)

    root.mainloop()
예제 #31
0
        width=tc1.winfo_reqwidth())

def on_click(event):
    clicked_tab = nb1.tk.call(nb1._w, "identify", "tab", event.x, event.y)
    if clicked_tab == 0:
        clicked_tab = 'one'
    if clicked_tab == 1:
        clicked_tab = 'two'
    if clicked_tab == 2:
        clicked_tab = 'three'

    lbl1['text'] = 'Tab '+clicked_tab+' was clicked'

nb1 = Notebook(root, style='green.TNotebook')
nb1.bind("<<NotebookTabChanged>>", tab_changed)
nb1.grid(row=0, column=0)
nb1.enable_traversal()

lbl1 = Label(root, text='ready')
lbl1.grid(row=5, column=0)
nb1.bind('<Button-1>', on_click)

# first page
page1 = Frame(root, background='red', height=70*mult)

enabler = Button(page1, text='Enable Tab two\n Test it out',
                 command=lambda: nb1.tab(1, state='normal'))
enabler.pack(ipadx=5, ipady=5)

nb1.add(page1, text='one', underline=0, padding=2)
예제 #32
0
class Application(Frame):
    def __init__(self, master):
        Frame.__init__(self, master)
        self.lastdir = os.getcwd()
        self.op_sys = platform.platform()

        #Check for path to FEBio executable
        try:
            if "windows" in self.op_sys.lower():
                home = os.getenv("HOMEPATH")
            else:
                home = os.getenv("HOME")
            fid = open(os.path.join(home, ".pyCellAnalystFEA.pth"), "r")
            self._FEBIO_BIN = os.path.abspath(fid.readline())
            fid.close()
            try:
                p = subprocess.Popen(self._FEBIO_BIN)
                p.terminate()
            except:
                self.getFEBioLocation("File indicated as the FEBio executable is incorrect. Please reselect.", home)
        except:
            self.getFEBioLocation("Please select the FEBio executable file.", home)

        self.notebook = Notebook(self)
        self.tab1 = Frame(self.notebook)
        self.tab2 = Frame(self.notebook)
        self.notebook.add(self.tab1, text="Analysis")
        self.notebook.add(self.tab2, text="Material Model")
        self.notebook.grid(row=0, column=0, sticky=NW)

        self.pickles = []
        self.data = {}
        self.vtkMeshes = {}

        self.volumes = {}
        self.outputs = OrderedDict(
            [("Effective Strain (von Mises)", IntVar(value=1)),
             ("Maximum Compressive Strain", IntVar(value=1)),
             ("Maximum Tensile Strain", IntVar(value=1)),
             ("Maximum Shear Strain", IntVar(value=1)),
             ("Volumetric Strain", IntVar(value=1)),
             ("Effective Stress (von Mises)", IntVar(value=0)),
             ("Maximum Compressive Stress", IntVar(value=0)),
             ("Maximum Tensile Stress", IntVar(value=0)),
             ("Maximum Shear Stress", IntVar(value=0)),
             ("Pressure", IntVar(value=0))])

        self.analysis = OrderedDict(
            [("Generate Histograms", IntVar(value=1)),
             ("Tukey Boxplots", IntVar(value=1)),
             ("Calculate Differences", IntVar(value=1)),
             ("Convert to VTK", IntVar(value=1))])

        self.groundSubstance = IntVar(value=1)
        self.groundSubstances = ('neoHookean',
                                 'Mooney-Rivlin',
                                 'Transversely Isotropic')

        self.tensileNetwork = IntVar(value=1)
        self.tensileNetworks = ('None',
                                'Continuous Fibre Distribution')
        self.compressiveNetwork = IntVar(value=1)

        self.groundParameters = [
            OrderedDict([("Young's Modulus", DoubleVar(value=1.0e-9)),
                         ("Poisson's Ratio", DoubleVar(value=0.1))]),
            OrderedDict([("C_1", DoubleVar(value=2.3e-10)),
                         ("C_2", DoubleVar(value=0.0)),
                         ("Bulk Modulus", DoubleVar(value=4.17e-10))]),
            OrderedDict([
                ("Young's Modulus (radial)", DoubleVar(value=1.45e-6)),
                ("Young's Modulus (tangential)", DoubleVar(value=1.0e-9)),
                ("Poisson's Ratio (radial:tangential)", DoubleVar(value=0.4)),
                ("Poisson's Ratio (tangential:radial)", DoubleVar(value=0.0)),
                ("Shear Modulus (radial planes)", DoubleVar(value=5.0e-10))])]

        self.tensileParameters = [
            None,
            OrderedDict([("ksi1", DoubleVar(value=1.0e-7)),
                         ("ksi2=ksi3", DoubleVar(value=1.45e-6)),
                         ("beta1", DoubleVar(value=2.0)),
                         ("beta2=beta3", DoubleVar(value=2.0)),
                         ("Distance Cutoff [0, 1]", DoubleVar(value=0.5)),
                         ("Cutoff Grade (0, 1]", DoubleVar(value=0.1))])]

        self.results = {"Effective Strain (von Mises)": {},
                        "Maximum Compressive Strain": {},
                        "Maximum Tensile Strain": {},
                        "Maximum Shear Strain": {},
                        "Volumetric Strain": {},
                        "Effective Stress (von Mises)": {},
                        "Maximum Compressive Stress": {},
                        "Maximum Tensile Stress": {},
                        "Maximum Shear Stress": {},
                        "Pressure": {},
                        "Displacement": {}}

        self.histograms = {"Effective Strain (von Mises)": {},
                           "Maximum Compressive Strain": {},
                           "Maximum Tensile Strain": {},
                           "Maximum Shear Strain": {},
                           "Volumetric Strain": {},
                           "Effective Stress (von Mises)": {},
                           "Maximum Compressive Stress": {},
                           "Maximum Tensile Stress": {},
                           "Maximum Shear Stress": {},
                           "Pressure": {}}

        self.boxwhiskers = {"Effective Strain (von Mises)": {},
                            "Maximum Compressive Strain": {},
                            "Maximum Tensile Strain": {},
                            "Maximum Shear Strain": {},
                            "Volumetric Strain": {},
                            "Effective Stress (von Mises)": {},
                            "Maximum Compressive Stress": {},
                            "Maximum Tensile Stress": {},
                            "Maximum Shear Stress": {},
                            "Pressure": {}}

        self.differences = {"Effective Strain (von Mises)": {},
                            "Maximum Compressive Strain": {},
                            "Maximum Tensile Strain": {},
                            "Maximum Shear Strain": {},
                            "Volumetric Strain": {},
                            "Effective Stress (von Mises)": {},
                            "Maximum Compressive Stress": {},
                            "Maximum Tensile Stress": {},
                            "Maximum Shear Stress": {},
                            "Pressure": {}}

        self.grid()
        self.createWidgetsTab1()
        self.createWidgetsTab2()

    def getFEBioLocation(self, msg, home):
        filename = tkinter.filedialog.askopenfilename(
            parent=root, initialdir=home,
            title=msg)
        if filename:
            try:
                p = subprocess.Popen(filename)
                p.terminate()
                self._FEBIO_BIN = filename
                fid = open(os.path.join(home, ".pyCellAnalystFEA.pth"), "wt")
                fid.write(self._FEBIO_BIN)
                fid.close()
            except:
                self.getFEBioLocation("Incorrect FEBio executable file was selected. Please reselect.", home)
        else:
            raise SystemExit("You must indicate the location of the FEBio executable. Exiting...")

    def createWidgetsTab1(self):
        #pickles to load
        self.pickleFrame = LabelFrame(
            self.tab1, text="Pickles from which to generate models")
        self.pickleFrame.grid(row=0, column=0,
                              columnspan=3, rowspan=2,
                              padx=5, pady=5, sticky=NW)
        self.buttonAddFile = Button(
            self.pickleFrame, text="Add", bg='green', command=self.addPickle)
        self.buttonAddFile.grid(row=0, column=0, padx=5, pady=5, sticky=E + W)
        self.buttonRemoveFile = Button(
            self.pickleFrame,
            text="Remove", bg='red', command=self.removePickle)
        self.buttonRemoveFile.grid(row=1, column=0,
                                   padx=5, pady=5, sticky=E + W)
        self.listPickles = Listbox(self.pickleFrame,
                                   width=80, selectmode=MULTIPLE)
        self.listPickles.grid(row=0, column=1,
                              columnspan=2, rowspan=2,
                              padx=5, pady=5, sticky=E + W)

        #outputs
        self.outputsFrame = LabelFrame(self.tab1, text="Outputs")
        self.outputsFrame.grid(row=2, column=0,
                               rowspan=4, columnspan=2,
                               padx=5, pady=5, sticky=NW)
        for i, t in enumerate(self.outputs.keys()):
            if i < 5:
                Checkbutton(self.outputsFrame, text=t,
                            variable=self.outputs[t]).grid(row=i, column=0,
                                                           padx=5, pady=5,
                                                           sticky=NW)
            else:
                Checkbutton(self.outputsFrame, text=t,
                            variable=self.outputs[t]).grid(row=i - 5, column=1,
                                                           padx=5, pady=5,
                                                           sticky=NW)

        #analysis settings
        self.analysisSettingsFrame = LabelFrame(self.tab1,
                                                text="Analysis Options")
        self.analysisSettingsFrame.grid(row=2, column=2,
                                        padx=5, pady=5, sticky=E + W)
        for i, t in enumerate(self.analysis.keys()):
            Checkbutton(self.analysisSettingsFrame, text=t,
                        variable=self.analysis[t]).grid(row=i, column=2,
                                                        padx=5, pady=5,
                                                        sticky=NW)

        #run analysis
        self.buttonExecute = Button(self.tab1, bg='green',
                                    font=('Helvetica', '20', 'bold'),
                                    text='Perform Simulation',
                                    command=self.performFEA)
        self.buttonExecute.grid(row=7, column=0, columnspan=3,
                                padx=5, pady=5, sticky=E + W)

        self.buttonAnalyze = Button(self.tab1, bg='blue',
                                    font=('Helvetica', '20', 'bold'),
                                    text='Analyze Results',
                                    command=self.analyzeResults)
        self.buttonAnalyze.grid(row=8, column=0, columnspan=3,
                                padx=5, pady=5, sticky=E + W)

    def createWidgetsTab2(self):
        self.groundSubstanceFrame = LabelFrame(self.tab2,
                                               text="Ground Substance")
        self.groundSubstanceFrame.grid(
            row=0, column=0, padx=5, pady=5, sticky=NW)

        self.tensileFibreNetworkFrame = LabelFrame(
            self.tab2, text="Tensile Fibres")
        self.tensileFibreNetworkFrame.grid(
            row=0, column=1, padx=5, pady=5, sticky=NW)

        self.compressiveFibreNetworkFrame = LabelFrame(
            self.tab2, text="Compressive Fibres")
        self.compressiveFibreNetworkFrame.grid(
            row=0, column=3, padx=5, pady=5, sticky=NW)

        # Ground substance
        for i, t in enumerate(self.groundSubstances):
            Radiobutton(self.groundSubstanceFrame,
                        text=t,
                        indicatoron=0,
                        padx=5,
                        width=20,
                        command=self.populateGroundSubstance,
                        variable=self.groundSubstance,
                        value=i + 1).pack(anchor=NW)

        self.groundSubstanceSettingsFrame = LabelFrame(
            self.tab2, text="Ground Substance Parameters")
        self.groundSubstanceSettingsFrame.grid(
            row=1, column=0, padx=5, pady=5, sticky=NW)
        for i, (t, v) in enumerate(
                self.groundParameters[self.groundSubstance.get() - 1].items()):
            Label(self.groundSubstanceSettingsFrame, text=t).grid(row=i,
                                                                  column=0,
                                                                  sticky=NW)
            Entry(self.groundSubstanceSettingsFrame,
                  textvariable=v,
                  width=10).grid(row=i, column=1, sticky=NW)

        # Tensile Network
        for i, t in enumerate(self.tensileNetworks):
            Radiobutton(self.tensileFibreNetworkFrame,
                        text=t,
                        indicatoron=0,
                        padx=5,
                        width=25,
                        command=self.populateTensileNetwork,
                        variable=self.tensileNetwork,
                        value=i + 1).pack(anchor=NW)

        self.tensileNetworkSettingsFrame = LabelFrame(
            self.tab2, text="Tensile Network Parameters")
        self.tensileNetworkSettingsFrame.grid(
            row=1, column=1, padx=5, pady=5, sticky=NW)
        if self.tensileNetwork.get() == 1:
            Label(self.tensileNetworkSettingsFrame,
                  text="No tensile network will be modeled").grid(row=0,
                                                                  column=0,
                                                                  sticky=NW)
        else:
            for i, (t, v) in enumerate(
                    self.tensileParameters[self.tensileNetwork.get() - 1].items()):
                Label(self.tensileNetworkSettingsFrame, text=t).grid(row=i,
                                                                     column=0,
                                                                     sticky=NW)

                Entry(self.tensileNetworkSettingsFrame, textvariable=v,
                      width=10).grid(row=i, column=1, sticky=NW)

    def populateGroundSubstance(self):
        for child in self.groundSubstanceSettingsFrame.grid_slaves():
            child.destroy()
        for i, (t, v) in enumerate(
                self.groundParameters[self.groundSubstance.get() - 1].items()):
            Label(self.groundSubstanceSettingsFrame, text=t).grid(row=i,
                                                                  column=0,
                                                                  sticky=NW)
            Entry(self.groundSubstanceSettingsFrame,
                  textvariable=v,
                  width=10).grid(row=i, column=1, sticky=NW)

    def populateTensileNetwork(self):
        for child in self.tensileNetworkSettingsFrame.grid_slaves():
            child.destroy()
        if self.tensileNetwork.get() == 1:
            Label(self.tensileNetworkSettingsFrame,
                  text="No tensile network will be modeled").grid(row=0,
                                                                  column=0,
                                                                  sticky=NW)
        else:
            for i, (t, v) in enumerate(
                    self.tensileParameters[self.tensileNetwork.get() - 1].items()):
                Label(self.tensileNetworkSettingsFrame, text=t).grid(row=i,
                                                                     column=0,
                                                                     sticky=NW)
                Entry(
                    self.tensileNetworkSettingsFrame, textvariable=v,
                    width=10).grid(row=i, column=1, sticky=NW)
            Button(
                self.tensileNetworkSettingsFrame, text='Plot', width=10,
                command=self.plotWeight).grid(row=i + 1, column=0, sticky=NW)

    def plotWeight(self):
        f = Figure()
        a = f.add_subplot(111)
        x = np.arange(0.0, 1.0, 0.01)
        d = self.tensileParameters[1][
            "Distance Cutoff [0, 1]"].get()
        k = self.tensileParameters[1][
            "Cutoff Grade (0, 1]"].get()
        if k <= 0:
            k = 0.01
            print(("Cutoff Grade must be greater than zero"
                   " Using a value of 0.01."))
        s = 0.5 * (1 - np.tanh(old_div((x - d), k)))
        a.plot(x, s)
        a.set_xlabel("Normalized distance from object surface")
        a.set_ylabel("Tensile Network Weight")
        canvas = FigureCanvasTkAgg(f,
                                   master=self.tensileNetworkSettingsFrame)
        canvas.show()
        (cols, rows) = self.tensileNetworkSettingsFrame.grid_size()
        slaves = self.tensileNetworkSettingsFrame.grid_slaves()
        if rows == 7:
            canvas.get_tk_widget().grid(row=rows + 1, column=0,
                                        columnspan=2, sticky=NW)
        else:
            slaves[0].destroy()
            canvas.get_tk_widget().grid(rows=rows, column=0,
                                        columnspan=2, sticky=NW)

    def addPickle(self):
        filenames = tkinter.filedialog.askopenfilenames(
            parent=root, initialdir=self.lastdir,
            title="Please choose pickle file(s) for analysis.")
        filenames = root.tk.splitlist(filenames)
        for f in filenames:
            if '.pkl' in f:
                self.listPickles.insert(END, f)
                self.pickles.append(f)
            else:
                print(("WARNING - {:s} does not contain the .pkl extension."
                       " Ignoring this file."))

    def removePickle(self):
        index = self.listPickles.curselection()
        if index:
            for i in index[::-1]:
                self.listPickles.delete(i)
                del self.pickles[i]

    def performFEA(self):
        for filename in self.pickles:
            fid = open(filename, 'rb')
            self.data[filename] = pickle.load(fid)
            fid.close()

            mesh = febio.MeshDef()
            # would be good to vectorize these
            for i, e in enumerate(self.data[filename]['elements']):
                mesh.elements.append(['tet4', i + 1] + e)

            for i, n in enumerate(self.data[filename]['nodes']):
                mesh.nodes.append([i + 1] + n)

            mesh.addElementSet(setname='cell',
                               eids=list(range(1, len(mesh.elements) + 1)))

            modelname = filename.replace('.pkl', '.feb')
            model = febio.Model(modelfile=modelname,
                                steps=[{'Displace': 'solid'}])

            #lookup table for proper FEBio keyword vs GUI text
            keywords = {
                "neoHookean": "neo-Hookean",
                "Young's Modulus": "E",
                "Poisson's Ratio": "v",
                "Mooney-Rivlin": "Mooney-Rivlin",
                "C_1": "c1",
                "C_2": "c2",
                "Bulk Modulus": "k",
                "Transversely Isotropic": "orthotropic elastic",
                "Young's Modulus (radial)": "E1",
                "Young's Modulus (tangential)": ["E2", "E3"],
                "Poisson's Ratio (radial:tangential)": "v12",
                "Poisson's Ratio (tangential:radial)": ["v23", "v31"],
                "Shear Modulus (radial planes)": ["G12", "G23", "G31"],
                "Continuous Fibre Distribution":
                "ellipsoidal fiber distribution"}

            #Ground Substance
            gtype = keywords[
                self.groundSubstances[self.groundSubstance.get() - 1]]
            gattributes = {}
            for (k, v) in list(self.groundParameters[
                    self.groundSubstance.get() - 1].items()):
                # transversely isotropic case
                if isinstance(keywords[k], list):
                    for a in keywords[k]:
                        # G12 = E2 / (2 * (1 + v12))
                        if a == "G12":
                            gattributes[a] = str(
                                old_div(float(gattributes["E2"]),
                                (2.0 * (1 + float(gattributes["v12"])))))
                        else:
                            gattributes[a] = str(v.get())
                # any other case
                else:
                    gattributes[keywords[k]] = str(v.get())
            if self.tensileNetwork.get() == 1:
                mat = febio.MatDef(matid=1, mname='cell',
                                   mtype=gtype, elsets='cell',
                                   attributes=gattributes)
                model.addMaterial(mat)
                model.addGeometry(mesh=mesh, mats=[mat])
            #With a tensile network
            else:
                self.makeVTK(filename)
                self.findLocalCsys(filename)
                ind = self.tensileNetwork.get() - 1
                ttype = keywords[self.tensileNetworks[ind]]
                ksi = [self.tensileParameters[ind][k].get()
                       for k in ("ksi1", "ksi2=ksi3", "ksi2=ksi3")]
                beta = [self.tensileParameters[ind][k].get()
                        for k in ("beta1", "beta2=beta3", "beta2=beta3")]

                mats = []
                I1n2 = np.eye(3)[0:2, :]

                distances = numpy_support.vtk_to_numpy(
                    self.vtkMeshes[filename].GetCellData().GetArray(
                        "Signed Distances"))
                maxd = np.max(np.abs(distances))
                for i, e in enumerate(self.data[filename]['elements']):
                    normal = self.vtkMeshes[filename].GetCellData().GetArray(
                        "LevelSet Normals").GetTuple3(i)
                    # cross with both e1 and e2 to ensure linearly independent
                    crossed = np.cross(normal, I1n2)
                    norms = np.linalg.norm(crossed, axis=1)
                    # get the index of the maximum norm; so never zero
                    ind2 = np.argmax(norms)
                    b = old_div(crossed[ind, :], norms[ind2])
                    normal = list(map(str, list(normal)))
                    b = list(map(str, list(b)))
                    d = self.tensileParameters[ind]["Distance Cutoff [0, 1]"].get()
                    k = self.tensileParameters[ind]["Cutoff Grade (0, 1]"].get()
                    x = old_div(np.abs(distances[i]), maxd)
                    w = 0.5 * (1 - np.tanh(old_div((x - d), k)))
                    if w < 0.05:
                        w = 0.05
                    tmp_ksi = [w * v for v in ksi]
                    tattributes = {"ksi":
                                   ",".join(map(str, tmp_ksi)),
                                   "beta": ",".join(map(str, beta))}
                    mesh.addElementSet(setname='e{:d}'.format(i + 1),
                                       eids=[i + 1])
                    mats.append(febio.MatDef(
                        matid=i + 1, mname='cell', mtype="solid mixture",
                        elsets='e{:d}'.format(i + 1), attributes={
                            'mat_axis':
                            ['vector', ','.join(normal), ','.join(b)]}))

                    mats[-1].addBlock(branch=1, btype='solid', mtype=gtype,
                                      attributes=gattributes)
                    mats[-1].addBlock(branch=1, btype='solid', mtype=ttype,
                                      attributes=tattributes)
                    model.addMaterial(mats[-1])
                model.addGeometry(mesh=mesh, mats=mats)

            ctrl = febio.Control()
            ctrl.setAttributes({'title': 'cell', 'max_ups': '0'})

            model.addControl(ctrl, step=0)

            boundary = febio.Boundary(steps=1)
            for i, bc in enumerate(self.data[filename]['boundary conditions']):
                boundary.addPrescribed(
                    step=0, nodeid=self.data[filename]['surfaces'][i],
                    dof='x', lc='1', scale=str(bc[0]))
                boundary.addPrescribed(
                    step=0, nodeid=self.data[filename]['surfaces'][i],
                    dof='y', lc='1', scale=str(bc[1]))
                boundary.addPrescribed(
                    step=0, nodeid=self.data[filename]['surfaces'][i],
                    dof='z', lc='1', scale=str(bc[2]))

            model.addBoundary(boundary=boundary)
            model.addLoadCurve(lc='1', lctype='linear', points=[0, 0, 1, 1])
            model.writeModel()

            subprocess.call(self._FEBIO_BIN + " -i " + modelname, shell=True)

    def analyzeResults(self):
        self.matched = [] # for paired comparisons
        for i, f in enumerate(self.pickles):
            s = f.split(os.sep)[-1]
            if not(fnmatch.filter(
                    itertools.chain.from_iterable(self.matched), "*" + s)):
                self.matched.append(fnmatch.filter(self.pickles, "*" + s))
            plotname = f.replace('.pkl', '.xplt')
            print("\n... Analyzing results for {:s}".format(plotname))

            results = febio.FebPlt(plotname)
            stress = np.zeros((len(self.data[f]['elements']), 3, 3), float)
            strain = np.copy(stress)
            #material element volumes
            mvolumes = np.zeros(len(self.data[f]['elements']), float)
            #spatial element volumes
            svolumes = np.copy(mvolumes)
            nnodes = len(list(results.NodeData.keys()))
            displacement = np.zeros((nnodes, 3))
            for j, n in enumerate(self.data[f]['nodes']):
                tmp = results.NodeData[j + 1]['displacement'][-1, :]
                displacement[j, :] = [tmp[0], tmp[1], tmp[2]]
            pstress = []
            pstressdir = []
            pstrain = []
            pstraindir = []
            for j, e in enumerate(self.data[f]['elements']):
                tmp = results.ElementData[j + 1]['stress'][-1, :]
                stress[j, :, :] = [[tmp[0], tmp[3], tmp[5]],
                                   [tmp[3], tmp[1], tmp[4]],
                                   [tmp[5], tmp[4], tmp[2]]]
                #material coordinates
                X = np.zeros((4, 3), float)
                #spatial coordinates
                x = np.zeros((4, 3), float)
                for k in range(4):
                    X[k, :] = self.data[f]['nodes'][e[k] - 1]
                    x[k, :] = (X[k, :] +
                               results.NodeData[e[k]]['displacement'][-1, :])
                #set up tangent space
                W = np.zeros((6, 3), float)
                w = np.zeros((6, 3), float)
                for k, c in enumerate(
                        [(0, 1), (0, 2), (0, 3), (1, 3), (2, 3), (1, 2)]):
                    W[k, :] = X[c[1], :] - X[c[0], :]
                    w[k, :] = x[c[1], :] - x[c[0], :]
                dX = np.zeros((6, 6), float)
                ds = np.zeros((6, 1), float)
                for k in range(6):
                    for l in range(3):
                        dX[k, l] = 2 * W[k, l] ** 2
                    dX[k, 3] = 4 * W[k, 0] * W[k, 1]
                    dX[k, 4] = 4 * W[k, 1] * W[k, 2]
                    dX[k, 5] = 4 * W[k, 0] * W[k, 2]
                    ds[k, 0] = (np.linalg.norm(w[k, :]) ** 2 -
                                np.linalg.norm(W[k, :]) ** 2)
                #solve for strain
                E = np.linalg.solve(dX, ds)
                #get volumes
                mvolumes[j] = old_div(np.abs(
                    np.dot(W[0, :], np.cross(W[1, :], W[2, :]))), 6.0)
                svolumes[j] = old_div(np.abs(
                    np.dot(w[0, :], np.cross(w[1, :], w[2, :]))), 6.0)
                strain[j, :, :] = [[E[0], E[3], E[5]],
                                   [E[3], E[1], E[4]],
                                   [E[5], E[4], E[2]]]
                #eigenvalues and eigenvectors of stress and strain tensors
                #eigenvectors are normalized
                eigstrain, eigstraindir = np.linalg.eigh(strain[j, :, :])
                order = np.argsort(eigstrain)
                eigstrain = eigstrain[order]
                eigstraindir /= np.linalg.norm(eigstraindir, axis=0, keepdims=True)
                eigstraindir = eigstraindir[:, order]
                pstrain.append(eigstrain)
                pstraindir.append(eigstraindir)
                eigstress, eigstressdir = np.linalg.eigh(stress[j, :, :])
                order = np.argsort(eigstress)
                eigstress = eigstress[order]
                eigstressdir /= np.linalg.norm(eigstressdir, axis=0, keepdims=True)
                eigstressdir = eigstressdir[:, order]
                pstress.append(eigstress)
                pstressdir.append(eigstressdir)
            pstress = np.array(pstress)
            pstressdir = np.array(pstressdir)
            pstrain = np.array(pstrain)
            pstraindir = np.array(pstraindir)
            #save reference volumes
            self.volumes.update({f: mvolumes})
            self.results['Effective Strain (von Mises)'].update(
                {f: np.sqrt(old_div(((pstrain[:, 2] - pstrain[:, 1]) ** 2 +
                             (pstrain[:, 1] - pstrain[:, 0]) ** 2 +
                             (pstrain[:, 2] - pstrain[:, 0]) ** 2),
                            2.0))})
            self.results['Maximum Compressive Strain'].update(
                {f: np.outer(pstrain[:, 0], [1 , 1, 1]) * pstraindir[:, :, 0]})
            self.results['Maximum Tensile Strain'].update(
                {f: np.outer(pstrain[:, 2], [1, 1, 1]) * pstraindir[:, :, 2]})
            self.results['Maximum Shear Strain'].update(
                {f: 0.5 * (pstrain[:, 2] - pstrain[:, 0])})
            self.results['Volumetric Strain'].update(
                {f: old_div(svolumes, mvolumes) - 1.0})

            self.results['Effective Stress (von Mises)'].update(
                {f: np.sqrt(old_div(((pstress[:, 2] - pstress[:, 1]) ** 2 +
                             (pstress[:, 1] - pstress[:, 0]) ** 2 +
                             (pstress[:, 2] - pstress[:, 0]) ** 2), 2.0))})
            self.results['Maximum Compressive Stress'].update(
                {f: np.outer(pstress[:, 0], [1 , 1, 1]) * pstressdir[:, :, 0]})
            self.results['Maximum Tensile Stress'].update(
                {f: np.outer(pstress[:, 2], [1, 1, 1]) * pstressdir[:, :, 2]})
            self.results['Maximum Shear Stress'].update(
                {f: 0.5 * (pstress[:, 2] - pstress[:, 0])})
            self.results['Pressure'].update(
                {f: old_div(np.sum(pstress, axis=1), 3.0)})

            self.results['Displacement'].update({f: displacement})

        for i, k in enumerate(self.outputs.keys()):
            if self.outputs[k].get():
                for m in self.matched:
                    weights = old_div(self.volumes[m[0]], np.sum(self.volumes[m[0]]))
                    for j, f in enumerate(m):
                        if len(self.results[k][f].shape) > 1:
                            dat = np.ravel(np.linalg.norm(self.results[k][f], axis=1))
                        else:
                            dat = np.ravel(self.results[k][f])
                        if self.analysis['Generate Histograms'].get():
                            IQR = np.subtract(*np.percentile(dat, [75, 25]))
                            nbins = (int(old_div(np.ptp(dat),
                                         (2 * IQR * dat.size ** (old_div(-1., 3.))))))
                            h = histogram(dat, numbins=nbins, weights=weights)
                            bins = np.linspace(h[1], h[1] + h[2] * nbins,
                                               nbins, endpoint=False)
                            self.histograms[k][f] = {'bins': bins,
                                                     'heights': h[0],
                                                     'width': h[2]}
                        if self.analysis['Tukey Boxplots'].get():
                            quantiles = np.zeros(3, float)
                            for n, q in enumerate([0.25, 0.5, 0.75]):
                                quantiles[n] = quantile_1D(dat, weights, q)
                            self.boxwhiskers[k][f] = {'quantiles': quantiles,
                                                      'data': dat}
                    if self.analysis['Calculate Differences'].get():
                        for c in itertools.combinations(m, 2):
                            if len(self.results[k][c[0]].shape) > 1:
                                dat1 = np.ravel(np.linalg.norm(self.results[k][c[0]], axis=1))
                                dat2 = np.ravel(np.linalg.norm(self.results[k][c[1]], axis=1))
                            else:
                                dat1 = np.ravel(self.results[k][c[0]])
                                dat2 = np.ravel(self.results[k][c[1]])
                            difference = dat2 - dat1
                            wrms = np.sqrt(np.average(difference ** 2,
                                                      weights=weights))
                            self.differences[k][c[1] + "MINUS" + c[0]] = {
                                'difference': difference, 'weighted RMS': wrms}
        self.saveResults()
        print("... ... Analysis Complete")

    def saveResults(self):
        top_dir = self.pickles[0].rsplit(os.sep, 2)[0]
        ts = datetime.datetime.fromtimestamp(
            time.time()).strftime("%Y-%m-%d_%H-%M-%S")
        output_dir = os.sep.join([top_dir, "FEA_analysis_" + ts])
        os.mkdir(output_dir)
        for output in list(self.histograms.keys()):
            if self.histograms[output] and self.analysis["Generate Histograms"].get():
                try:
                    os.mkdir(os.sep.join([output_dir, "histograms"]))
                except:
                    pass
                for m in self.matched:
                    fig = Figure()
                    FigureCanvasTkAgg(fig, self)
                    ax = fig.add_subplot(111)
                    #fig.set_size_inches(2.5, 2.5)
                    for f in m:
                        trunc_name = f.rsplit(os.sep, 2)
                        ax.bar(self.histograms[output][f]['bins'],
                               self.histograms[output][f]['heights'],
                               self.histograms[output][f]['width'],
                               label=trunc_name[1])
                    object_name = trunc_name[2].replace("cellFEA", "Cell ")
                    object_name = object_name.replace(".pkl", "")
                    ax.set_title(output + ' ' + object_name)
                    cell_directory = os.path.join(output_dir, "histograms", object_name.replace(" ", "_"))
                    try:
                        os.mkdir(cell_directory)
                    except:
                        pass
                    fig.savefig(
                        os.path.join(cell_directory,
                                     output.replace(" ", "_") + ".svg"), bbox_inches='tight')
                    fig.clear()
                    del fig

        for output in list(self.boxwhiskers.keys()):
            if self.boxwhiskers[output] and self.analysis["Tukey Boxplots"].get():
                try:
                    os.mkdir(os.path.join(output_dir, "boxplots"))
                except:
                    pass
                for m in self.matched:
                    fig = Figure()
                    FigureCanvasTkAgg(fig, self)
                    ax = fig.add_subplot(111)
                    x = []
                    q = []
                    labels = []
                    for f in m:
                        trunc_name = f.rsplit(os.sep, 2)
                        x.append(self.boxwhiskers[output][f]['data'])
                        q.append(self.boxwhiskers[output][f]['quantiles'])
                        labels.append(trunc_name[1])
                    q = np.array(q)
                    a = ax.boxplot(x)
                    object_name = trunc_name[2].replace("cellFEA", "Cell ")
                    object_name = object_name.replace(".pkl", "")
                    for i in range(q.shape[0]):
                        a['medians'][i].set_ydata(q[i, 1])
                        a['boxes'][i]._xy[[0, 1, 4], 1] = q[i, 0]
                        a['boxes'][i]._xy[[2, 3], 1] = q[i, 2]
                        iqr = q[i, 2] - q[i, 0]
                        y = x[i]
                        top = np.max(y[y < q[i, 2] + 1.5 * iqr])
                        bottom = np.min(y[y > q[i, 0] - 1.5 * iqr])
                        a['whiskers'][2 * i].set_ydata(
                            np.array([q[i, 0], bottom]))
                        a['whiskers'][2 * i + 1].set_ydata(
                            np.array([q[i, 2], top]))
                        a['caps'][2 * i].set_ydata(np.array([bottom, bottom]))
                        a['caps'][2 * i + 1].set_ydata(np.array([top, top]))

                        low_fliers = y[y < bottom]
                        high_fliers = y[y > top]
                        fliers = np.concatenate((low_fliers, high_fliers))
                        a['fliers'][2 * i].set_ydata(fliers)
                        a['fliers'][2 * i].set_xdata([i + 1] * fliers.size)

                    object_name = trunc_name[2].replace("cellFEA", "Cell ")
                    object_name = object_name.replace(".pkl", "")
                    ax.set_title(object_name)
                    ax.set_ylabel(output)
                    ax.set_xticklabels(labels, rotation=45)
                    cell_directory = os.path.join(output_dir, "boxplots",
                            object_name.replace(" ", "_"))
                    try:
                        os.mkdir(cell_directory)
                    except:
                        pass
                    fig.savefig(
                        os.path.join(cell_directory,
                                     output.replace(" ", "_") + ".svg"), bbox_inches="tight")
                    fig.clear()
                    del fig

        for output in list(self.differences.keys()):
            if self.differences[output] and self.analysis["Calculate Differences"].get():
                try:
                    os.mkdir(os.sep.join([output_dir, "paired_differences"]))
                except:
                    pass
                for m in self.matched:
                    labels = []
                    for f in m:
                        trunc_name = f.rsplit(os.sep, 2)
                        labels.append(trunc_name[1])
                    N = len(m)
                    grid = np.zeros((N, N), float)
                    combos = list(itertools.combinations(m, 2))
                    enum_combos = list(itertools.combinations(list(range(N)), 2))
                    for c, e in zip(combos, enum_combos):
                        grid[e[0], e[1]] = (self.differences[output]
                                            ["".join([c[1], 'MINUS', c[0]])]
                                            ['weighted RMS'])
                        grid[e[1], e[0]] = grid[e[0], e[1]]
                    fig = Figure()
                    FigureCanvasTkAgg(fig, self)
                    ax = fig.add_subplot(111)
                    high = np.max(np.ravel(grid))
                    low = np.min(np.ravel(grid))
                    if abs(low - high) < 1e-3:
                        high += 0.001
                    heatmap = ax.pcolormesh(
                        grid, cmap=cm.Blues, edgecolors='black',
                        vmin=low, vmax=high)
                    ax.set_xticks(np.arange(N) + 0.5, minor=False)
                    ax.set_yticks(np.arange(N) + 0.5, minor=False)
                    ax.invert_yaxis()
                    ax.xaxis.tick_top()
                    ax.set_xticklabels(labels, minor=False)
                    ax.set_yticklabels(labels, minor=False)
                    fig.colorbar(heatmap)

                    object_name = trunc_name[2].replace("cellFEA", "Cell ")
                    object_name = object_name.replace(".pkl", "")
                    ax.set_title(object_name, y=1.08)
                    cell_directory = os.path.join(
                        output_dir, "paired_differences",
                        object_name.replace(" ", "_"))
                    try:
                        os.mkdir(cell_directory)
                    except:
                        pass
                    fig.savefig(
                        os.path.join(cell_directory, output.replace(
                            " ", "_") + ".svg"), bbox_inches="tight")
                    fig.clear()
                    del fig

        if self.analysis['Convert to VTK'].get():
            try:
                os.mkdir(os.path.join(output_dir, "vtk"))
            except:
                pass
            for m in self.matched:
                try:
                    self.vtkMeshes[m[0]]
                except:
                    self.makeVTK(m[0])
                for output in list(self.outputs.keys()):
                    if self.outputs[output].get():
                        for f in m:
                            trunc_name = f.rsplit(os.sep, 2)
                            vtkArray = numpy_support.numpy_to_vtk(
                                np.ravel(self.results[output][f]).astype('f'),
                                deep=True, array_type=vtk.VTK_FLOAT)
                            shape = self.results[output][f].shape
                            if len(shape) == 2:
                                vtkArray.SetNumberOfComponents(shape[1])
                            elif len(shape) == 1:
                                vtkArray.SetNumberOfComponents(1)
                            else:
                                print(("WARNING: {:s} has rank {:d}".format(f, len(shape))))
                                continue
                            vtkArray.SetName(trunc_name[1] + ' ' + output)
                            self.vtkMeshes[m[0]].GetCellData().AddArray(
                                vtkArray)
                for f in m:
                    arr = numpy_support.numpy_to_vtk(np.ravel(self.results['Displacement'][f]).astype('f'),
                                                    deep=True, array_type=vtk.VTK_FLOAT)
                    arr.SetName(trunc_name[1] + ' ' + 'Displacement')
                    arr.SetNumberOfComponents(3)
                    self.vtkMeshes[m[0]].GetPointData().AddArray(arr)

                object_name = trunc_name[2].replace("cellFEA", "Cell")
                object_name = object_name.replace(".pkl", ".vtu")
                idWriter = vtk.vtkXMLUnstructuredGridWriter()
                idWriter.SetFileName(os.path.join(output_dir, 'vtk', object_name))
                idWriter.SetInputData(self.vtkMeshes[m[0]])
                idWriter.Write()

    def makeVTK(self, filename):
        nelements = len(self.data[filename]['elements'])
        n = np.array(self.data[filename]['nodes'])
        arr = numpy_support.numpy_to_vtk(
            n.ravel(), deep=True, array_type=vtk.VTK_DOUBLE)
        arr.SetNumberOfComponents(3)
        tetraPoints = vtk.vtkPoints()
        tetraPoints.SetData(arr)

        vtkMesh = vtk.vtkUnstructuredGrid()
        vtkMesh.Allocate(nelements, nelements)
        vtkMesh.SetPoints(tetraPoints)

        e = np.array(self.data[filename]['elements'], np.uint32) - 1
        e = np.hstack((np.ones((e.shape[0], 1), np.uint32) * 4, e))
        arr = numpy_support.numpy_to_vtk(e.ravel(), deep=True,
                                         array_type=vtk.VTK_ID_TYPE)
        tet = vtk.vtkCellArray()
        tet.SetCells(old_div(e.size, 5), arr)
        vtkMesh.SetCells(10, tet)

        centroids = (n[e[:, 1]] + n[e[:, 2]] + n[e[:, 3]] + n[e[:, 4]])
        centroids /= 4.0
        arr = numpy_support.numpy_to_vtk(
            centroids.ravel(), deep=True, array_type=vtk.VTK_FLOAT)
        arr.SetName("Centroids")
        arr.SetNumberOfComponents(3)
        vtkMesh.GetCellData().AddArray(arr)
        self.vtkMeshes[filename] = vtkMesh

    def findLocalCsys(self, filename):
        poly = vtk.vtkGeometryFilter()
        poly.SetInputData(self.vtkMeshes[filename])
        poly.Update()

        distanceFilter = vtk.vtkImplicitPolyDataDistance()
        distanceFilter.SetInput(poly.GetOutput())

        gradients = vtk.vtkFloatArray()
        gradients.SetNumberOfComponents(3)
        gradients.SetName("LevelSet Normals")

        distances = vtk.vtkFloatArray()
        distances.SetNumberOfComponents(1)
        distances.SetName("Signed Distances")

        N = self.vtkMeshes[filename].GetCellData().GetArray(
            "Centroids").GetNumberOfTuples()
        for i in range(N):
            g = np.zeros(3, np.float32)
            p = self.vtkMeshes[filename].GetCellData().GetArray(
                "Centroids").GetTuple3(i)
            d = distanceFilter.EvaluateFunction(p)
            distanceFilter.EvaluateGradient(p, g)
            g = old_div(np.array(g), np.linalg.norm(np.array(g)))
            gradients.InsertNextTuple(g)
            distances.InsertNextValue(d)
        self.vtkMeshes[filename].GetCellData().AddArray(gradients)
        self.vtkMeshes[filename].GetCellData().AddArray(distances)
예제 #33
0
class Statistics(Page):
    """This class provides the statistics view, in table and graphical form"""
    def __init__(self, mainUI):
        super().__init__(mainUI)
        self.columnconfigure(0, weight=1)
        self.back_button = Button(self,
                                  text="< Back",
                                  command=lambda: self.go_to("Welcome")())
        self.back_button.grid(row=1, padx=(10, 0), pady=(10, 5), sticky="w")

        self.choose_date_label = Label(self,
                                       text="View statistics from event on: ")
        self.choose_date_label.grid(row=1, column=1)
        self.date_to_view = StringVar(name="date")

        self.choose_date_menu = OptionMenu(self, self.date_to_view,
                                           *StatsData.available_dates())
        self.date_to_view.set(StatsData.available_dates()[0])
        self.choose_date_menu.grid(row=1, column=2)
        self.date_to_view.trace("w", self.update_ui)
        # hide border
        # https://groups.google.com/forum/#!topic/comp.lang.tcl/8a6e4tfWJvo
        s = Style(self)
        s.configure('flat.TNotebook', borderwidth=0)
        self.tabbed_section = Notebook(self, style="flat.TNotebook")

        # # FIXME: padding
        self.tabbed_section.grid(row=2, columnspan="3", padx=20, sticky="n")
        #
        self.button = Button(self,
                             text="Export event statistics as CSV",
                             command=self.csv_export)
        self.button.grid(row=3, columnspan="3", pady=10, sticky="n")
        self.update_ui()

    def update_ui(self, *args):
        new_date = StatsData.dates[self.date_to_view.get()]
        for tab in self.tabbed_section.tabs():
            self.tabbed_section.forget(tab)

        for package in StatsData.packages_for_date(new_date):
            test_tab = PackageView(self.tabbed_section, new_date, package)
            self.tabbed_section.add(test_tab, text=package)

    def csv_export(self):
        date = StatsData.dates[self.date_to_view.get()]

        file_path = filedialog.asksaveasfilename(filetypes=(("CSV", ".csv"), ),
                                                 initialfile=date)

        # code taken from https://docs.python.org/3/library/csv.html
        if file_path:
            with open(file_path, 'w', newline='') as csvfile:
                csvwriter = csv.writer(csvfile,
                                       delimiter=',',
                                       quotechar='"',
                                       quoting=csv.QUOTE_MINIMAL)
                csvwriter.writerow(("package name", "quiz", "question id",
                                    "question text", "total times shown",
                                    "successful answers", "skips", "abandons"))
                for package in StatsData.packages_for_date(date):
                    for quiz in StatsData.quizzes_for_package(package, date):
                        for q in StatsData.get_data(date, package, quiz):
                            csvwriter.writerow(
                                (q.package_name, q.quiz, q.q_id, q.text,
                                 total_times_shown(q), q.successes, q.skips,
                                 q.abandons))
예제 #34
0
class ExplorerProGui(BanyanBase):
    """
    The Pimoroni Explorer-Pro For Raspberry Pi Demo Station GUI
    """

    def __init__(self, **kwargs):
        """
        Build the main screen as a notebook.
        """

        # initialize the parent class
        super(ExplorerProGui, self).__init__(
            back_plane_ip_address=kwargs['back_plane_ip_address'],
            subscriber_port=kwargs['subscriber_port'],
            publisher_port=kwargs['publisher_port'],
            process_name=kwargs['process_name'])

        self.set_subscriber_topic('report_from_hardware')

        self.main = Tk()
        self.main.title('Demo Station For Explorer-Pro HAT')

        # gives weight to the cells in the grid
        rows = 0
        while rows < 50:
            self.main.rowconfigure(rows, weight=1)
            self.main.columnconfigure(rows, weight=1)
            rows += 1

        # Defines and places the notebook widget
        self.nb = Notebook(self.main, padding=20, height=300, width=800)
        self.nb.grid(row=1, column=0, columnspan=50, rowspan=49, sticky='NESW')

        # create the analog inputs tab
        self.analog_inputs_tab = Frame(self.nb, padding=[130, 20])
        self.nb.add(self.analog_inputs_tab, text='Analog Inputs')
        # create an instance of the AnalogInputs class
        self.analog_inputs = AnalogInputs(self.analog_inputs_tab, self)

        # create the digital inputs tab
        self.digital_inputs_tab = Frame(self.nb, padding=[130, 20])
        self.nb.add(self.digital_inputs_tab, text='Digital Inputs')
        # create an instance of the DigitalInputs class
        # to populate and control Signal inputs
        self.digital_inputs = DigitalInputs(self.digital_inputs_tab, self)

        # create the touch tab
        self.touch_tab = Frame(self.nb, padding=10)
        self.nb.add(self.touch_tab, text='Touch Inputs')
        self.touch_inputs = TouchInputs(self.touch_tab, self)

        # create the digital outputs tab
        self.digital_outputs_tab = Frame(self.nb, padding=10)
        self.nb.add(self.digital_outputs_tab, text='Digital Outputs')
        # create an instance of the DigitalOutputs class
        # to populate and control digital outputs
        self.digital_outputs = DigitalOutputs(self.digital_outputs_tab, self)

        # create the LED digital outputs tab
        self.led_digital_outputs_tab = Frame(self.nb, padding=10)
        self.nb.add(self.led_digital_outputs_tab, text='LED Digital Outputs')
        # create an instance of the DigitalOutputs class
        # to populate and control digital outputs
        self.led_digital_outputs = LedDigitalOutputs(self.led_digital_outputs_tab, self)

        # create the pwm output tab
        self.pwm_output_tab = Frame(self.nb, padding=10)
        self.nb.add(self.pwm_output_tab, text='PWM Outputs')
        self.pwm_output = PwmOutputs(self.pwm_output_tab, self)

        # create the LED PWM output tab
        self.led_pwm_output_tab = Frame(self.nb, padding=10)
        self.nb.add(self.led_pwm_output_tab, text='LED PWM Outputs')
        self.led_pwm_output = LedPwmOutputs(self.led_pwm_output_tab, self)

        # create the dc motors tab
        self.motors_tab = Frame(self.nb, padding=10)
        self.nb.add(self.motors_tab, text='DC Motors')
        self.dc_motors = DcMotors(self.motors_tab, self)

        l = Label(self.main,
                  text='Copyright (c) 2019 Alan Yorinks All Rights Reserved.')
        l.config(font="Helvetica 8 ")
        l.grid(row=48, column=0, padx=[505, 0])

        self.main.after(5, self.get_message)

        try:
            self.main.mainloop()
        except KeyboardInterrupt:
            self.on_closing()

    def notebook_tab_selection(self):
        print(self.nb.tab(self.nb.select(), "text"))
        print(self.nb.index(self.nb.select()))

    # noinspection DuplicatedCode
    def get_message(self):
        """
        This method is called from the tkevent loop "after" method.
        It will poll for new zeromq messages within the tkinter event loop.
        """
        try:
            data = self.subscriber.recv_multipart(zmq.NOBLOCK)
            self.incoming_message_processing(data[0].decode(),
                                             msgpack.unpackb(data[1],
                                                             raw=False))
            self.main.after(1, self.get_message)

        except zmq.error.Again:
            try:
                self.main.after(1, self.get_message)
            except KeyboardInterrupt:
                self.main.destroy()
                self.publisher.close()
                self.subscriber.close()
                self.context.term()
                sys.exit(0)
        except KeyboardInterrupt:
            self.main.destroy()
            self.publisher.close()
            self.subscriber.close()
            self.context.term()
            sys.exit(0)

    def incoming_message_processing(self, topic, payload):
        """
        This method processes the incoming pin state change
        messages for GPIO pins set as inputs.

        :param topic:
        :param payload:

        Typical report: {'report': 'digital_input', 'pin': pin,
                       'value': level, 'timestamp': time.time()}
        """
        # if the pin currently input active, process the state change
        pin = payload['pin'] - 1
        value = payload['value']
        timestamp = payload['timestamp']
        report_type = payload['report']
        if report_type == 'analog_input':
            if 0 <= pin <= 3:
                self.analog_inputs.set_input_value(pin, value)
                self.analog_inputs.set_time_stamp_value(pin, timestamp)
            else:
                raise RuntimeError('analog pin out of range: ', pin)
        elif report_type == 'digital_input':
            if 0 <= pin <= 3:
                self.digital_inputs.set_input_value(pin, value)
                self.digital_inputs.set_time_stamp_value(pin, timestamp)
            else:
                raise RuntimeError('digital pin out of range')
        elif report_type == 'touch':
            if 0 <= pin <= 8:
                self.touch_inputs.set_input_value(pin, value)
                self.touch_inputs.set_time_stamp_value(pin, timestamp)
            else:
                raise RuntimeError('touch pin out of range')
        else:
            raise RuntimeError('Unknown report type: ', payload['report'])

    def on_closing(self):
        """
        Destroy the window
        """
        self.clean_up()
        self.main.destroy()
예제 #35
0
class SEMWPConfig(Frame):

    def build_classtree(self):
        for child in self.classtree.get_children(): # get rid of existing entries in class tree 
            self.classtree.delete(child)            # before building a new one
        
        def insert_subclasses(c, p):
            for sc in self.rdfschema.sub_classes(c, recurse=False):
                parent = self.classtree.insert(p, 'end',
                                               text=self.rdfschema.resource_label(sc),
                                               open=True, iid=sc,
                                               tags=('include'))
                if (self.rdfschema.sub_classes(sc, recurse=False) != []):
                    insert_subclasses(sc, parent)
                            
        for c in self.rdfschema.top_classes():
            parent = self.classtree.insert('', 'end',
                                           text=self.rdfschema.resource_label(c),
                                           open=True, iid=c,
                                           tags=('include'))
            if (self.rdfschema.sub_classes(c, recurse=False) != []):
                insert_subclasses(c, parent)
        
    def open_rdfs(self):
        self.rdfsFileName.set(askopenfilename(filetypes=[("ttl","*.ttl")]))
        self.rdfschema = SemWP(fname=self.rdfsFileName.get())
        if self.rdfschema.name is not None:
            self.rdfsName.set(self.rdfschema.name)
        else:
            self.rdfsName.set('unnamed RDF Schema')
        self.build_classtree()
        self.saverdfs_btn.config(command=self.save_rdfs, state=NORMAL)
        if self.templateFileName.get() is not '':
            self.write_btn.config(command=self.write, state=NORMAL)

    def open_template(self):
        self.templateFileName.set(askopenfilename(filetypes=[("txt","*.txt")]))
        with open(self.templateFileName.get()) as infile:
            self.template_txt.delete('1.0', END)
            self.template_txt.insert(END, infile.read())
        if self.template_txt.get('1.0') == '':
            raise Exception('%r does not seem to be a valid template'
                             % self.templateFileName.get())
        else:
            self.savetemplate_btn.config(command=self.save_template, state=NORMAL)
            if self.rdfsName.get() is not '':
                self.write_btn.config(command=self.write, state=NORMAL)

    def write(self):
        self.rdfschema.write_all_metafiles(self.template_txt.get('1.0', END))
        
    def save_template(self):
        self.templateFileName.set(asksaveasfilename(filetypes=[("txt","*.txt")]))
        with open(self.templateFileName.get(), 'w') as outfile:
            if outfile is None:
                return
            else:
                outfile.write(self.template_txt.get('1.0', END) )

    def save_rdfs(self):
        oldFileName = self.rdfsFileName.get()
        self.rdfsFileName.set(asksaveasfilename(filetypes=[("ttl","*.ttl")]))
        if self.rdfsFileName.get() is '':
            self.rdfsFileName.set(oldFileName)
            return
        else:
            self.rdfschema.g.serialize(self.rdfsFileName.get(), format='turtle')
        
    def set_property_flag(self, p:URIRef):
        include = []
        plabel = self.rdfschema.resource_label(p, lang='en')
        for key in self.propcheckboxes[plabel].vals.keys():
            if self.propcheckboxes[plabel].vals[key].get() == 1:
                include.append(key)
        self.rdfschema.set_pinclude_flags(p, include)

    def update_propertyinfo(self):
        # Display list of properties for the item currently selected in the classtree iff
        # that item is selected to have a custom post type created for it; then, 
        # create a checkbox for each property of displayed classes which determines what
        # type of metadata box is created for that property (if any).
        item = self.classtree.focus()
        itemref = URIRef(item)
        for child in self.propertiesframe.interior.winfo_children():
            child.destroy()
        showpropertyinfo = False
        for inflag in self.rdfschema.g.objects(subject=itemref, predicate=semwp_ns.include):
            if inflag == Literal('True'):    # sets showpropertyinfo if post type is to be 
                showpropertyinfo = True      # created for class
        if showpropertyinfo:
            pcount = 0             # property count, used to set grid row of checkbox
            self.propcheckboxes = dict()
            for p in self.rdfschema.properties(itemref):
                proplabel = self.rdfschema.resource_label(p, lang='en')
                heading = proplabel + '. Range includes: '
                flags=self.rdfschema.get_pinclude_flags(p)
                names=['text']
                for c in self.rdfschema.g.objects(p, schema.rangeIncludes):
                    try:
                        rangelabel = self.rdfschema.resource_label(c, lang='en')
                    except:
                        rangelabel = "missing class?" #some sort of dialog should go here
                    heading = heading +' '+ rangelabel
                    if c == schema.Text:
                        names.append('long text')
                        if flags == []:
                            self.rdfschema.set_pinclude_flags(p, incl=['text'])
                    else:
                        names.append(rangelabel)
                        if flags == []:
                            self.rdfschema.set_pinclude_flags(p, incl=[rangelabel])
                Label(self.propertiesframe.interior, text=heading, padding='3 0 0 0'
                      ).grid(row=2*pcount, column=0, columnspan=10, sticky=NW)
                Label(self.propertiesframe.interior, text='Include as:', padding='32 0 0 9'
                      ).grid(row=2*pcount+1, column=0, sticky=NW)    
                self.propcheckboxes[proplabel] = CheckbuttonGroup(
                                                    self.propertiesframe.interior, names,
                                                    command=lambda prop=p: self.set_property_flag(prop),
                                                    side=LEFT)
                self.propcheckboxes[proplabel].grid(row=2*pcount+1, column=1, sticky=NW)
                for name in self.rdfschema.get_pinclude_flags(p):
                    self.propcheckboxes[proplabel].vals[name].set(1)
                pcount += 1
                    

    def update_classinfo(self, event):
        item = self.classtree.focus()
        itemref = URIRef(item)
        self.className.set(self.rdfschema.resource_label(itemref, lang='en'))
        self.classDescrTxt.configure(state = NORMAL)
        self.classDescrTxt.delete('1.0', END)
        self.classDescrTxt.insert(END, self.rdfschema.resource_comment(itemref, lang='en'))
        self.classDescrTxt.configure(state = DISABLED)
        # the following deals with setting the includeclass flag which determines whether
        # the class if greyed out or not, setting the includeclass int variable which
        # determines the check button state, based on the include property of the class in
        # the graph. If the include property is not present for the class it is set to
        # 'include' and the flag & checkbutton set accordingly.
        count = 0
        for o in self.rdfschema.g.objects(itemref, semwp_ns.include):
            if o == Literal('False'):
                self.includeclass.set(0)
                count = 1
#                self.includeclassflag.set('was '+o.toPython())
                self.classtree.item(itemref, tags=('notinclude'))
                self.classtree.tag_configure('notinclude', foreground='gray')
            elif o == Literal('True'):
                self.includeclass.set(1)
                count = 1
#               self.includeclassflag.set('was '+o.toPython())
                self.classtree.item(itemref, tags=('include'))
                self.classtree.tag_configure('include', foreground='black')
        if count == 0:
            self.rdfschema.set_include_true(itemref)
            self.includeclass.set(1)
#            self.includeclassflag.set('count 0 set to true')
            self.classtree.item(itemref, tags=('include'))
            self.classtree.tag_configure('include', foreground='black')
        self.update_propertyinfo()   
            
    def set_classtree_include(self, i: URIRef, s: str):
        if s == 'include':
            self.classtree.item(i, tags=('include'))
            self.classtree.tag_configure('include', foreground='black')
            parent = self.classtree.parent(i)
            if parent is not '':
                self.set_classtree_include(parent, 'include')
        elif s == 'notinclude':
            self.classtree.item(i, tags=('notinclude'))
            self.classtree.tag_configure('notinclude', foreground='gray')
            for child in self.classtree.get_children(i):
                self.set_classtree_include(child, 'notinclude')
        
    def include_class(self):
        item = self.classtree.focus()
        itemref = URIRef(item)
        if self.includeclass.get() == 1:
            self.rdfschema.set_include_true(itemref)
            self.set_classtree_include(itemref, 'include')
        elif self.includeclass.get() == 0:
            self.rdfschema.set_include_false(itemref)
            self.set_classtree_include(itemref, 'notinclude')
#        for o in self.rdfschema.g.objects(itemref, semwp_ns.include):
#            self.includeclassflag.set(o.toPython())
        self.update_propertyinfo()            
        
    def create_rdfs_frame(self, master:Notebook):
        rdfsframe = Frame(master, padding = '3 3 3 3', width=600, height=400)
        Label(rdfsframe, text='RDFS Name:', padding='3 3 3 3').grid(row=0, column=0, padx=3, pady=3)
        rdfsNameLbl = Label(rdfsframe, textvariable=self.rdfsName,
                            background='#bbb', relief=SUNKEN, padding='3 0 3 3')
        rdfsNameLbl.grid(row=0, column=1, columnspan=3, sticky=EW, padx=3, pady=6)
        self.classtree.heading(column='#0', text='ClassTree')
        ysb = Scrollbar(rdfsframe, orient='vertical', command=self.classtree.yview)
        xsb = Scrollbar(rdfsframe, orient='horizontal', command=self.classtree.xview)
        self.classtree.configure(yscrollcommand=ysb.set)
        self.classtree.configure(xscrollcommand=xsb.set)
        self.classtree.bind('<<TreeviewSelect>>', self.update_classinfo)
        self.classtree.grid(row=1, column=0, columnspan=2, in_=rdfsframe, sticky=NSEW)
        self.classtree.lift(rdfsframe)
        self.classtree.tag_configure('include', foreground='black')
        self.classtree.tag_configure('notinclude', foreground='gray')
        ysb.grid(row=1, column=2, sticky=(NS))
        xsb.grid(row=2, column=0, columnspan=2, sticky=(EW))
        classinfoframe = Frame(rdfsframe, width=300, height=400)
        classinfoframe.grid(row=1, column=3, padx=3, pady=3, sticky=(NSEW))
        Label(classinfoframe, text='Class Name:',
              font='bold', padding='3 3 3 3').grid(row=1, column=0, sticky=NW)
        classNameLbl = Label(classinfoframe, textvariable=self.className,
                            background='#bbb', relief=SUNKEN, padding='3 3 3 3',
                             font='bold', width=25)
        classNameLbl.grid(row=1, column=1, sticky=EW)
        Label(classinfoframe, text='Description:',
              font='bold', padding='3 3 3 3').grid(row=2, column=0, sticky=NW)
        self.classDescrTxt.grid(row=2, column=1, in_=classinfoframe, sticky=EW)
        self.classDescrTxt.lift(classinfoframe)
        include_chk = Checkbutton(classinfoframe,
                                  text='include this class',
                                  variable=self.includeclass,
                                  command=self.include_class)
        include_chk.grid(row=3, column=1, sticky=E)
        Label(classinfoframe, text='Properties:',
              font='bold', padding='3 3 3 3').grid(row=5, column=0, sticky=NW)
        self.propertiesframe.grid(in_ = classinfoframe, row=5, column=1, sticky=(N+E+S+W))
        self.propertiesframe.lift(classinfoframe)

        classinfoframe.rowconfigure(5, weight=1)
        classinfoframe.columnconfigure(1, weight=1)
        rdfsframe.columnconfigure(1, weight=1)
        rdfsframe.columnconfigure(3, weight=3)
        rdfsframe.rowconfigure(1, weight=1)        
        master.add(rdfsframe, text='RDFS')

    def create_status_bar(self, master):
        statbar = Frame(master, padding = '3 3 3 3')
        statbar.grid(column=0, row=2, sticky=(EW, S))
        Label(statbar, text='RDFS File:', padding='0 3 0 3').grid(row=0, column=0, sticky=SE)
        rdfsFileNameLbl = Label(statbar, textvariable=self.rdfsFileName,
                                background='#bbb', relief=SUNKEN, padding='3 3 3 3')
        rdfsFileNameLbl.grid(column=1, row=0, sticky=(EW))
        Label(statbar, text='Template file:', padding='0 3 0 3').grid(row=1, column=0, sticky=SE)        
        templateFileNameLbl = Label(statbar, textvariable=self.templateFileName,
                                    background='#bbb', relief=SUNKEN, padding='3 3 3 3')
        templateFileNameLbl.grid(column=1, row=1, sticky=(EW))
        statbar.columnconfigure(1, weight=1)
        for child in statbar.winfo_children():
            child.grid_configure(padx=3, pady=3)

    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.master = master

        # the following stringvars & widgets reference values used by
        # several functions. Declared here for clarity,
        # packed in relevant frame when frame is created
        # and values set when available.
        self.rdfs_btn = Button(master, text="Open\nRDFS",
                               command=self.open_rdfs)
        self.template_btn = Button(master, text="Open\nTemplate",
                                   command=self.open_template)
        self.write_btn = Button(master, text="Write\nPHP",
                                command='', state=DISABLED)
        self.savetemplate_btn = Button(master, text="Save\nTemplate",
                                       command='', state=DISABLED)
        self.saverdfs_btn = Button(master, text="Save\nRDFS",
                                       command='', state=DISABLED)
        btnlst = [self.rdfs_btn, self.template_btn, self.savetemplate_btn, self.saverdfs_btn, self.write_btn]
        ButtonBar(master, btnlst, 3, padding='3 3 0 0'
                  ).grid(column=0,row=0, sticky=(N, W))
        self.classtree = Treeview(master)
        self.rdfsFileName = StringVar()
        self.rdfsName = StringVar()
        self.templateFileName = StringVar()
        self.className = StringVar()
        self.classDescrTxt = Text(master,
                                  background='#bbb',
                                  relief=SUNKEN, 
                                  wrap=WORD,
                                  height=4,
                                  width=60,
                                  state = DISABLED)
        self.propertiesframe = VerticalScrolledFrame(master,
                                     relief=SUNKEN)
                            # the (variable) widgets in this will have info
                            # about properties of the selected class
        self.includeclass = IntVar()
        self.includeclass.set(1)
#        self.includeclassflag = StringVar()
#        self.includepropsflags=dict()
        self.ntbk = Notebook(master, padding='6 12 6 12')
        self.create_rdfs_frame(self.ntbk)
        self.template_txt = TextPage(self.ntbk, 'Template', 
                                    background='#fff',
                                    relief=SUNKEN, 
                                    wrap = NONE,
                                    width = 40,
                                    height = 40)
        self.ntbk.grid(column=0, row=1, sticky=NSEW)
        self.master.columnconfigure(0, weight=1)
        self.master.rowconfigure(1, weight=1)
        self.create_status_bar(master)
예제 #36
0
class GuiMain:
    def __init__(self):
        """
        Main Gui Entrance
        """
        tkinter.Tk.report_callback_exception = self.throw
        # Main window
        self.destroyed = False
        LoggerGui.info("Initializing GUI")
        self.main_window = tkinter.Tk()
        self.main_window.wm_title("DRC Sim Server")
        icon = tkinter.PhotoImage(data=Resource("image/icon.gif").resource)
        self.main_window.tk.call("wm", "iconphoto", self.main_window, icon)
        self.main_window.protocol("WM_DELETE_WINDOW", self.on_closing)
        self.main_window.resizable(False, False)
        # Notebook
        self.tab_id = None
        self.notebook = Notebook(self.main_window, width=600, height=300)
        self.notebook.grid(column=0, row=0)
        self.notebook.bind("<<NotebookTabChanged>>", self.on_tab_changed)
        # Run Server Frame
        self.frame_run_server = FrameRunServer(self.notebook)
        self.notebook.add(self.frame_run_server, text="Run Server")
        # Get Key Frame
        self.frame_get_key = FrameGetKey(self.notebook)
        self.notebook.add(self.frame_get_key, text="Get Key")
        # Log Frame
        self.frame_log = FrameLog(self.notebook)
        self.notebook.add(self.frame_log, text="Log")
        # About Frame
        self.frame_about = FrameAbout(self.notebook)
        self.notebook.add(self.frame_about, text="About")

    @staticmethod
    def throw(*args):
        """
        Throw exceptions from Tkinter
        :param args: arguments
        :return: None
        """
        for arg in args:
            if isinstance(arg, Exception):
                LoggerGui.throw(arg)

    def after(self):
        """
        Empty loop to catch KeyboardInterrupt
        :return: None
        """
        self.main_window.after(1000, self.after)

    def start(self):
        """
        Start the main window loop
        :return:
        """
        LoggerGui.info("Opening GUI")
        self.after()
        self.main_window.mainloop()
        LoggerGui.info("GUI Closed")

    def stop(self):
        """
        Convenience function to call on_closing()
        :return: None
        """
        self.on_closing()

    def on_closing(self):
        """
        Close the main window and current tab
        :return: None
        """
        if self.destroyed:
            return
        self.destroyed = True
        LoggerGui.info("Closing GUI")
        if self.tab_id in self.notebook.children:
            self.notebook.children[self.tab_id].deactivate()
        try:
            self.main_window.destroy()
        except Exception as e:
            LoggerGui.exception(e)

    # noinspection PyUnusedLocal
    def on_tab_changed(self, event):
        """
        Close the previous tab and initialize a new one
        :param event: tab event
        :return: None
        """
        tab_id = self.notebook.select()
        tab_index = self.notebook.index(tab_id)
        tab_name = self.notebook.tab(tab_index, "text")
        LoggerGui.debug("Notebook tab changed to \"%s\" with id %d", tab_name,
                        tab_index)
        self.tab_id = tab_id.split(".")[len(
            tab_id.split(".")) - 1]  # Parse notebook/tab id to only tab id
        if self.notebook.children[self.tab_id].kill_other_tabs():
            for tab in self.notebook.children:
                if tab != self.tab_id:
                    self.notebook.children[tab].deactivate()
        self.notebook.children[self.tab_id].activate()
예제 #37
0
파일: main.py 프로젝트: aradkhosh/pashmak1
    Button(top, text="Edit", command=student_update).grid(row=5, column=0)
    Button(top, text="Close", command=top.destroy).grid(row=6, column=0)


root = Tk()

note = Notebook()

s_insert = Frame()
s_search = Frame()
g_insert = Frame()

note.add(s_insert, text="Insert")
note.add(s_search, text="search")
note.add(g_insert, text="GradeInsert")
note.grid(row=0, column=0)
Label(s_insert, text='name').grid(row=0, column=0)
name = StringVar()
Entry(s_insert, textvariable=name).grid(row=0, column=1)

Label(s_insert, text='family').grid(row=1, column=0)
family = StringVar()
Entry(s_insert, textvariable=family).grid(row=1, column=1)

Label(s_insert, text='B Date').grid(row=2, column=0)
birth = StringVar()
Entry(s_insert, textvariable=birth).grid(row=2, column=1)

Label(s_insert, text='N. ID').grid(row=3, column=0)
n_id = StringVar()
n_id.trace("w", length)
예제 #38
0
class Window:
    def __init__(self):
        # window
        self.window = tk.Tk()
        self.window.title('ROZLICZENIE MEDIÓW - NA STOKU')
        self.window.geometry("2585x1200")

        # frame
        self.frame_1 = Frame(self.window, width=500, height=500)
        self.frame_1.grid(row=0, column=0)
        self.frame_2 = Frame(self.window, width=500, height=500)
        self.frame_2.grid(row=1, column=0)

        # table layout
        self.tablayout = Notebook(self.frame_1)
        self.tablayout_liczniki = Notebook(self.frame_2)

        self.media()
        self.start()
        self.window.mainloop()

        # obsługa bazy danych
        # self.conn = sqlite3.connect("water.db")
        # self.cursor = self.conn.cursor()

    def media(self):
        self.woda()
        self.gaz()
        self.prad()
        self.tablayout.grid()

    def woda(self):
        # tab_WODA
        tab_woda = Frame(self.tablayout)
        tab_woda.grid()
        self.tablayout.add(tab_woda, text="WODA")

        tab_stan_licznikow = Frame(self.tablayout_liczniki)
        tab_stan_licznikow.grid()
        self.tablayout_liczniki.add(tab_stan_licznikow, text="STAN LICZNIKÓW")

        # self.stan_licznikow_woda(tab_woda)

    def prad(self):
        # tab_PRĄD
        tab_prad = Frame(self.tablayout)
        tab_prad.grid()

        for row in range(5):
            for column in range(8):
                label2 = Label(tab_prad,
                               text='Row: ' + str(row) + "Column: " +
                               str(column))
                label2.grid(row=row, column=column)

        self.tablayout.add(tab_prad, text="PRĄD")

    def gaz(self):
        # tab_GAZ
        tab_gaz = Frame(self.tablayout)
        tab_gaz.grid()

        for row in range(5):
            for column in range(6):
                label3 = Label(tab_gaz,
                               text='Row: ' + str(row) + "Column: " +
                               str(column))
                label3.grid(row=row, column=column)

        self.tablayout.add(tab_gaz, text="GAZ")

    def stan_licznikow_woda(self, tab_woda):
        connection = sqlite3.connect('water.db')
        cursor = connection.execute('select * from water')
        names = [description[0] for description in cursor.description]
        n = 0
        for name in names:
            name = tk.Label(tab_woda,
                            text=name,
                            padx=10,
                            pady=10,
                            relief='raised',
                            border='1',
                            borderwidth=1)
            name.grid(row=4, column=0 + n, padx=5)
            n += 1

    def start(self):
        database_creator.payments_database()
        database_creator.water_invoice_database()
        database_creator.water_database()