def change_key_mapping(self): def onPress(key): try: newkey = key.char except AttributeError: newkey = key.name if newkey == "esc": okVar.set(1) return if newkey == "f1": self.configure(text="NONE") okVar.set(1) return self.configure(text=newkey) okVar.set(1) def onRelease(key): listener.stop() okVar = IntVar() win = Toplevel() win.lift() win.focus_force() win.grab_set() win.grab_release() Label( win, text= "Press wanted Button or\nPress ESC to exit or\n Press F1 to set to none", ).pack() listener = keyboard.Listener(on_press=onPress, on_release=onRelease) listener.start() win.wait_variable(okVar) win.destroy()
class PopupWindow(object): """This class creates a custom pop-up window to display and edit the data in an associated Log object""" #TODO: Refactor to pass "New Mission as a parameter" #TODO: Refactor to pass "add_mission(self.app, name)" def __init__(self, app, master, text): self.app = app self.top = Toplevel(master) self.top.title("New Mission") self.top.grab_set() # freezes the app until the user enters or cancels # build the widgets self.label = ttk.Label(self.top, text=text, background='white') self.label.pack() self.e = ttk.Entry(self.top) self.e.pack() self.b = ttk.Button(self.top, text='Ok', command=self._cleanup) self.b.pack() #end init def _cleanup(self): """Clean up the window we created""" name = self.e.get() add_mission(self.app, name) self.top.grab_release() # HAVE TO RELEASE self.top.destroy()
class SetupPopUp: """A TopLevel popup that will lock the main App and allow users to set up the required environmental paths to the SDSS data before unlocking the App again. Without those paths the createjobs module will likely not be able to create jobs. """ def __init__(self, parent): self.top = Toplevel(parent) self.top.wm_title("Envionment not set up properly!") txt = ( "Environment is missing BOSS and/or PHOTO_REDUX env variables.\n" "Please provide the PHOTO_REDUX path. See" "help(createjobs.setup.) for details.") self.explainLabel = ttk.Label(self.top, text=txt) self.explainLabel.pack() self.photoreduxSV = StringVar() self.pathEntry = ttk.Entry(self.top) self.pathEntry.pack(padx=5) self.okButton = ttk.Button(self.top, text="OK", command=self.ok) self.okButton.pack(pady=5) self.top.grab_set() def ok(self): """A callback function that will call the createjobs setup function, unlock the main app and destroy the popup. """ cj.setup(self.photoreduxSV.get()) self.top.grab_release() self.top.destroy()
class ModalWindow(): def __init__(self, tab): self.toplevel = Toplevel(tab.tk) self.toplevel.transient(tab.tk) self.toplevel.withdraw() self.toplevel.grab_release() self.toplevel.protocol('WM_DELETE_WINDOW', self.hide) def show(self): self.centering() self.toplevel.deiconify() self.toplevel.tkraise() self.toplevel.grab_set() self.toplevel.focus_set() def hide(self): self.toplevel.grab_release() self.toplevel.withdraw() def centering(self): sw = self.toplevel.winfo_screenwidth() rw = self.toplevel.winfo_reqwidth() x = (sw - rw) // 2 sw = self.toplevel.winfo_screenheight() rw = self.toplevel.winfo_reqheight() y = (sw - rw) // 2 self.toplevel.wm_geometry('+%i+%i' % (x, y))
class ToplevelVidget(object): """ ToplevelVidget contains a Toplevel widget. """ def __init__( self, close_handler=None, master=None, ): """ Initialize object. @param close_handler: Window close button event handler. @param master: Master widget. @return: None. """ # Create toplevel widget self._toplevel = Toplevel(master=master) # Hide the toplevel widget self._toplevel.withdraw() # Window close button event handler self._close_handler = close_handler \ if close_handler is not None else self._close_handler_default # Register window close button event handler self._toplevel.protocol('WM_DELETE_WINDOW', self._close_handler) def toplevel(self): """ Get the toplevel widget. @return: toplevel widget. """ return self._toplevel def __getattr__(self, name): """ Delegate attribute lookup to the toplevel widget. @return: Attribute value, or raise AttributeError. """ return getattr(self._toplevel, name) def _close_handler_default(self): """ Default window close button event handler. @return: None. """ # Hide the toplevel widget self._toplevel.withdraw() # Release grab on the toplevel widget self._toplevel.grab_release()
class ProgressWindow: def __init__(self, parent, msg): self.parent = parent self.msg = msg self.window = None def start(self): self.window = Toplevel(self.parent.window) self.window.protocol('WM_DELETE_WINDOW', do_nothing) bar = Progressbar(self.window, orient=tk.HORIZONTAL, length=200, mode='indeterminate') label = Label(self.window, text=self.msg) self.window.title('Proszę czekać') self.window.geometry('300x50') #self.window.lift(aboveThis=self.parent.window) self.window.attributes("-topmost", True) label.pack(side=tk.TOP) bar.pack(side=tk.TOP) bar.start(10) self.window.grab_set() def destroy(self): self.window.grab_release() self.window.destroy()
def test_chuc_nang_tach_tu(self, event): top_level = Toplevel(self.root) tach_tu = TestTachTu(top_level, self.disk_db, self.memory_db) tach_tu.pack() top_level.grab_set() top_level.wait_window() top_level.grab_release()
def test_dan_nhan_thuc_the(self, event): top_level = Toplevel(self.root) dan_nhan_thuc_the = DanNhanThucThe(top_level, self.disk_db, self.memory_db) dan_nhan_thuc_the.pack() top_level.grab_set() top_level.wait_window() top_level.grab_release()
class AddWriteWindow: def __init__(self, parent, model): self.buf_type = tk.IntVar() self.model = model self.parent = parent self.window = Toplevel(parent.window) self.window.title('Dodaj test write') self.window.geometry('300x320') self.window.columnconfigure(2, weight=1) self.window.rowconfigure(4, weight=1) Label(self.window, text='Parametr count').grid(sticky=tk.NW) self.count_entry = Entry(self.window) self.count_entry.grid(row=0, column=1, sticky=tk.NW) Radiobutton(self.window, text='Bufor znakowy', variable=self.buf_type, value=0).grid(row=2, column=0, sticky=tk.NW) Radiobutton(self.window, text='Bufor bajtów (hex)', variable=self.buf_type, value=1).grid(row=2, column=1, sticky=tk.NW) Label(self.window, text='Zawartość bufora').grid(row=3, sticky=tk.NW) self.buffer_entry = Text(self.window, width=36, height=12) self.buffer_entry.grid(row=4, columnspan=3, sticky=tk.NW + tk.E + tk.S, padx=5) Button(self.window, text='Dodaj', command=self.add_case).grid(row=5, columnspan=2) self.window.transient(master=parent.window) self.window.grab_set() def add_case(self): text = self.buffer_entry.get("1.0", tk.END).strip() try: if self.buf_type.get() == 0: self.model.corpus.add_case( struct.pack('Q{}s'.format(len(text.encode())), int(self.count_entry.get()), text.encode()), 'write') else: print(str(text)) buf_bytes = bytes.fromhex(str(text)) print(buf_bytes) self.model.corpus.add_case( struct.pack('Q{}s'.format(len(buf_bytes)), int(self.count_entry.get()), buf_bytes), 'write') self.destroy() except ValueError: messagebox.showinfo("Błąd", "Podano złą wartość argumentu") def destroy(self): self.window.grab_release() self.window.destroy()
class SelectionY: def __init__(self, master, data): self.master = master self.data = data self.columns = self.data.columns self.variable = IntVar() self.window = Toplevel(self.master) self.window.grab_set() self.window.title('Dependent Variables') self.window.geometry('400x400') self.window.minsize(250, 250) self.frame = Frame(self.window) self.frame.pack(expand=True, fill=BOTH) self.canvas = Canvas(self.frame, background='antique white') self.v_scroll = Scrollbar(self.frame, orient=VERTICAL, command=self.canvas.yview) self.v_scroll.pack(side=RIGHT, fill=Y) self.canvas['yscrollcommand'] = self.v_scroll.set self.canvas.pack(expand=True, fill=BOTH) self.frame2 = Frame(self.canvas, bg='antique white') self.canvas.create_window((0, 0), window=self.frame2, anchor=N + W) for i in range(len(self.columns)): Radiobutton(self.frame2, variable=self.variable, value=i, text=self.columns[i], bg='antique white').pack(anchor=N + W) self.none = Button(self.canvas, text='Confirm', height=2, width=10, command=lambda: self.confirm()) self.none.pack(anchor=E, padx=20, pady=20) self.canvas.configure(scrollregion=self.canvas.bbox(ALL)) self.window.mainloop() def confirm(self): self.window.grab_release() self.window.quit() self.window.destroy()
class DriversWindow: def __init__(self, parent, model): self.model = model self.parent = parent self.window = Toplevel(parent.window) self.window.title('Lista sterowników') self.window.geometry('600x400') self.window.rowconfigure(0, weight=1) self.window.columnconfigure(0, weight=1) self.x_scroll = Scrollbar(self.window, orient=tk.HORIZONTAL) self.y_scroll = Scrollbar(self.window, orient=tk.VERTICAL) self.x_scroll.grid(row=1, column=0, columnspan=2, sticky=tk.E + tk.W) self.y_scroll.grid(row=0, column=2, sticky=tk.N + tk.S) self.listbox = Listbox(self.window, xscrollcommand=self.x_scroll.set, yscrollcommand=self.y_scroll.set) self.x_scroll['command'] = self.listbox.xview self.y_scroll['command'] = self.listbox.yview threading.Thread(target=self.populate_list).start() self.prog_window = ProgressWindow(self, 'Trwa szukanie sterowników') self.prog_window.start() self.listbox.grid(row=0, column=0, sticky=tk.N + tk.E + tk.S + tk.W, columnspan=2) Button(self.window, text='Wybierz', command=self.pick_dev).grid(row=2, sticky=tk.NE, padx=10) Button(self.window, text='Anuluj', command=self.destroy).grid(row=2, column=1, sticky=tk.NW, padx=10) self.window.transient(master=parent.window) def pick_dev(self): self.model.project.devpath = self.listbox.get( self.listbox.curselection()).split()[-1] self.parent.refresh_driver() self.destroy() def populate_list(self): dev_list = self.model.list_dev_paths() for d in dev_list: if d is not '': self.listbox.insert(tk.END, d) self.prog_window.destroy() self.window.grab_set() def destroy(self): self.window.grab_release() self.window.destroy()
class AddMmapWindow: def __init__(self, parent, model): self.model = model self.parent = parent self.window = Toplevel(parent.window) self.window.title('Lista sterowników') self.window.geometry('600x400') Button(self.window, text='Dodaj', command=self.add_case).grid() self.window.transient(master=parent.window) self.window.grab_set() def add_case(self): pass def destroy(self): self.window.grab_release() self.window.destroy()
def change_word_ne(self): try: values = re.compile(r'(\-)(?!.*\-)').split(self.table_select) top_level = Toplevel(self.root) question_box = ChangeNeWindow(top_level, values[0], values[2], self.memory_db) question_box.pack() top_level.grab_set() top_level.wait_window() top_level.grab_release() self.update_table() self.hightlight_text() except AttributeError: messagebox.showerror(parent=self.root, title='Chưa có từ nào được chọn', message='Xin hãy chọn từ cần được sửa')
class MutatorWindow: def __init__(self, parent, model): self.model = model self.parent = parent self.window = Toplevel(parent.window) self.mutations = self.model.get_mutations() self.window.title('Mutator') self.window.geometry('600x400') self.window.transient(master=parent.window) self.window.grab_set() Label(self.window, text='Wybrane mutacje').grid(sticky=tk.NW) for i in range(0, len(self.mutations)): Checkbutton(self.window, text=self.mutations[i][0], variable=self.mutations[i][1]).grid(row=i + 1, sticky=tk.NW) def destroy(self): self.window.grab_release() self.window.destroy()
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()
def _autocomplete(self, event): if not self._autocomplete_list or len(self._autocomplete_list) == 0: return index = self._tk.index(INSERT).split(".") self._text_index = '.'.join(index) tw = Toplevel(self._tk) tw.wm_overrideredirect(True) font = self._get_font() font_size = int(font.cget("size")) tw.geometry( f"+{ self._tk.winfo_rootx() + int(index[1]) * int(font_size / 2) }+{ self._tk.winfo_rooty() + int(index[0]) * font_size }" ) self._listbox = AutocompleteEntryListbox( tw, font=font, allow_other_values=False, completevalues=[v["name"] for v in self._autocomplete_list]) self._listbox.pack() tw.lift() tw.focus_force() tw.grab_set() tw.grab_release() self._listbox.focus_force() self._listbox.listbox.bind("<Double-Button-1>", self._autocomplete_selected) self._listbox.entry.bind("<Return>", self._autocomplete_selected) self._listbox.bind("<Leave>", self._autocomplete_destroy) self._listbox.bind("<Escape>", self._autocomplete_destroy) self._autocomplete_window = tw
class WindowHome: def __init__(self, connection): # # Configuration of the window self.connection = connection self.role = 1 self.window = Tk() self.window.protocol("WM_DELETE_WINDOW", self.click_log_out) #w, h = self.window.winfo_screenwidth(), self.window.winfo_screenheight() # self.window.geometry('%dx%d+0+0' % (1024, 778)) # self.window.geometry('%dx%d+0+0' % (1500, 778)) # self.window.geometry('%dx%d+0+0' % (w, h)) # Place window on top left corner self.window.geometry('+%d+%d' % (0, 0)) #self.window.resizable(0, 0) self.window.title('Tool for experimenting') self.window.withdraw() self.create_login() self.show_login() def create_login(self): # Resources for the Forms style = Style() style.configure("TButton", font=SUBTITLE2_FONT) self.tlevel_login = Toplevel(self.window) self.tlevel_login.protocol("WM_DELETE_WINDOW", self.click_log_out) self.tlevel_login.withdraw() frm_parent = LabelFrame(self.tlevel_login) lbl_title = Label(frm_parent, text='Welcome') lbl_title.config(fg=TEXT_COLOR, font=TITLE_FONT) lbl_title.grid(row=0, column=0, columnspan=3, pady=15, sticky=EW) lbl_role = Label(frm_parent, text='Role') lbl_role.config(fg=TEXT_COLOR, font=SUBTITLE2_FONT) lbl_role.grid(row=1, column=0, pady=10, padx=30, sticky=NW) lbl_username = Label(frm_parent, text='E-mail') lbl_username.config(fg=TEXT_COLOR, font=SUBTITLE2_FONT) lbl_username.grid(row=2, column=0, pady=10, padx=30, sticky=NW) lbl_passwd = Label(frm_parent, text='Password') lbl_passwd.config(fg=TEXT_COLOR, font=SUBTITLE2_FONT) lbl_passwd.grid(row=3, column=0, pady=10, padx=30, sticky=NW) self.cbx_role = Combobox(frm_parent, state="readonly", width=25) self.cbx_role['values'] = ['Administrator', 'Experimenter', 'Designer'] self.cbx_role.grid(row=1, column=1, pady=10, padx=30, columnspan=2, sticky=NW) self.txt_email = Entry(frm_parent, width=28) self.txt_email.grid(row=2, column=1, pady=10, padx=30, columnspan=2, sticky=NW) self.txt_passwd = Entry(frm_parent, width=28, show="*") self.txt_passwd.grid(row=3, column=1, pady=10, padx=30, columnspan=2, sticky=NW) self.txt_passwd.bind('<Return>', self.click_login) btn_access = Button(frm_parent, text='Login', command=self.click_login, font=SUBTITLE2_FONT, fg=TEXT_COLOR) btn_access.grid(row=4, column=1, padx=30, pady=15) btn_exit = Button(frm_parent, text='Exit', command=self.click_log_out, font=SUBTITLE2_FONT, fg=TEXT_COLOR) btn_exit.grid(row=4, column=2, padx=30, pady=15) frm_parent.grid(padx=10, pady=10) def show_login(self): self.tlevel_login.title('System access') self.tlevel_login.deiconify() self.tlevel_login.grab_set() def click_login(self, event=None): if len(self.txt_email.get()) != 0 and len( self.txt_passwd.get()) != 0 and len(self.cbx_role.get( )) != 0: # validate empty fileds in login form if self.cbx_role.get( ) == 'Experimenter': # directive (action) changes in accordance of the role self.role = 1 self.directive = Message( action=20, information=[self.txt_email.get(), 'login']) elif self.cbx_role.get() == 'Designer': self.role = 2 self.directive = Message( action=25, information=[self.txt_email.get(), 'login']) elif self.cbx_role.get() == 'Administrator': self.role = 3 self.directive = Message( action=15, information=[self.txt_email.get(), 'login']) self.connection = self.directive.send_directive(self.connection) if self.connection.message.action == 5: # The user does not exist messagebox.showerror( parent=self.tlevel_login, title='E-mail', message=self.connection.message.information[0]) else: # block to validate the inserted password if self.connection.message.information[4] == hashlib.sha1( self.txt_passwd.get().encode()).hexdigest(): if self.role == 2: self.current_designer = Designer( id=self.connection.message.information[0], name=self.connection.message.information[1], surname=self.connection.message.information[2], user=self.connection.message.information[3], password=self.connection.message.information[4], connection=self.connection) self.access_system() else: messagebox.showerror( parent=self.tlevel_login, title='Password', message='The password you provided is wrong, retry') else: messagebox.showwarning(parent=self.tlevel_login, title='Missing information', message='Fill all the fields') def access_system(self): # Components (tool bar) will be shown depending on the role of the user menu_bar = Menu(self.window) self.window.config(menu=menu_bar) if self.role == 1: # logged as experimenter administration_menu = Menu(menu_bar, tearoff=0) administration_menu.add_command(label='Designers', command=self.click_designers) patterns_menu = Menu(administration_menu, tearoff=0) patt_structure_menu = Menu(patterns_menu, tearoff=0) patt_structure_menu.add_command(label='Classifications', command=self.click_class) patt_structure_menu.add_command(label='Sections', command=self.click_sections) patt_structure_menu.add_command(label='Templates', command=self.click_templates) patterns_menu.add_cascade(label='Pattern structure', menu=patt_structure_menu) patterns_menu.add_command(label='Patterns', command=self.click_patterns) administration_menu.add_cascade(label='Patterns', menu=patterns_menu) menu_bar.add_cascade(label='Administration', menu=administration_menu) menu_bar.add_command(label='Experiments', command=self.click_experiments) menu_bar.add_command(label='Reports', command=self.click_reports) # Configuration of the existing frames, one for each command in the menu bar self.frm_parent_designer = FormParentAED(self.window, 'Designer', connection) self.frm_parent_template = FormParentTemplate( self.window, connection) self.frm_parent_class = FormParentClassification( self.window, connection) self.frm_parent_section = FormParentSection( self.window, connection) self.frm_parent_pattern = FormParentPattern( self.window, connection) self.frm_parent_experiment = FormParentExperiment( self.window, connection) self.frm_parent_report = FormParentReport(self.window, connection) elif self.role == 2: # logged as designer self.frm_parent_designer_gui = FormParentDesigner( self.window, connection, self.current_designer) self.click_designer_gui() elif self.role == 3: # logged as administrator administration_menu = Menu(menu_bar, tearoff=0) users_menu = Menu(administration_menu, tearoff=0) users_menu.add_command(label='Administrators', command=self.click_administrators) users_menu.add_command(label='Experimenters', command=self.click_experimenters) users_menu.add_command(label='Designers', command=self.click_designers) administration_menu.add_cascade(label='Users', menu=users_menu) patterns_menu = Menu(administration_menu, tearoff=0) patt_structure_menu = Menu(patterns_menu, tearoff=0) patt_structure_menu.add_command(label='Classifications', command=self.click_class) patt_structure_menu.add_command(label='Sections', command=self.click_sections) patt_structure_menu.add_command(label='Templates', command=self.click_templates) patterns_menu.add_cascade(label='Pattern structure', menu=patt_structure_menu) patterns_menu.add_command(label='Patterns', command=self.click_patterns) administration_menu.add_cascade(label='Patterns', menu=patterns_menu) menu_bar.add_cascade(label='Administration', menu=administration_menu) menu_bar.add_command(label='Experiments', command=self.click_experiments) menu_bar.add_command(label='Reports', command=self.click_reports) # Configuration of the existing frames, one for each command in the menu bar self.frm_parent_administrator = FormParentAED( self.window, 'Administrator', connection) self.frm_parent_experimenter = FormParentAED( self.window, 'Experimenter', connection) self.frm_parent_designer = FormParentAED(self.window, 'Designer', connection) self.frm_parent_template = FormParentTemplate( self.window, connection) self.frm_parent_class = FormParentClassification( self.window, connection) self.frm_parent_section = FormParentSection( self.window, connection) self.frm_parent_pattern = FormParentPattern( self.window, connection) self.frm_parent_experiment = FormParentExperiment( self.window, connection) self.frm_parent_report = FormParentReport(self.window, connection) else: raise Exception('Error while trying login the system') menu_bar.add_command(label='Log out', command=self.click_log_out) self.tlevel_login.grab_release() self.tlevel_login.withdraw() self.window.deiconify() def click_experimenters(self): self.frm_parent_designer.hide_frm() self.frm_parent_administrator.hide_frm() self.frm_parent_template.hide_frm() self.frm_parent_section.hide_frm() self.frm_parent_pattern.hide_frm() self.frm_parent_class.hide_frm() self.frm_parent_experiment.hide_frm() self.frm_parent_report.hide_frm() self.frm_parent_experimenter.hide_frm() self.frm_parent_experimenter.show_frm() def click_designers(self): if self.role == 3: self.frm_parent_administrator.hide_frm() self.frm_parent_experimenter.hide_frm() self.frm_parent_template.hide_frm() self.frm_parent_section.hide_frm() self.frm_parent_pattern.hide_frm() self.frm_parent_class.hide_frm() self.frm_parent_experiment.hide_frm() self.frm_parent_report.hide_frm() self.frm_parent_designer.hide_frm() self.frm_parent_designer.show_frm() def click_administrators(self): self.frm_parent_experimenter.hide_frm() self.frm_parent_designer.hide_frm() self.frm_parent_template.hide_frm() self.frm_parent_section.hide_frm() self.frm_parent_pattern.hide_frm() self.frm_parent_class.hide_frm() self.frm_parent_experiment.hide_frm() self.frm_parent_report.hide_frm() self.frm_parent_administrator.hide_frm() self.frm_parent_administrator.show_frm() def click_templates(self): if self.role == 3: self.frm_parent_administrator.hide_frm() self.frm_parent_experimenter.hide_frm() self.frm_parent_designer.hide_frm() self.frm_parent_section.hide_frm() self.frm_parent_pattern.hide_frm() self.frm_parent_class.hide_frm() self.frm_parent_experiment.hide_frm() self.frm_parent_report.hide_frm() self.frm_parent_template.hide_frm() self.frm_parent_template.show_frm() def click_sections(self): if self.role == 3: self.frm_parent_administrator.hide_frm() self.frm_parent_experimenter.hide_frm() self.frm_parent_designer.hide_frm() self.frm_parent_template.hide_frm() self.frm_parent_pattern.hide_frm() self.frm_parent_class.hide_frm() self.frm_parent_experiment.hide_frm() self.frm_parent_report.hide_frm() self.frm_parent_section.hide_frm() self.frm_parent_section.show_frm() def click_class(self): if self.role == 3: self.frm_parent_administrator.hide_frm() self.frm_parent_experimenter.hide_frm() self.frm_parent_designer.hide_frm() self.frm_parent_template.hide_frm() self.frm_parent_pattern.hide_frm() self.frm_parent_section.hide_frm() self.frm_parent_experiment.hide_frm() self.frm_parent_report.hide_frm() self.frm_parent_class.hide_frm() self.frm_parent_class.show_frm() def click_patterns(self): if self.role == 3: self.frm_parent_administrator.hide_frm() self.frm_parent_experimenter.hide_frm() self.frm_parent_designer.hide_frm() self.frm_parent_template.hide_frm() self.frm_parent_section.hide_frm() self.frm_parent_class.hide_frm() self.frm_parent_experiment.hide_frm() self.frm_parent_report.hide_frm() self.frm_parent_pattern.hide_frm() self.frm_parent_pattern.show_frm() def click_experiments(self): if self.role == 3: self.frm_parent_administrator.hide_frm() self.frm_parent_experimenter.hide_frm() self.frm_parent_designer.hide_frm() self.frm_parent_template.hide_frm() self.frm_parent_section.hide_frm() self.frm_parent_pattern.hide_frm() self.frm_parent_class.hide_frm() self.frm_parent_report.hide_frm() self.frm_parent_experiment.hide_frm() self.frm_parent_experiment.show_frm() def click_reports(self): if self.role == 3: self.frm_parent_administrator.hide_frm() self.frm_parent_experimenter.hide_frm() self.frm_parent_designer.hide_frm() self.frm_parent_template.hide_frm() self.frm_parent_section.hide_frm() self.frm_parent_pattern.hide_frm() self.frm_parent_class.hide_frm() self.frm_parent_experiment.hide_frm() self.frm_parent_report.hide_frm() self.frm_parent_report.show_frm() def click_designer_gui(self): self.frm_parent_designer_gui.hide_frm() self.frm_parent_designer_gui.show_frm() def click_log_out(self): if self.role != 2: self.exit() else: # Cant log out if designer is running an experimental scenario try: if not self.frm_parent_designer_gui.frm_general.grid_info(): self.exit() else: decision = messagebox.askyesno( parent=self.window, title='Confirm exit', message= 'Are you sure you want to leave? Exiting may cause loss of ' 'experiment data. You won\'t be able to execute this ' 'experiment again') if decision: # Confirm decision of exiting during an experiment execution # Measurements may be saved as null self.frm_parent_designer_gui.time_thread.stop() acquisition_end_date = datetime.now() # Saving NULL values of measurements for designer in remaining problems while True: problem_id = self.frm_parent_designer_gui.experimental_scenario.problems[ self.frm_parent_designer_gui. problems_counter].id current_measurements = [] # Solution time measurement_1 = Measurement( value=float(-2), id_metric=1, acquisition_start_date=acquisition_end_date, acquisition_end_date=acquisition_end_date, id_designer=self.current_designer.id, id_problem=problem_id) current_measurements.append(measurement_1) if self.frm_parent_designer_gui.pattern_decision: # Selection time measurement_2 = Measurement( value=float(-2), id_metric=2, acquisition_start_date=acquisition_end_date, acquisition_end_date=acquisition_end_date, id_designer=self.current_designer.id, id_problem=problem_id) current_measurements.append(measurement_2) # Viewed patterns measurement_3 = Measurement( value=float(-2), id_metric=3, acquisition_start_date=acquisition_end_date, acquisition_end_date=acquisition_end_date, id_designer=self.current_designer.id, id_problem=problem_id) current_measurements.append(measurement_3) # Chosen patterns measurement_4 = Measurement( value=float(-2), id_metric=4, acquisition_start_date=acquisition_end_date, acquisition_end_date=acquisition_end_date, id_designer=self.current_designer.id, id_problem=problem_id) current_measurements.append(measurement_4) for item in current_measurements: self.directive = Message( action=96, information=[ item.value, item.acquisition_start_date, item.acquisition_end_date, item.id_metric, item.id_designer, item.id_problem ]) self.connection = self.directive.send_directive( self.connection) self.frm_parent_designer_gui.problems_counter += 1 if self.frm_parent_designer_gui.problems_counter == len( self.frm_parent_designer_gui. experimental_scenario.problems ): # If no more problems available # Finish experimental scenario if this was the las designer executing it self.directive = Message(action=83, information=['finished', self.frm_parent_designer_gui. \ experimental_scenario.id]) self.connection = self.directive.send_directive( self.connection) break self.exit() except: self.exit() def exit(self): msg = Message(comment='close_connection') self.connection.create_message(msg) self.connection.send_message() self.connection.close_connection() shutil.rmtree('./Resources/temp/') os.mkdir('./Resources/temp/') self.window.destroy()
class AddIoctlWindow: types = ['ciąg bajtów (hex)', 'ciąg znaków', 'int (2 bajty)', 'int (4 bajty)', 'int (8 bajtów)', 'float (4 bajty)', 'double (8 bajtów)'] def __init__(self, parent, model): self.args = [] self.format = '' self.model = model self.parent = parent self.window = Toplevel(parent.window) self.window.title('Dodaj test ioctl') self.window.geometry('375x320') self.type = tk.StringVar() Label(self.window, text='Kod metody ioctl').grid(row=0, column=0, sticky=tk.NW) self.cmd_code_entry = Entry(self.window) self.cmd_code_entry.grid(column=1, row=0, sticky=tk.NW) Label(self.window, text='Dodaj argument').grid(row=2, sticky=tk.NW) Label(self.window, text='Typ').grid(row=3, sticky=tk.NW) Button(self.window, text='Dodaj', command=self.add_argument).grid(row=3, column=2, rowspan=2) self.combobox = Combobox(self.window, textvariable=self.type, values=self.types) self.arg_entry = Entry(self.window) self.combobox.grid(row=3, column=1, sticky=tk.NW) Label(self.window, text='Wartość').grid(row=4, sticky=tk.NW) self.arg_entry.grid(row=4, column=1, sticky=tk.NW) Label(self.window, text='Przypadek testowy').grid(row=5, sticky=tk.NW) self.args_text = Text(self.window, width=36, wrap=tk.CHAR, height=10) self.args_text.grid(row=6, columnspan=5, sticky=tk.NW+tk.S+tk.E) Button(self.window, text='Dodaj', command=self.add_case).grid(row=7, column=2) self.window.transient(master=parent.window) self.window.grab_set() def add_argument(self): idx = -1 type = str(self.type.get()) for i in range(0, len(self.types)): if self.types[i] == type: idx = i if idx == -1: messagebox.showinfo("Błąd", "Brak podanego typu argumentu") try: if idx == 0: self.format += '{}s'.format(int(len(self.arg_entry.get())/2)) self.args.append(bytes.fromhex(str(self.arg_entry.get()))) self.args_text.insert(tk.END, '#') elif idx == 1: self.format += '{}s'.format(len(self.arg_entry.get())) self.args.append(str(self.arg_entry.get()).encode()) elif idx == 2: self.format += 'h' self.args.append(int(self.arg_entry.get())) elif idx == 3: self.format += 'i' self.args.append(int(self.arg_entry.get())) elif idx == 4: self.format += 'q' self.args.append(int(self.arg_entry.get())) elif idx == 5: self.format += 'f' self.args.append(float(self.arg_entry.get())) elif idx == 6: self.format += 'd' self.args.append(float(self.arg_entry.get())) else: return except ValueError: messagebox.showinfo("Błąd", "Podano złą wartość argumentu") self.args_text.insert(tk.END, '{}\n'.format(self.arg_entry.get())) self.arg_entry.config(text='') def destroy(self): self.window.grab_release() self.window.destroy() def add_case(self): print('Format: q{}'.format(self.format)) if self.cmd_code_entry.get() == '': messagebox.showinfo("Błąd", "Podaj kod metody") return try: code = int(self.cmd_code_entry.get()) data = struct.pack('q{}'.format(self.format), code, *self.args) self.model.corpus.add_case(data, 'ioctl') self.parent.log('Dodano test ioctl\n') self.destroy() except ValueError: messagebox.showinfo("Błąd", "Wartość kodu metody musi być liczbą!") return
class FormChildReport: def __init__(self, frm_parent, connection): self.connection = connection self.id_selected = 0 self.frm_child_report = LabelFrame(frm_parent) self.tlevel_comp_detail = Toplevel(frm_parent) self.tlevel_comp_detail.protocol("WM_DELETE_WINDOW", self.click_exit_component_det) self.tlevel_comp_detail.withdraw() self.tlevel_sol_detail = Toplevel(frm_parent) self.tlevel_sol_detail.protocol("WM_DELETE_WINDOW", self.click_exit_solution_det) self.tlevel_sol_detail.withdraw() self.tlevel_diagram = Toplevel(self.tlevel_sol_detail) self.tlevel_diagram.protocol("WM_DELETE_WINDOW", self.click_exit_diagram) self.tlevel_diagram.withdraw() self.initialize_components() def initialize_components(self): """ Method that initialize the visual components for each form associated with the configuration of experiments """ # Button icons used in the forms self.csv_icon = PhotoImage(file=r"./Resources/csv.png") self.info_icon = PhotoImage(file=r"./Resources/info.png") # Components for Report form (list of experiments) # General selection section lbl_sep1 = Label(self.frm_child_report) lbl_sep1.grid(row=0, column=0, padx=10, pady=10, rowspan=7) lbl_available_exp = Label(self.frm_child_report, text='Select an experiment', anchor=W) lbl_available_exp.config(fg=TEXT_COLOR, font=SUBTITLE2_FONT) lbl_available_exp.grid(row=0, column=1, pady=10, sticky=W) self.trv_available_exp = Treeview(self.frm_child_report, height=5, columns=('N', 'Experiment')) self.trv_available_exp.heading('#0', text='ID', anchor=CENTER) self.trv_available_exp.heading('#1', text='N', anchor=CENTER) self.trv_available_exp.heading('#2', text='Experiment', anchor=CENTER) self.trv_available_exp.column('#0', width=0, minwidth=50, stretch=NO) self.trv_available_exp.column('#1', width=20, minwidth=20, stretch=NO) self.trv_available_exp.column('#2', width=250, minwidth=250, stretch=NO) self.trv_available_exp.bind("<ButtonRelease-1>", self.select_experiment_general) self.trv_available_exp.grid(row=1, column=1, columnspan=3, sticky=W, pady=10) vsb_trv_avex = Scrollbar(self.frm_child_report, orient="vertical", command=self.trv_available_exp.yview) vsb_trv_avex.grid(row=1, column=4, pady=10, sticky=NS) self.trv_available_exp.configure(yscrollcommand=vsb_trv_avex.set) btn_detail_exp = Button(self.frm_child_report, image=self.info_icon, command=self.click_view_experiment) btn_detail_exp.grid(row=0, column=3, pady=10, padx=5, sticky=E) btn_detail_exp_ttp = CreateToolTip(btn_detail_exp, 'View experiment information') btn_csv = Button(self.frm_child_report, image=self.csv_icon, command=self.click_csv) btn_csv.grid(row=0, column=2, pady=10, sticky=E) btn_csv_ttp = CreateToolTip(btn_csv, 'Generate .csv file') lbl_available_sc = Label(self.frm_child_report, text='Select a scenario', anchor=W) lbl_available_sc.config(font=SUBTITLE2_FONT, fg=TEXT_COLOR) lbl_available_sc.grid(row=2, column=1, pady=10, columnspan=2, sticky=W) self.trv_available_sc = Treeview(self.frm_child_report, height=5, columns=('N', 'Experimental scenario')) self.trv_available_sc.heading('#0', text='ID', anchor=CENTER) self.trv_available_sc.heading('#1', text='N', anchor=CENTER) self.trv_available_sc.heading('#2', text='Experimental scenario', anchor=CENTER) self.trv_available_sc.column('#0', width=0, minwidth=50, stretch=NO) self.trv_available_sc.column('#1', width=20, minwidth=20, stretch=NO) self.trv_available_sc.column('#2', width=250, minwidth=250, stretch=NO) self.trv_available_sc.bind("<ButtonRelease-1>", self.select_scenario_general) self.trv_available_sc.grid(row=3, column=1, columnspan=3, sticky=W, pady=10) vsb_trv_avsc = Scrollbar(self.frm_child_report, orient="vertical", command=self.trv_available_sc.yview) vsb_trv_avsc.grid(row=3, column=4, pady=10, sticky=NS) self.trv_available_sc.configure(yscrollcommand=vsb_trv_avsc.set) btn_detail_sc = Button(self.frm_child_report, image=self.info_icon, command=self.click_view_scenario) btn_detail_sc.grid(row=2, column=3, pady=10, sticky=E) btn_detail_sc_ttp = CreateToolTip(btn_detail_sc, 'View scenario information') lbl_available_prob = Label(self.frm_child_report, text='Select a problem', anchor=W) lbl_available_prob.config(font=SUBTITLE2_FONT, fg=TEXT_COLOR) lbl_available_prob.grid(row=4, column=1, pady=10, columnspan=2, sticky=W) self.trv_available_prob = Treeview(self.frm_child_report, height=5, columns=('N', 'Design problem')) self.trv_available_prob.heading('#0', text='ID', anchor=CENTER) self.trv_available_prob.heading('#1', text='N', anchor=CENTER) self.trv_available_prob.heading('#2', text='Design problem', anchor=CENTER) self.trv_available_prob.column('#0', width=0, minwidth=50, stretch=NO) self.trv_available_prob.column('#1', width=20, minwidth=20, stretch=NO) self.trv_available_prob.column('#2', width=250, minwidth=250, stretch=NO) self.trv_available_prob.bind("<ButtonRelease-1>", self.select_problem_general) self.trv_available_prob.grid(row=5, column=1, columnspan=3, sticky=W, pady=10) vsb_trv_avprob = Scrollbar(self.frm_child_report, orient="vertical", command=self.trv_available_prob.yview) vsb_trv_avprob.grid(row=5, column=4, pady=10, sticky=NS) self.trv_available_prob.configure(yscrollcommand=vsb_trv_avprob.set) btn_detail_prob = Button(self.frm_child_report, image=self.info_icon, command=self.click_view_problem) btn_detail_prob.grid(row=4, column=3, pady=10, sticky=E) btn_detail_prob_ttp = CreateToolTip(btn_detail_prob, 'View problem report') sep_aux1 = Separator(self.frm_child_report, orient=VERTICAL) sep_aux1.grid(row=0, column=5, sticky=NS, rowspan=7, padx=30) # Detailed selection section self.trv_detail_sc = Treeview(self.frm_child_report, height=8, columns=('N', 'Scenario', 'M1', 'M2', 'M3', 'M4')) self.trv_detail_sc.heading('#0', text='ID', anchor=CENTER) self.trv_detail_sc.heading('#1', text='N', anchor=CENTER) self.trv_detail_sc.heading('#2', text='Scenario', anchor=CENTER) self.trv_detail_sc.heading('#3', text='M1', anchor=CENTER) self.trv_detail_sc.heading('#4', text='M2', anchor=CENTER) self.trv_detail_sc.heading('#5', text='M3', anchor=CENTER) self.trv_detail_sc.heading('#6', text='M4', anchor=CENTER) self.trv_detail_sc.column('#0', width=0, minwidth=50, stretch=NO) self.trv_detail_sc.column('#1', width=20, minwidth=20, stretch=NO) self.trv_detail_sc.column('#2', width=250, minwidth=250, stretch=NO) self.trv_detail_sc.column('#3', width=55, minwidth=55, stretch=NO) self.trv_detail_sc.column('#4', width=55, minwidth=55, stretch=NO) self.trv_detail_sc.column('#5', width=55, minwidth=55, stretch=NO) self.trv_detail_sc.column('#6', width=55, minwidth=55, stretch=NO) self.trv_detail_sc.grid(row=0, column=6, rowspan=2, sticky=W, pady=10) vsb_trv_detsc = Scrollbar(self.frm_child_report, orient="vertical", command=self.trv_detail_sc.yview) vsb_trv_detsc.grid(row=0, column=7, rowspan=2, pady=10, sticky=NS) self.trv_detail_sc.configure(yscrollcommand=vsb_trv_detsc.set) self.trv_detail_prob = Treeview(self.frm_child_report, height=8, columns=('N', 'Problem', 'M1', 'M2', 'M3', 'M4')) self.trv_detail_prob.heading('#0', text='ID', anchor=CENTER) self.trv_detail_prob.heading('#1', text='N', anchor=CENTER) self.trv_detail_prob.heading('#2', text='Problem', anchor=CENTER) self.trv_detail_prob.heading('#3', text='M1', anchor=CENTER) self.trv_detail_prob.heading('#4', text='M2', anchor=CENTER) self.trv_detail_prob.heading('#5', text='M3', anchor=CENTER) self.trv_detail_prob.heading('#6', text='M4', anchor=CENTER) self.trv_detail_prob.column('#0', width=0, minwidth=50, stretch=NO) self.trv_detail_prob.column('#1', width=20, minwidth=20, stretch=NO) self.trv_detail_prob.column('#2', width=250, minwidth=250, stretch=NO) self.trv_detail_prob.column('#3', width=55, minwidth=55, stretch=NO) self.trv_detail_prob.column('#4', width=55, minwidth=55, stretch=NO) self.trv_detail_prob.column('#5', width=55, minwidth=55, stretch=NO) self.trv_detail_prob.column('#6', width=55, minwidth=55, stretch=NO) self.trv_detail_prob.grid(row=2, column=6, rowspan=2, sticky=W, pady=10) vsb_trv_detprob = Scrollbar(self.frm_child_report, orient="vertical", command=self.trv_detail_prob.yview) vsb_trv_detprob.grid(row=2, column=7, rowspan=2, pady=10, sticky=NS) self.trv_detail_prob.configure(yscrollcommand=vsb_trv_detprob.set) self.trv_detail_designer = Treeview(self.frm_child_report, height=8, columns=('N', 'Designer', 'M1', 'M2', 'M3', 'M4')) self.trv_detail_designer.heading('#0', text='ID', anchor=CENTER) self.trv_detail_designer.heading('#1', text='N', anchor=CENTER) self.trv_detail_designer.heading('#2', text='Designer', anchor=CENTER) self.trv_detail_designer.heading('#3', text='M1', anchor=CENTER) self.trv_detail_designer.heading('#4', text='M2', anchor=CENTER) self.trv_detail_designer.heading('#5', text='M3', anchor=CENTER) self.trv_detail_designer.heading('#6', text='M4', anchor=CENTER) self.trv_detail_designer.column('#0', width=0, minwidth=50, stretch=NO) self.trv_detail_designer.column('#1', width=20, minwidth=20, stretch=NO) self.trv_detail_designer.column('#2', width=250, minwidth=250, stretch=NO) self.trv_detail_designer.column('#3', width=55, minwidth=55, stretch=NO) self.trv_detail_designer.column('#4', width=55, minwidth=55, stretch=NO) self.trv_detail_designer.column('#5', width=55, minwidth=55, stretch=NO) self.trv_detail_designer.column('#6', width=55, minwidth=55, stretch=NO) self.trv_detail_designer.bind("<Double-1>", self.view_detailed_solution) self.trv_detail_designer.grid(row=4, column=6, rowspan=2, sticky=W, pady=10) vsb_trv_detdesig = Scrollbar(self.frm_child_report, orient="vertical", command=self.trv_detail_designer.yview) vsb_trv_detdesig.grid(row=4, column=7, rowspan=2, pady=10, sticky=NS) self.trv_detail_designer.configure(yscrollcommand=vsb_trv_detdesig.set) lbl_notes = Label(self.frm_child_report, text='NOTE:\tDouble click on a designer to see\tLEGEND:\tM1=Solution ' 'time | M3=Viewed patterns\n\this solution for a problem ^.\t\t\t' 'M2=Selection time | M4=Selection efficiency\n') lbl_notes.config(fg=TEXT_COLOR, font=NOTE_FONT, justify=LEFT) lbl_notes.grid(row=6, column=6, pady=10, sticky=W) lbl_sep2 = Label(self.frm_child_report) lbl_sep2.grid(row=0, column=8, padx=10, pady=10, rowspan=7) # Components for component (experiment, scenario or problem) details lbl_sep3 = Label(self.tlevel_comp_detail) lbl_sep3.grid(row=0, column=0, padx=10, pady=20) self.txt_detail_component = Text(self.tlevel_comp_detail, height=25, width=60) self.txt_detail_component.config(font=TEXT_FONT, bg=DISABLED_COLOR) self.txt_detail_component.grid(row=0, column=1, pady=20, sticky=W) vsb_txt_detcomp = Scrollbar(self.tlevel_comp_detail, orient="vertical", command=self.txt_detail_component.yview) vsb_txt_detcomp.grid(row=0, column=2, pady=20, sticky=NS) self.txt_detail_component.configure(yscrollcommand=vsb_txt_detcomp.set) lbl_sep4 = Label(self.tlevel_comp_detail) lbl_sep4.grid(row=0, column=3, padx=10, pady=20) # Components of expanded detailed sent solution lbl_sep5 = Label(self.tlevel_sol_detail) lbl_sep5.grid(row=0, column=0, padx=10, pady=20, rowspan=3) lbl_sep6 = Label(self.tlevel_sol_detail) lbl_sep6.grid(row=0, column=1, pady=10) self.btn_detail_sol = Button(self.tlevel_sol_detail, text='View diagram >>', command=self.click_view_diagram_sol) self.txt_detail_solution = Text(self.tlevel_sol_detail, height=25, width=60) self.txt_detail_solution.config(font=TEXT_FONT, bg=DISABLED_COLOR) self.txt_detail_solution.grid(row=1, column=1, sticky=W, columnspan=2) vsb_txt_detsol = Scrollbar(self.tlevel_sol_detail, orient="vertical", command=self.txt_detail_solution.yview) vsb_txt_detsol.grid(row=1, column=3, sticky=NS) self.txt_detail_solution.configure(yscrollcommand=vsb_txt_detsol.set) lbl_sep7 = Label(self.tlevel_sol_detail) lbl_sep7.grid(row=0, column=4, padx=10, pady=20, rowspan=3) lbl_sep8 = Label(self.tlevel_sol_detail) lbl_sep8.grid(row=2, column=1, pady=10, columnspan=2) # Components of expanded sent solution diagram self.canvas_expanded = Canvas(self.tlevel_diagram, width=500, height=500) self.canvas_expanded.config(background='white', borderwidth=1) self.canvas_expanded.grid() def show_frm(self): """ Displays the home list of the 'Experiments' form """ self.frm_child_report.grid(row=1, column=0, columnspan=9, rowspan=8, pady=10, padx=10) self.retrieve_experiments() def hide_frm(self): """ Hides all forms that are currently active """ self.clear_components() self.frm_child_report.grid_forget() def retrieve_experiments(self): """ This function shows the existing 'Experiments' in the home TreeView """ # Remove existing elements in the list for item in self.trv_available_exp.get_children(): self.trv_available_exp.delete(item) self.directive = Message(action=92, information=['finished']) self.connection = self.directive.send_directive(self.connection) if len(self.connection.message.information) != 0: for index, item in enumerate(self.connection.message.information): elements = item.split('¥') self.trv_available_exp.insert('', 'end', text=elements[0], values=(index + 1, summarize_text(elements[1], 250))) self.available_patterns = Pattern.get_available_patterns(self.connection) '''if len(self.trv_available_exp.get_children()) != 0: self.trv_available_exp.selection_set(self.trv_available_exp.get_children()[0]) self.select_experiment_general()''' else: messagebox.showwarning(parent=self.frm_child_report, title='No experiments', message='No experiments in finished state') def retrieve_scenarios(self, scenarios=None): """ This function shows the existing Experimental scenarios in an 'Experiment' """ # Remove existing elements in the list for item in self.trv_available_sc.get_children(): self.trv_available_sc.delete(item) for index, item in enumerate(scenarios): elements = item.split('¥') self.trv_available_sc.insert('', 'end', text=elements[0], values=(index + 1, summarize_text(elements[1], 250))) '''if len(self.trv_available_sc.get_children()) != 0: self.trv_available_sc.selection_set(self.trv_available_sc.get_children()[0]) self.select_scenario()''' def retrieve_problems(self, problems=None): """ This function shows the existing Problems in an 'Experimental scenario' """ # Remove existing elements in the list for item in self.trv_available_prob.get_children(): self.trv_available_prob.delete(item) for index, item in enumerate(problems): elements = item.split('¥') self.trv_available_prob.insert('', 'end', text=elements[0], values=(index + 1, summarize_text(elements[1], 250))) '''if len(self.trv_available_prob.get_children()) != 0: self.trv_available_prob.selection_set(self.trv_available_prob.get_children()[0]) self.select_problem()''' def select_experiment_general(self, event=None): """ This function is activated when the 'Click Experiments TreeView' event ocurrs, it indicates than an experiments has been selected """ if len(self.trv_available_exp.selection()) == 1: self.clear_components(3) id_selected_exp = int(self.trv_available_exp.item(self.trv_available_exp.selection())[ 'text']) # Retrieve id of selected item from TreeView self.directive = Message(action=95, information=[id_selected_exp]) self.connection = self.directive.send_directive(self.connection) self.experiment = Experiment(id=id_selected_exp, name=self.connection.message.information[0], description=self.connection.message.information[1], design_type=self.connection.message.information[2], state=self.connection.message.information[3], creation_date=self.connection.message.information[5], execution_date=self.connection.message.information[6], finished_date=self.connection.message.information[7]) self.retrieve_scenarios(self.connection.message.information[4]) # Ask to server for dataframe of the measurements for the scenarios of selected experiment self.directive = Message(action=107, information=[id_selected_exp, 'experiment']) self.connection = self.directive.send_directive(self.connection) final_df = get_mean_value(self.connection.message.information[0]) for index, row in final_df.iterrows(): self.trv_detail_sc.insert('', 'end', text=row.id, values=(index + 1, summarize_text(row.variable, 250), row.m1, row.m2, row.m3, row.m4)) def select_scenario_general(self, event=None): """ Function activated when a scenario is selecteded """ if len(self.trv_available_sc.selection()) == 1: self.clear_components(2) id_selected_sc = int(self.trv_available_sc.item(self.trv_available_sc.selection())[ 'text']) # Retrieve id of selected item from TreeView self.directive = Message(action=85, information=[id_selected_sc, 'report', 1]) self.connection = self.directive.send_directive(self.connection) self.scenario = ExperimentalSC(id=id_selected_sc, title=self.connection.message.information[0], description=self.connection.message.information[1], id_description_diagram=self.connection.message.information[2], info_designers=self.connection.message.information[4]) self.retrieve_problems(self.connection.message.information[3]) # Ask to server for dataframe of the measurements for the problems of selected scenario self.directive = Message(action=107, information=[id_selected_sc, 'scenario']) self.connection = self.directive.send_directive(self.connection) final_df = get_mean_value(self.connection.message.information[0]) for index, row in final_df.iterrows(): self.trv_detail_prob.insert('', 'end', text=row.id, values=(index + 1, summarize_text(row.variable, 250), row.m1, row.m2, row.m3, row.m4)) def select_problem_general(self, event=None): """ Function activated when a scenario is selected """ if len(self.trv_available_prob.selection()) == 1: self.clear_components(1) id_selected_prob = int(self.trv_available_prob.item(self.trv_available_prob.selection())[ 'text']) # Retrieve id of selected item from TreeView self.directive = Message(action=55, information=[id_selected_prob]) self.connection = self.directive.send_directive(self.connection) self.problem = Problem(id=id_selected_prob, brief_description=self.connection.message.information[0], description=self.connection.message.information[1], id_solution=self.connection.message.information[2], av_patterns=self.available_patterns, connection=self.connection) # Ask to server for dataframe of the measurements for the designers of selected problem self.directive = Message(action=107, information=[id_selected_prob, 'problem']) self.connection = self.directive.send_directive(self.connection) final_df = get_mean_value(self.connection.message.information[0]) for index, row in final_df.iterrows(): self.trv_detail_designer.insert('', 'end', text=row.id, values=(index + 1, summarize_text(row.variable, 250), row.m1, row.m2, row.m3, row.m4)) def click_view_experiment(self): """ Function activated when 'Experiment detail' button is pressed, it shows the tlevel_detail window showing main information of the selected experimentin trv_available_sc """ if len(self.trv_available_exp.selection()) == 1: self.txt_detail_component['state'] = NORMAL self.txt_detail_component.delete('1.0', 'end-1c') self.txt_detail_component.insert('1.0', 'EXPERIMENT NAME\n{}\n\n' 'DESCRIPTION\n{}\n\n' 'DESIGN TYPE\n{}\n\n' 'CREATION DATETIME\n{}\n\n' 'EXECUTION DATETIME\n{}\n\n' 'FINISHED DATETIME\n{}'. format(self.experiment.name, self.experiment.description, 'One group' if self.experiment.design_type == 1 else 'Two groups', self.experiment.creation_date.strftime('%c'), self.experiment.execution_date.strftime('%c'), self.experiment.finished_date.strftime('%c'))) self.txt_detail_component['state'] = DISABLED self.tlevel_comp_detail.deiconify() self.tlevel_comp_detail.grab_set() else: messagebox.showwarning(parent=self.frm_child_report, title='No selection', message='You must select one item') def click_view_scenario(self): """ Function activated when 'Scenario detail' button is pressed, it shows the tlevel_detail window showing main information of the selected experimental scenario in trv_available_sc """ if len(self.trv_available_sc.selection()) == 1: self.txt_detail_component['state'] = NORMAL self.txt_detail_component.delete('1.0', 'end-1c') self.txt_detail_component.insert('1.0', 'EXPERIMENTAL SCENARIO TITLE\n{}\n\n' 'DESCRIPTION\n{}\n\n' 'DESIGNERS SCENARIO ASSIGNED: {}\n\n' 'DESIGNERS COMPLETED SCENARIO: {}\n\n' 'DESIGNERS DID NOT COMPLETE SCENARIO: {}\n\n' 'DESIGNERS DID NOT RUN SCENARIO: {}'. format(self.scenario.title, self.scenario.description, self.scenario.info_designers[0], self.scenario.info_designers[1], self.scenario.info_designers[2], self.scenario.info_designers[3])) self.txt_detail_component['state'] = DISABLED self.tlevel_comp_detail.deiconify() self.tlevel_comp_detail.grab_set() else: messagebox.showwarning(parent=self.frm_child_report, title='No selection', message='You must select one item') def click_view_problem(self): """ Function activated when 'Problem detail' button is pressed, it shows the tlevel_detail window showing main information of the selected problem in trv_available_prob """ if len(self.trv_available_prob.selection()) == 1: aux_patterns = '' for item in self.problem.solution.patterns: aux_patterns += '- {}\n'.format(item.get_joined_main_s()) self.txt_detail_component['state'] = NORMAL self.txt_detail_component.delete('1.0', 'end-1c') self.txt_detail_component.insert('1.0', 'PROBLEM BRIEF DESCRIPTION\n{}\n\n' 'DESCRIPTION\n{}\n\n' 'EXPECTED SOLUTION NOTES\n{}\n\n' 'EXPECTED SOLUTION PATTERNS\n{}'. format(self.problem.brief_description, self.problem.description, self.problem.solution.annotations, 'No patterns configured' if aux_patterns == '' else aux_patterns)) self.txt_detail_component['state'] = DISABLED self.tlevel_comp_detail.deiconify() self.tlevel_comp_detail.grab_set() else: messagebox.showwarning(parent=self.frm_child_report, title='No selection', message='You must select one item') def click_view_diagram_sol(self): # Fill summary problem canvas with retrieved image load = Image.open(self.solution.diagram.filename) load = load.resize((500, 500), Image.ANTIALIAS) self.render = ImageTk.PhotoImage(load) self.canvas_expanded.delete() self.solution.diagram.image = self.canvas_expanded.create_image(0, 0, anchor='nw', image=self.render) # and display new image self.tlevel_diagram.deiconify() self.tlevel_diagram.grab_set() def click_csv(self): if len(self.trv_available_exp.selection()) == 1: # Get report in .zip (temporarly) path = askdirectory(title='Select destination folder') # shows dialog box and return the path if path: # Retrieve zip file and create into the selected folder self.directive = Message(action=106, information=[self.experiment.id]) self.connection = self.directive.send_directive(self.connection) report_file = File() report_file.write_permanent_file(self.connection.message.information[0], self.connection.message.information[1], path) messagebox.showinfo(parent=self.frm_child_report, title='Report created', message='Zipped report created: "{}"'.format(report_file.filename)) else: messagebox.showwarning(parent=self.frm_child_report, title='No selection', message='You must select one item') def view_detailed_solution(self, event=None): if len(self.trv_detail_designer.selection()) == 1: id_selected_desig = self.trv_detail_designer.item(self.trv_detail_designer.selection())[ 'text'] # Retrieve id of selected item from TreeView if id_selected_desig != 'X': if self.trv_detail_designer.item(self.trv_detail_designer.selection())['values'][2] != 'X': # Here asks for the sent solution of specific designer self.directive = Message(action=105, information=[int(id_selected_desig), self.problem.id]) self.connection = self.directive.send_directive(self.connection) # Getting assigned patterns in current experimental scenario assigned_patterns = [] for item in self.connection.message.information[4]: for pattern in self.available_patterns: if item == pattern.id: assigned_patterns.append(pattern) chosen_patterns = [] # Getting patterns of sent solution for item in self.connection.message.information[2]: id_pattern = int(item.split('¥')[0]) for pattern in self.available_patterns: if id_pattern == pattern.id: chosen_patterns.append(pattern) # Getting current group for the designer current_group = self.connection.message.information[3] # Creating the auxiliar solution self.solution = Solution(annotations=self.connection.message.information[0], patterns=chosen_patterns, diagram_id=self.connection.message.information[1], connection=self.connection) # Adjust visual components depending on the sent solution self.btn_detail_sol.grid_forget() if self.solution.diagram_id is not None: self.btn_detail_sol.grid(row=0, column=2, pady=10, sticky=E) aux_patterns_assign = '' for item in assigned_patterns: aux_patterns_assign += '- {}\n'.format(item.get_joined_main_s()) aux_patterns_sent_sol = '' for item in self.solution.patterns: aux_patterns_sent_sol += '- {}\n'.format(item.get_joined_main_s()) self.txt_detail_solution['state'] = NORMAL self.txt_detail_solution.delete('1.0', 'end-1c') self.txt_detail_solution.insert('1.0', 'CURRENT PROBLEM\n{}\n\n' 'CURRENT DESIGNER\n{}\n\n' 'ASSIGNED GROUP\n{}\n\n' 'SENT SOLUTION NOTES\n{}\n\n' 'SENT SOLUTION DIAGRAM\n{}\n\n' 'ASSIGNED PATTERNS\n{}\n\n' 'CHOSEN PATTERNS\n{}'. format(self.problem.brief_description, self.trv_detail_designer.item( self.trv_detail_designer.selection())['values'][1], 'Control group' if current_group == 1 else 'Experimental group', self.solution.annotations, 'No diagram in solution' if self.solution.diagram_id is None else 'Click up button to see diagram ^', 'No patterns configured' if aux_patterns_assign == '' else aux_patterns_assign, 'No patterns chosen' if aux_patterns_sent_sol == '' else aux_patterns_sent_sol)) self.txt_detail_solution['state'] = DISABLED self.tlevel_sol_detail.deiconify() self.tlevel_sol_detail.grab_set() else: messagebox.showwarning(parent=self.frm_child_report, title='Wrong selection', message='The selected designer does not have a solution for the current ' 'problem') def clear_components(self, decision=4): if decision > 0: # When selecting an problem form general list for item in self.trv_detail_designer.get_children(): self.trv_detail_designer.delete(item) if decision > 1: # When selecting a scenario form general list for item in self.trv_available_prob.get_children(): self.trv_available_prob.delete(item) for item in self.trv_detail_prob.get_children(): self.trv_detail_prob.delete(item) if decision > 2: # When selecting an experiment form general list for item in self.trv_available_sc.get_children(): self.trv_available_sc.delete(item) for item in self.trv_detail_sc.get_children(): self.trv_detail_sc.delete(item) if decision > 3: # Clearing information from all the treeviews for item in self.trv_available_exp.get_children(): self.trv_available_exp.delete(item) def click_exit_component_det(self): self.tlevel_comp_detail.grab_release() self.tlevel_comp_detail.withdraw() def click_exit_diagram(self): self.tlevel_diagram.grab_release() self.tlevel_diagram.withdraw() def click_exit_solution_det(self): self.tlevel_sol_detail.grab_release() self.tlevel_sol_detail.withdraw()
class About: def __init__(self): self.rootpath = '.\\' self.openAbout() def openAbout(self): self.about = Toplevel() w = 501 h = 240 ws = self.about.winfo_screenwidth() hs = self.about.winfo_screenheight() x = (ws / 2) - (w / 2) y = (hs / 2) - (h / 2) self.about.geometry('%dx%d+%d+%d' % (w, h, x, y)) self.about.resizable(0, 0) self.about.title('About Testcase Generator') self.about.attributes("-toolwindow", 1) self.about.protocol("WM_DELETE_WINDOW", self.closeAboutWindow) self.about.grab_set() self.about.iconbitmap(self.rootpath + 'appdata\\images\\favicon.ico') txt = Text(self.about, padx=10, pady=10, font=("Consolas", 10), wrap='word') self.hyperlink = HyperlinkManager.HyperlinkManager(txt) txt.tag_configure('bold', font='Consolas 11 bold') txt.tag_configure('header', font='Consolas 15 bold') txt.insert(INSERT, ' Testcase Generator\n', 'header') txt.insert(INSERT, ' version: 1.0.0\n') txt.insert(END, '\nTestcase Generator ', 'bold') txt.insert( END, "is a handy tool for preparing the input and output dataset for programming competition. " ) txt.insert(END, 'Input generator is implemented using ') txt.insert( END, 'CodeForces', self.hyperlink.add( partial(webbrowser.open, "https://www.codeforces.com/"))) txt.insert(END, ' testlib.h library in C++. ') txt.insert( END, "This tool is specially helpful for the problem author and tester of a programming competition." ) txt.insert(END, '\n\n') txt.insert( END, 'Github Repository', self.hyperlink.add( partial(webbrowser.open, "https://github.com/skmonir/testcase_generator/"))) txt.insert(END, '\n\n') txt.insert(END, 'Developed by ') txt.insert(END, 'Md Moniruzzaman', 'bold') txt.insert(END, ' <*****@*****.**>\n') txt.insert( END, 'Facebook', self.hyperlink.add( partial(webbrowser.open, "https://www.facebook.com/skmnrcse/"))) txt.insert(END, ' ') txt.insert( END, 'LinkedIn', self.hyperlink.add( partial(webbrowser.open, "https://www.linkedin.com/in/skmonir/"))) txt.insert(END, ' ') txt.insert( END, 'Github', self.hyperlink.add( partial(webbrowser.open, "https://www.github.com/skmonir/"))) txt.pack() txt.config(state=DISABLED) def closeAboutWindow(self): self.about.grab_release() self.about.destroy()
class spi(Frame): def __init__(self, master): self.master = master self.CLKIn = 0 self.DataIn = 0 self.SSIn = 0 self.cpol = 0 self.cpha = 0 self.decode_index = [] self.decode_state1 = [] self.decode_state2 = [] self.decode_position = [] self.decode_text = [] def set_decode(self, channelStates): #self.master.withdraw() self.top = Toplevel(self.master) self.top.geometry("300x210") self.top.title("spi") self.top.grab_set() self.Datalab = Label(self.top, text="MISO/MOSI:") self.Datalab.place(x=70, y=20) self.CLKlab = Label(self.top, text="CLK:") self.CLKlab.place(x=70, y=50) self.SSlab = Label(self.top, text="SS:") self.SSlab.place(x=70, y=80) self.DataCombo = Combobox(self.top, state="readonly", width=8) self.DataCombo.place(x=150, y=20) self.CLKCombo = Combobox(self.top, state="readonly", width=8) self.CLKCombo.place(x=150, y=50) self.SSCombo = Combobox(self.top, state="readonly", width=8) self.SSCombo.place(x=150, y=80) clk_in_temp = 100 data_in_temp = 100 ss_in_temp = 100 for i in range(0, len(channelStates)): if (channelStates[i] == 1 and i == self.CLKIn): clk_in_temp = i if (channelStates[i] == 1 and i == self.DataIn): data_in_temp = i if (channelStates[i] == 1 and i == self.SSIn): ss_in_temp = i for i in range(0, len(channelStates)): if (channelStates[i] == 1 and clk_in_temp == 100): clk_in_temp = i if (channelStates[i] == 1 and data_in_temp == 100): data_in_temp = i if (channelStates[i] == 1 and ss_in_temp == 100): ss_in_temp = i if (clk_in_temp == 100): clk_in_temp = 0 if (data_in_temp == 100): data_in_temp = 0 if (ss_in_temp == 100): ss_in_temp = 0 self.CLKIn = clk_in_temp self.DataIn = data_in_temp self.SSIn = ss_in_temp self.DataCombo['values'] += (str(self.DataIn)) self.CLKCombo['values'] += (str(self.CLKIn)) self.SSCombo['values'] += (str(self.SSIn)) for i in range(0, len(channelStates)): if (channelStates[i] == 1): if str(i) not in self.DataCombo['values']: self.DataCombo['values'] += (str(i), ) if str(i) not in self.CLKCombo['values']: self.CLKCombo['values'] += (str(i), ) if str(i) not in self.SSCombo['values']: self.SSCombo['values'] += (str(i), ) self.cpol_var = IntVar() self.CB1 = Checkbutton(self.top, text='CPOL', variable=self.cpol_var, onvalue=1, offvalue=0) # self.CB1.place(x=150, y=110) self.cpol_var.set(self.cpol) self.cpha_var = IntVar() self.CB2 = Checkbutton(self.top, text='CPHA', variable=self.cpha_var, onvalue=1, offvalue=0) # self.CB2.place(x=150, y=130) self.cpha_var.set(self.cpha) self.Button = Button(self.top, text="OK", height=2, width=18, command=self.OkCallBack) self.Button.place(x=80, y=155) self.CLKCombo.current(0) self.DataCombo.current(0) self.SSCombo.current(0) self.top.protocol('WM_DELETE_WINDOW', self.exit_handler) self.top.mainloop() def decode(self, results, max_index, frequence): print(results[self.DataIn][100:4]) self.decode_index = [] self.decode_state1 = [] self.decode_state2 = [] self.decode_index.append(0) self.decode_state1.append(1) self.decode_state2.append(0) self.bit_count = 0 self.data = 0 self.data_end_pos = 0 self.decodeStrTmp = "" for i in range(1, max_index): if (results[self.SSIn][i - 1] == 1 and results[self.SSIn][i] == 0 and self.bit_count == 0): #START self.add_point(i) self.decodeStrTmp += "St" self.decode_position.append(i - ((i - self.decode_index[-1]) / 2)) self.decode_text.append(self.decodeStrTmp) self.decodeStrTmp = "" self.data = 0 self.bit_count = 1 elif (results[self.SSIn][i - 1] == 0 and results[self.SSIn][i] == 1): #STOP self.decode_position.append(self.data_end_pos - ( (self.data_end_pos - self.decode_index[-1]) / 2)) self.decodeStrTmp = str(hex(self.data)) self.decode_text.append(self.decodeStrTmp) self.data = 0 self.add_point(self.data_end_pos) #data end position self.decode_position.append(i - ((i - self.decode_index[-1]) / 2)) self.decodeStrTmp = "Sp" self.decode_text.append(self.decodeStrTmp) self.decodeStrTmp = "" self.add_point(i) self.bit_count = 0 elif (self.cpol == self.cpha and self.bit_count > 0 and results[self.CLKIn][i] == 1 and results[self.CLKIn][i - 1] == 0): #DATA self.data = (self.data << 1) & results[self.DataIn][i] self.bit_count += 1 elif (self.cpol == self.cpha and self.bit_count > 0 and results[self.CLKIn][i] == 0 and results[self.CLKIn][i - 1] == 1): self.data = (self.data << 1) & results[self.DataIn][i] self.data_end_pos = i elif (self.cpol != self.cpha and self.bit_count > 0 and results[self.CLKIn][i] == 0 and results[self.CLKIn][i - 1] == 1): #DATA self.data = (self.data << 1) & results[self.DataIn][i] self.bit_count += 1 elif (self.cpol != self.cpha and self.bit_count > 0 and results[self.CLKIn][i] == 1 and results[self.CLKIn][i - 1] == 0): self.data = (self.data << 1) & results[self.DataIn][i] self.data_end_pos = i elif (self.bit_count >= 128 and results[self.CLKIn][i] == 0 and results[self.CLKIn][i - 1] == 1): self.bit_count = 1 self.decode_position.append(i - ((i - self.decode_index[-1]) / 2)) self.decodeStrTmp = str(hex(self.data)) self.decode_text.append(self.decodeStrTmp) self.data = 0 self.add_point(i) def OkCallBack(self): self.DataIn = int(self.DataCombo.get()) self.CLKIn = int(self.CLKCombo.get()) self.SSIn = int(self.SSCombo.get()) self.cpol = int(self.cpol_var.get()) self.cpha = int(self.cpha_var.get()) self.exit_handler() def exit_handler(self): #self.master.deiconify() self.top.grab_release() self.top.destroy() def add_point(self, i): self.decode_index.append(i) self.decode_state1.append(self.decode_state1[-1]) self.decode_state2.append(self.decode_state2[-1]) self.decode_index.append(i + 0.5) self.decode_state1.append(1 - self.decode_state1[-1]) self.decode_state2.append(1 - self.decode_state2[-1])
def change_settings(self): win = Toplevel() win.lift() win.focus_force() win.grab_set() win.grab_release() dropdown_frame = Frame(win) dropdown_frame.pack() button_frame = Frame(win) button_frame.pack(pady=20) setting_frame = Frame(win) setting_frame.pack(pady=20) self.buttons = [None] * 26 rows = 13 self.combox = Combobox(dropdown_frame) self.combox.pack(side=LEFT) inis = glob("configs/*.ini") inis = [ini.split(".")[0].split("\\")[-1] for ini in inis] self.combox["values"] = inis self.loadbutton = Button( dropdown_frame, text="load", width=self.buttonwidth, command=self.loadprofile, ) self.loadbutton.pack(side=LEFT) self.savebutton = Button( dropdown_frame, text="save", width=self.buttonwidth, command=self.saveprofile, ) self.savebutton.pack(side=LEFT) for index, items in enumerate(self.mapping.controller_keyboard.items()): Label(button_frame, text=items[0], width=self.buttonwidth).grid( row=index % rows, column=int(index / rows) * 2 ) a = KeyMappingButton(button_frame, text=items[1], width=self.buttonwidth) if index >= 13: a.grid( row=index % rows, column=int(index / rows) * 2 + 1, padx=25, sticky="w", ) else: a.grid(row=index % rows, column=int(index / rows) * 2 + 1) self.buttons[index] = a confirm_button = Button( setting_frame, text="confirm", width=self.buttonwidth, command=lambda: self.confirm_setting(win, self.buttons), ) confirm_button.pack(side=LEFT) win.wm_title("Window")
class FormParentDesigner: def __init__(self, window, connection, current_designer): self.connection = connection self.current_designer = current_designer self.frm_parent = LabelFrame(window) self.tlevel_auth_scenario = Toplevel(window) self.tlevel_auth_scenario.protocol("WM_DELETE_WINDOW", self.click_authenticate_cancel) self.tlevel_auth_scenario.withdraw() self.frm_general = LabelFrame(window) self.tlevel_image_exp = Toplevel(window) self.tlevel_image_exp.title('Diagram') self.tlevel_image_exp.protocol("WM_DELETE_WINDOW", self.close_tlevel_image) self.tlevel_image_exp.withdraw() self.initialize_components() def initialize_components(self): # Resources for the Forms self.new_icon = PhotoImage(file=r"./Resources/create.png") self.modify_icon = PhotoImage(file=r"./Resources/modify.png") self.remove_icon = PhotoImage(file=r"./Resources/delete.png") self.save_icon = PhotoImage(file=r"./Resources/save.png") self.cancel_icon = PhotoImage(file=r"./Resources/cancel.png") self.add_icon = PhotoImage(file=r"./Resources/down_arrow.png") self.delete_icon = PhotoImage(file=r"./Resources/up_arrow.png") self.next_icon = PhotoImage(file=r"./Resources/next.png") self.back_icon = PhotoImage(file=r"./Resources/back.png") self.copy_icon = PhotoImage(file=r"./Resources/copy.png") self.open_icon = PhotoImage(file=r"./Resources/open.png") self.complete_icon = PhotoImage(file=r"./Resources/complete.png") self.incomplete_icon = PhotoImage(file=r"./Resources/incomplete.png") self.optional_icon = PhotoImage(file=r"./Resources/optional.png") self.refresh_icon = PhotoImage(file=r"./Resources/refresh.png") # Initialize visual components for displaying available experiment scenarios lbl_title = Label(self.frm_parent, text='Experiments') lbl_title.config(fg=TEXT_COLOR, font=TITLE_FONT) lbl_title.grid(row=0, column=0, columnspan=9, pady=20, sticky=EW) sep_aux5 = Separator(self.frm_parent, orient=HORIZONTAL) sep_aux5.grid(row=1, column=0, sticky=EW, columnspan=9) lbl_sep1 = Label(self.frm_parent) lbl_sep1.grid(row=2, column=0, padx=10, pady=20, rowspan=2) lbl_experimental_trv = Label(self.frm_parent, text='Select an experiment') lbl_experimental_trv.config(fg=TEXT_COLOR, font=SUBTITLE2_FONT) lbl_experimental_trv.grid(row=2, column=1, pady=20, sticky=W) lbl_sep2 = Label(self.frm_parent) lbl_sep2.grid(row=2, column=3, padx=10, pady=20, rowspan=2) lbl_problem_desc = Label(self.frm_parent, text='Information') lbl_problem_desc.config(fg=TEXT_COLOR, font=SUBTITLE2_FONT) lbl_problem_desc.grid(row=2, column=4, pady=20, sticky=W) lbl_sep3 = Label(self.frm_parent) lbl_sep3.grid(row=2, column=6, padx=10, pady=20, rowspan=2) self.trv_available = Treeview(self.frm_parent, height=11, columns='Title') self.trv_available.heading('#0', text='ID', anchor=CENTER) self.trv_available.heading('#1', text='Title', anchor=CENTER) self.trv_available.column('#0', width=0, minwidth=50, stretch=NO) self.trv_available.column('#1', width=400, minwidth=400, stretch=NO) self.trv_available.bind("<ButtonRelease-1>", self.select_experimental_scenario) self.trv_available.grid(row=3, column=1, sticky=W, pady=20) vsb_trv_av = Scrollbar(self.frm_parent, orient="vertical", command=self.trv_available.yview) vsb_trv_av.grid(row=3, column=2, pady=20, sticky=NS) self.trv_available.configure(yscrollcommand=vsb_trv_av.set) self.txt_scenario_desc = Text(self.frm_parent, height=15, width=40) self.txt_scenario_desc.config(font=TEXT_FONT, bg=DISABLED_COLOR) self.txt_scenario_desc.grid(row=3, column=4, pady=20, sticky=W) vsb_txt_sc = Scrollbar(self.frm_parent, orient="vertical", command=self.txt_scenario_desc.yview) vsb_txt_sc.grid(row=3, column=5, pady=20, sticky=NS) self.txt_scenario_desc.configure(yscrollcommand=vsb_txt_sc.set) sep_aux1 = Separator(self.frm_parent, orient=VERTICAL) sep_aux1.grid(row=2, column=7, sticky=NS, rowspan=2) btn_access = Button(self.frm_parent, image=self.next_icon, command=self.click_enter_scenario) btn_access.grid(row=2, column=8, padx=30, pady=5) btn_access_ttp = CreateToolTip(btn_access, 'Go') btn_refresh = Button(self.frm_parent, image=self.refresh_icon, command=self.retrieve_list) btn_refresh.grid(row=3, column=8, padx=30, pady=5, sticky=N) btn_refresh_ttp = CreateToolTip(btn_refresh, 'Refresh list') # Window dialog to authenticate the selected experimental scenario lbl_access_auth = Label(self.tlevel_auth_scenario, text='Insert access code: ') lbl_access_auth.config(fg=TEXT_COLOR, font=SUBTITLE2_FONT) lbl_access_auth.grid(pady=10, padx=20, sticky=W) self.txt_auth_scenario = Entry(self.tlevel_auth_scenario, width=50) self.txt_auth_scenario.config(font=SUBTITLE2_FONT, show="*") self.txt_auth_scenario.grid(row=0, column=1, padx=20, pady=10, sticky=W) btn_access_auth = Button(self.tlevel_auth_scenario, image=self.next_icon, command=self.click_authenticate_scenario) btn_access_auth.grid(row=0, column=2, padx=20, pady=10, sticky=W) btn_access_auth_ttp = CreateToolTip(btn_access_auth, 'Go') btn_cancel_auth = Button(self.tlevel_auth_scenario, image=self.cancel_icon, command=self.click_authenticate_cancel) btn_cancel_auth.grid(row=1, column=2, padx=20, pady=10, sticky=W) btn_cancel_auth_ttp = CreateToolTip(btn_cancel_auth, 'Cancel') # Experiment form lbl_sep4 = Label(self.frm_general) lbl_sep4.grid(row=0, column=0, padx=10, pady=5, rowspan=2) self.lbl_exp_title = Label(self.frm_general, text='Experiment: {}') self.lbl_exp_title.config(fg=TEXT_COLOR, font=TITLE_FONT) self.lbl_exp_title.grid(row=0, column=1, columnspan=5, pady=5, sticky=EW) self.txt_exp_desc = Text(self.frm_general, height=4, width=157) self.txt_exp_desc.config(font=TEXT_FONT, bg=DISABLED_COLOR) self.txt_exp_desc.grid(row=1, column=1, pady=5, sticky=W) vsb_txt_expd = Scrollbar(self.frm_general, orient="vertical", command=self.txt_exp_desc.yview) vsb_txt_expd.grid(row=1, column=2, pady=5, sticky=NS) self.txt_exp_desc.configure(yscrollcommand=vsb_txt_expd.set) lbl_sep11 = Label(self.frm_general) lbl_sep11.grid(row=1, column=3, padx=10, pady=5) self.btn_view_dd = Button(self.frm_general, text='View >>\ndiagram', command=self.click_expand_dd) btn_view_dd_ttp = CreateToolTip(self.btn_view_dd, 'Experiment description diagram') sep_aux3 = Separator(self.frm_general, orient=HORIZONTAL) sep_aux3.grid(row=2, column=0, sticky=EW, columnspan=6) lbl_sep5 = Label(self.frm_general) lbl_sep5.grid(row=3, column=0, padx=10, pady=5, rowspan=2) self.lbl_prob_title = Label(self.frm_general, text='Problem {} of {}: {}') self.lbl_prob_title.config(fg=TEXT_COLOR, font=SUBTITLE_FONT) self.lbl_prob_title.grid(row=3, column=1, columnspan=2, pady=5, sticky=W) self.txt_prob_desc = Text(self.frm_general, height=7, width=157) self.txt_prob_desc.config(font=TEXT_FONT, bg=DISABLED_COLOR) self.txt_prob_desc.grid(row=4, column=1, pady=5, sticky=W) vsb_txt_probd = Scrollbar(self.frm_general, orient="vertical", command=self.txt_prob_desc.yview) vsb_txt_probd.grid(row=4, column=2, pady=5, sticky=NS) self.txt_prob_desc.configure(yscrollcommand=vsb_txt_probd.set) lbl_sep12 = Label(self.frm_general) lbl_sep12.grid(row=3, column=3, padx=10, pady=5, rowspan=2) sep_aux2 = Separator(self.frm_general, orient=HORIZONTAL) sep_aux2.grid(row=5, column=0, sticky=EW, columnspan=4) lbl_sep6 = Label(self.frm_general) lbl_sep6.grid(row=6, column=0, padx=10, pady=5, rowspan=2) lbl_solution_title = Label(self.frm_general, text='Your solution') lbl_solution_title.config(fg=TEXT_COLOR, font=SUBTITLE_FONT) lbl_solution_title.grid(row=6, column=1, pady=5, columnspan=2, sticky=W) self.btn_next_scenario = Button(self.frm_general, image=self.next_icon, command=self.click_next_scenario) self.btn_next_scenario.grid(row=3, column=5, padx=30, pady=5, sticky=W) btn_next_scenario_ttp = CreateToolTip(self.btn_next_scenario, 'Next component') sep_aux4 = Separator(self.frm_general, orient=VERTICAL) sep_aux4.grid(row=3, column=4, sticky=NS, rowspan=5) self.tab_control = Notebook(self.frm_general) self.tab_patterns = Frame(self.tab_control) self.tab_control.add(self.tab_patterns, text="Design patterns", padding=10, image=self.incomplete_icon, compound=RIGHT) lbl_av_patterns = Label(self.tab_patterns, text='Patterns browser') lbl_av_patterns.config(fg=TEXT_COLOR, font=SUBTITLE2_FONT) lbl_av_patterns.grid(row=0, column=1, pady=10, columnspan=6, sticky=W) lbl_content = Label(self.tab_patterns, text='Pattern content') lbl_content.config(fg=TEXT_COLOR, font=SUBTITLE2_FONT) lbl_content.grid(row=0, column=8, pady=10, sticky=W) lbl_sel_patterns = Label(self.tab_patterns, text='Selected patterns') lbl_sel_patterns.config(fg=TEXT_COLOR, font=SUBTITLE2_FONT) lbl_sel_patterns.grid(row=3, column=1, pady=10, columnspan=6, sticky=W) lbl_sep7 = Label(self.tab_patterns) lbl_sep7.grid(row=0, column=0, padx=10, pady=10, rowspan=5) self.lbx_av_patterns = Listbox(self.tab_patterns, height=6, width=60, exportselection=0) self.lbx_av_patterns.grid(row=1, column=1, sticky=W, columnspan=5) self.lbx_av_patterns.bind('<<ListboxSelect>>', self.select_available_pattern) vsb_trv_avpat = Scrollbar(self.tab_patterns, orient="vertical", command=self.lbx_av_patterns.yview) vsb_trv_avpat.grid(row=1, column=6, pady=10, sticky=NS) self.lbx_av_patterns.configure(yscrollcommand=vsb_trv_avpat.set) lbl_sep8 = Label(self.tab_patterns) lbl_sep8.grid(row=0, column=7, padx=10, pady=10, rowspan=5) self.btn_view_pd = Button(self.tab_patterns, text='View diagram >>', command=self.click_expand_pd) btn_view_pd_ttp = CreateToolTip(self.btn_view_pd, 'Pattern section diagram') self.txt_pattern_content = Text(self.tab_patterns, height=18, width=85) self.txt_pattern_content.config(font=TEXT_FONT, bg=DISABLED_COLOR) self.txt_pattern_content.tag_configure("center", justify='center') self.txt_pattern_content.tag_add("center", 1.0, "end") self.txt_pattern_content.grid(row=1, column=8, sticky=W, columnspan=2, rowspan=4) vsb_txt_content = Scrollbar(self.tab_patterns, orient="vertical", command=self.txt_pattern_content.yview) vsb_txt_content.grid(row=1, column=10, rowspan=4, pady=10, sticky=NS) self.txt_pattern_content.configure(yscrollcommand=vsb_txt_content.set) btn_add = Button(self.tab_patterns, image=self.add_icon, command=self.click_add_patt) btn_add.grid(row=2, column=3, pady=10, sticky=E) btn_add_ttp = CreateToolTip(btn_add, 'Add pattern') btn_remove = Button(self.tab_patterns, image=self.delete_icon, command=self.click_remove_patt) btn_remove.grid(row=2, column=4, pady=10) btn_remove_ttp = CreateToolTip(btn_remove, 'Remove pattern') self.lbx_sel_patterns = Listbox(self.tab_patterns, height=6, width=60, exportselection=0) self.lbx_sel_patterns.grid(row=4, column=1, sticky=W, columnspan=5) vsb_trv_selpat = Scrollbar(self.tab_patterns, orient="vertical", command=self.lbx_sel_patterns.yview) vsb_trv_selpat.grid(row=4, column=6, pady=10, sticky=NS) self.lbx_sel_patterns.configure(yscrollcommand=vsb_trv_selpat.set) lbl_sep9 = Label(self.tab_patterns) lbl_sep9.grid(row=0, column=11, padx=10, pady=10, rowspan=5) self.tab_desc = Frame(self.tab_control) self.tab_control.add(self.tab_desc, text="Notes", padding=10, image=self.incomplete_icon, compound=RIGHT) lbl_sep10 = Label(self.tab_desc) lbl_sep10.grid(row=0, column=0, padx=10, pady=20) self.txt_solution_desc = Text(self.tab_desc, height=20, width=145) self.txt_solution_desc.config(font=TEXT_FONT) self.txt_solution_desc.bind("<Key>", self.txt_notes_modified) self.txt_solution_desc.grid(row=0, column=1, pady=20, sticky=W) vsb_txt_solution_desc = Scrollbar(self.tab_desc, orient="vertical", command=self.txt_solution_desc.yview) vsb_txt_solution_desc.grid(row=0, column=2, pady=20, sticky=NS) self.txt_solution_desc.configure(yscrollcommand=vsb_txt_solution_desc.set) lbl_sep14 = Label(self.tab_desc) lbl_sep14.grid(row=0, column=3, padx=10, pady=20) self.tab_file = Frame(self.tab_control) self.tab_control.add(self.tab_file, text="File", padding=1, image=self.optional_icon, compound=RIGHT) lbl_upload = Label(self.tab_file, text='Attach a file to the solution: ') lbl_upload.config(fg=TEXT_COLOR, font=SUBTITLE2_FONT) lbl_upload.grid(row=0, column=0, padx=20, pady=20, sticky=W) btn_open = Button(self.tab_file, image=self.open_icon, command=self.click_attach_file) btn_open.grid(row=1, column=0, padx=20, pady=10, sticky=E) btn_open_ttp = CreateToolTip(btn_open, 'Attach file') btn_quit = Button(self.tab_file, image=self.remove_icon, command=self.click_remove_file) btn_quit.grid(row=2, column=0, padx=20, pady=10, sticky=E) btn_quit_ttp = CreateToolTip(btn_quit, 'Remove file') self.canvas_solution = Canvas(self.tab_file, width=350, height=350) self.canvas_solution.config(background='white', borderwidth=1) self.canvas_solution.grid(row=0, column=1, padx=10, pady=10, rowspan=10, sticky=NS) self.tab_control.grid(row=7, column=1, pady=10, sticky=W, columnspan=2) self.canvas_expanded = Canvas(self.tlevel_image_exp, width=500, height=500) self.canvas_expanded.config(background='white', borderwidth=1) self.canvas_expanded.grid() def show_frm(self): self.retrieve_list() self.frm_parent.grid(row=0, column=0, columnspan=9, rowspan=9, pady=10, padx=10) def hide_frm(self): self.frm_parent.grid_forget() self.frm_general.grid_forget() def retrieve_list(self): """ This function shows the existing 'Experimental scenarios for the specified designer' in the home TreeView, if not 'Experimental scenario' then an information box is showed """ # Remove existing elements in the list for item in self.trv_available.get_children(): self.trv_available.delete(item) # Retrieve scenario for current designer self.directive = Message(action=82, information=['my scenarios', self.current_designer.id]) self.connection = self.directive.send_directive(self.connection) # Set visual components with retrieved scenarios for item in self.connection.message.information: elements = item.split('¥') self.trv_available.insert('', 'end', text=elements[0], values=(summarize_text(elements[1], 400),)) if len(self.trv_available.get_children()) != 0: self.trv_available.selection_set(self.trv_available.get_children()[0]) self.select_experimental_scenario() else: self.txt_scenario_desc['state'] = NORMAL self.txt_scenario_desc.delete('1.0', 'end-1c') self.txt_scenario_desc.insert('1.0', 'No experiments available for you') self.txt_scenario_desc['state'] = DISABLED def select_experimental_scenario(self, event=None): """ Retrieves information of the selected experimental scenario form the server and saves in a local variable for future usage, also shows the description of the selected experimental scenario in a textbox """ if self.trv_available.item(self.trv_available.selection())['text'] != '': id_selected_ex_scenario = int(self.trv_available.item(self.trv_available.selection())['text']) # Retrieve id of selected item from TreeView self.directive = Message(action=85, information=[id_selected_ex_scenario]) self.connection = self.directive.send_directive(self.connection) self.experimental_scenario = ExperimentalSC(id=id_selected_ex_scenario, title=self.connection.message.information[0], description=self.connection.message.information[1], access_code=self.connection.message.information[2], state=self.connection.message.information[3], availability=self.connection.message.information[4], id_experiment=self.connection.message.information[6], id_description_diagram=self.connection.message.information[5], connection=self.connection) if self.experimental_scenario.description_diagram is not None: self.file_dd = self.experimental_scenario.description_diagram else: self.file_dd = None # Insert description of the current scenario into visual component self.txt_scenario_desc['state'] = NORMAL self.txt_scenario_desc.delete('1.0', 'end-1c') self.txt_scenario_desc.insert('1.0', self.experimental_scenario.description) self.txt_scenario_desc['state'] = DISABLED def click_enter_scenario(self): """ Shows pop-up window that allows validation of access code for the experimental scenario (necessary before showing the problems of the experimental scenario) """ if self.trv_available.item(self.trv_available.selection())['text'] != '': self.tlevel_auth_scenario.title('Need to authenticate') self.tlevel_auth_scenario.deiconify() self.tlevel_auth_scenario.grab_set() self.txt_auth_scenario.focus_set() def click_authenticate_scenario(self): """ If validation process is correct the the experimental scenario and it's problems are loaded into the visual components """ if self.validate_access_code(): self.load_experiment() self.txt_auth_scenario.delete(0, END) self.tlevel_auth_scenario.grab_release() self.tlevel_auth_scenario.withdraw() self.frm_parent.grid_forget() self.frm_general.grid(row=0, column=0, columnspan=9, rowspan=9, pady=10, padx=10) else: messagebox.showerror(parent=self.tlevel_auth_scenario, title='Wrong access code', message='The access code you provided is wrong, retry') def initialize_component_variables(self): """ Initialize to zero or empty state all variables associated with the resolution of a problem for the designers (solutions and measurements) """ self.attached_file = None self.av_patterns_seen = [] self.solution_time = 0 self.selection_time = [] # Time for selecting solution patterns (may be more than one solution pattern) self.selected_pattern_sol = [] # Indicates that any pattern solution has been selected yet def click_authenticate_cancel(self): """ Cancel validation of access code for an experimental scenario, it hides the validation pop-up window """ self.txt_auth_scenario.delete(0, END) self.tlevel_auth_scenario.grab_release() self.tlevel_auth_scenario.withdraw() def validate_access_code(self): """ Verifies that the provided code matches the stored access code for the selected experimental scenario """ if len(self.txt_auth_scenario.get()) != 0: if self.txt_auth_scenario.get() == self.experimental_scenario.access_code: return True return False def click_next_scenario(self): """ After clicking next scenario component. This method prompts the user to confirm his decision. After confirming the system saves the important information (solutions and measurements) and then continue to the next scenario component if available, otherwise the experiment will be closed """ decision = messagebox.askyesno(parent=self.frm_general, title='Confirmation', message="Are you sure you want to continue? Yo won't be able to make any change " "later") if decision: # Confirmation of action if self.save_changes(): self.problems_counter += 1 if self.problems_counter == len(self.experimental_scenario.problems): # If no more problems available messagebox.showinfo(parent=self.frm_general, title='Experiment', message="This concludes the execution of the experiment. Thank you!") self.finish_experiment() self.clear_visual_components() self.hide_frm() self.show_frm() else: # If another scenario component available messagebox.showinfo(parent=self.frm_general, title='Next problem', message="You are about to start a new problem, press Ok when you are ready.") self.clear_visual_components() self.initialize_component_variables() self.load_problem() def save_changes(self): # Validate any problem with info inserted into visual components if self.validate_component_frm(): # No problem, proceed to save info self.solution_time += self.time_thread.seconds self.time_thread.stop() # Stop thread timer acquisition_end_date = datetime.now() # Get measurements of important metrics for the current component problem_id = self.experimental_scenario.problems[self.problems_counter].id current_measurements = [] # Solution time measurement_1 = Measurement(value=float(self.solution_time), acquisition_start_date=self.acquisition_start_date, acquisition_end_date=acquisition_end_date, id_metric=1, id_designer=self.current_designer.id, id_problem=problem_id) current_measurements.append(measurement_1) # Save measurements associated with patterns only when these are available for designer if self.pattern_decision: # Selection time # Getting average if more than one value for this metric selection_time = 0 if len(self.selection_time) == 0 else sum(self.selection_time) / len(self.selection_time) measurement_2 = Measurement(value=float(selection_time), acquisition_start_date=self.acquisition_start_date, acquisition_end_date=acquisition_end_date, id_metric=2, id_designer=self.current_designer.id, id_problem=problem_id) current_measurements.append(measurement_2) # Viewed patterns measurement_3 = Measurement(value=float(len(self.av_patterns_seen)), acquisition_start_date=self.acquisition_start_date, acquisition_end_date=acquisition_end_date, id_metric=3, id_designer=self.current_designer.id, id_problem=problem_id) current_measurements.append(measurement_3) # Chosen patterns measurement_4 = Measurement(value=float(self.lbx_sel_patterns.size()), acquisition_start_date=self.acquisition_start_date, acquisition_end_date=acquisition_end_date, id_metric=4, id_designer=self.current_designer.id, id_problem=problem_id) current_measurements.append(measurement_4) for item in current_measurements: self.directive = Message(action=96, information=[item.value, item.acquisition_start_date, item.acquisition_end_date, item.id_metric, item.id_designer, item.id_problem]) self.connection = self.directive.send_directive(self.connection) # Get info and build the solution to send to the server # Create diagram in DB id_diagram = None if self.attached_file is not None: self.directive = Message(action=61, information=[self.attached_file.file_bytes, self.attached_file.name, 'sent sol']) self.connection = self.directive.send_directive(self.connection) id_diagram = self.connection.message.information[0] # Create object for the solution solution_aux = Solution(annotations=self.txt_solution_desc.get('1.0', 'end-1c'), diagram_id=id_diagram, patterns_id=self.sel_patterns_ids) # Create the solution in DB self.directive = Message(action=101, information=[solution_aux.annotations, solution_aux.diagram_id, self.current_designer.id, problem_id, solution_aux.patterns_id]) self.connection = self.directive.send_directive(self.connection) return True return False def finish_experiment(self): """ This section checks in the server if current designer is the last of the current experimental scenario, and if True changes it's state to finished, otherwise the state remains in executed """ self.directive = Message(action=83, information=['finished', self.experimental_scenario.id]) self.connection = self.directive.send_directive(self.connection) def validate_component_frm(self): if self.pattern_decision: if self.lbx_sel_patterns.size() == 0: messagebox.showwarning(parent=self.frm_general, title='Missing information', message="You haven't selected any pattern") return False if len(self.txt_solution_desc.get('1.0', 'end-1c')) == 0: messagebox.showwarning(parent=self.frm_general, title='Missing information', message='You must add notes to your solution') return False return True def click_attach_file(self): """ Create a File object that is uploaded by the user, validating that there is not a file uploaded already. """ if self.attached_file is None: filename = filedialog.askopenfilename(initialdir=os.getcwd(), title="Select image file", filetypes=[("Diagrams", ".jpg .png .tiff")]) if not filename: return # user cancelled; stop this method self.attached_file = File() self.attached_file.read_file(filename) # Display image into canvas load = Image.open(self.attached_file.filename) load = load.resize((350, 350), Image.ANTIALIAS) self.render = ImageTk.PhotoImage(load) if self.attached_file.image is not None: # if an image was already loaded self.canvas_solution.delete(self.attached_file.image) # remove the previous image self.attached_file.image = self.canvas_solution.create_image(0, 0, anchor='nw', image=self.render) def click_remove_file(self): """ Remove an uploaded file from the system validating it is already uploaded. This method also delete any image in the canvas that may be fulfilled with an image. """ if self.attached_file is not None: # if an image was already loaded self.canvas_solution.delete(self.attached_file.image) self.attached_file = None def click_add_patt(self): """ Adds a pattern to the selected pattern listbox (when available to the designer). """ element = self.lbx_av_patterns.curselection() if element is not None: # Check if listbox is selected index = element[0] id_selected = self.av_patterns_ids[index] if not id_selected in self.sel_patterns_ids: # Check if current pattern_id is not in the 'selected patterns list' if id_selected in self.current_ideal_patterns and not id_selected in self.selected_pattern_sol: # Check if selected pattern matches ideal patterns and for the first time self.selected_pattern_sol.append(id_selected) self.selection_time.append(self.time_thread.seconds) for item in self.available_patterns: if item.id == id_selected: # Find selected pattern in available patterns list self.selected_pattern = item break self.sel_patterns_ids.append(id_selected) # Append pattern_id to selected patterns ids self.lbx_sel_patterns.insert(END, self.selected_pattern.get_joined_main_s()) # Insert pattern name into selected listbox patters self.check_selected_patterns() def click_remove_patt(self): """ Removes a pattern from the selected pattern listbox (when available to the designer). """ element = self.lbx_sel_patterns.curselection() if element is not None: # Check if listbox is selected if element: index = element[0] id_selected = self.sel_patterns_ids[index] self.lbx_sel_patterns.delete(element) # Remove from listbox if id_selected in self.current_ideal_patterns and id_selected in self.selected_pattern_sol: # Check if selected pattern matches ideal patterns and if the the selected pattern correspond to the one selected previously as the pattern solution del self.selection_time[self.selected_pattern_sol.index(id_selected)] self.selected_pattern_sol.remove(id_selected) for item in reversed(self.sel_patterns_ids): if item == id_selected: self.sel_patterns_ids.remove(item) break self.check_selected_patterns() def click_expand_pd(self): # Fill canvas with retrieved image load = Image.open(self.file_pd.filename) load = load.resize((500, 500), Image.ANTIALIAS) self.render_pd = ImageTk.PhotoImage(load) self.canvas_expanded.delete() self.file_pd.image = self.canvas_expanded.create_image(0, 0, anchor='nw', image=self.render_pd) # and display new image self.tlevel_image_exp.deiconify() self.tlevel_image_exp.grab_set() def click_expand_dd(self): # Fill canvas with retrieved image load = Image.open(self.file_dd.filename) load = load.resize((500, 500), Image.ANTIALIAS) self.render_dd = ImageTk.PhotoImage(load) self.canvas_expanded.delete() self.file_dd.image = self.canvas_expanded.create_image(0, 0, anchor='nw', image=self.render_dd) # and display new image self.tlevel_image_exp.deiconify() self.tlevel_image_exp.grab_set() def close_tlevel_image(self): self.tlevel_image_exp.grab_release() self.tlevel_image_exp.withdraw() def clear_visual_components(self): self.txt_prob_desc['state'] = NORMAL self.txt_prob_desc.delete('1.0', 'end-1c') self.lbx_av_patterns.delete(0, END) self.lbx_sel_patterns.delete(0, END) self.txt_pattern_content['state'] = NORMAL self.txt_pattern_content.delete('1.0', 'end-1c') self.txt_pattern_content['state'] = DISABLED self.txt_solution_desc.delete('1.0', 'end-1c') if self.attached_file is not None: # if an image was already loaded self.canvas_solution.delete(self.attached_file.image) self.attached_file = None self.tab_control.tab(0, image=self.incomplete_icon) self.tab_control.tab(1, image=self.incomplete_icon) def load_experiment(self): # Retrieve all information of problems of current scenario self.experimental_scenario.retrieve_problems(Pattern.get_available_patterns(self.connection)) self.initialize_component_variables() self.problems_counter = 0 self.current_designer.get_current_role( self.experimental_scenario.id) # Get role for current experimental scenario # Retrieve patterns for designer in current experimental scenario self.directive = Message(action=42, information=[self.experimental_scenario.id, 1 if self.current_designer.current_group == 'experimental' else 2]) self.connection = self.directive.send_directive(self.connection) self.available_patterns = Pattern.get_patterns(self.connection, self.connection.message.information) # Make patterns visible if the patterns are available for current designer in current experimental scenario if self.available_patterns: self.tab_control.tab(0, state='normal') self.tab_control.select(0) self.pattern_decision = True else: self.tab_control.tab(0, state='hidden') self.tab_control.select(1) self.pattern_decision = False self.btn_view_dd.grid_forget() if self.experimental_scenario.description_diagram is not None: self.btn_view_dd.grid(row=1, column=5, padx=10, pady=10, sticky=N) self.lbl_exp_title['text'] = 'Experiment: {}'.format(self.experimental_scenario.title) self.txt_exp_desc['state'] = NORMAL self.txt_exp_desc.delete('1.0', 'end-1c') self.txt_exp_desc.insert('1.0', self.experimental_scenario.description) self.txt_exp_desc['state'] = DISABLED self.load_problem() def load_problem(self): # Ask for available patterns in current problem for the current designer, depending of the role self.lbl_prob_title['text'] = 'Problem {} of {}: {}'.format(self.problems_counter + 1, len(self.experimental_scenario.problems), self.experimental_scenario.problems[self.problems_counter].brief_description) self.txt_prob_desc['state'] = NORMAL self.txt_prob_desc.delete('1.0', 'end-1c') self.txt_prob_desc.insert('1.0', self.experimental_scenario.problems[self.problems_counter].description) self.txt_prob_desc['state'] = DISABLED self.av_patterns_ids = [] self.sel_patterns_ids = [] for item in self.available_patterns: self.av_patterns_ids.append(item.id) self.lbx_av_patterns.insert(END, item.get_joined_main_s()) self.current_ideal_patterns = self.experimental_scenario.problems[self.problems_counter].solution.patterns_id # Get the patterns of the ideal solution for current problem # Make patterns visible if the patterns are available for current designer in current experimental scenario if self.pattern_decision: self.tab_control.select(0) else: self.tab_control.select(1) self.btn_view_pd.grid_forget() self.time_thread = TimerClass() self.time_thread.begin() self.acquisition_start_date = datetime.now() def select_available_pattern(self, event): id_selected = self.av_patterns_ids[self.lbx_av_patterns.curselection()[0]] # Add selected pattern to the seen pattern (metric) if not id_selected in self.av_patterns_seen: self.av_patterns_seen.append(id_selected) # Retrieve info of the selected pattern (in available patterns list) for item in self.available_patterns: if item.id == id_selected: self.selected_pattern = item break # Set visual components depending on the selected pattern and its info self.btn_view_pd.grid_forget() self.txt_pattern_content['state'] = NORMAL self.txt_pattern_content.delete('1.0', 'end-1c') for item in self.selected_pattern.sections: self.txt_pattern_content.insert('end-1c', item.name + ": ") if item.data_type == 'File': # The section content is a file if item.diagram_id != 0: self.directive = Message(action=65, information=[item.diagram_id]) self.connection = self.directive.send_directive(self.connection) self.file_pd = File() self.file_pd.write_file(self.connection.message.information[0], self.connection.message.information[1]) self.btn_view_pd.grid(row=0, column=9, sticky=E) self.txt_pattern_content.insert('end-1c', "\nClick up button to see diagram ^\n\n") else: self.file_pd = None self.txt_pattern_content.insert('end-1c', "\nNo diagram loaded for this section\n\n") else: self.txt_pattern_content.insert('end-1c', "\n" + item.content + "\n\n") self.txt_pattern_content['state'] = DISABLED def txt_notes_modified(self, event): """ Method that checks if text box of additional notes (solution) is filled or not, so tab image is selected """ if self.txt_solution_desc.get('1.0', 'end-1c') != '': self.tab_control.tab(1, image=self.complete_icon) else: self.tab_control.tab(1, image=self.incomplete_icon) def check_selected_patterns(self): """ Method that checks if list box of selected patterns (solution) is filled or not, so tab image is selected """ if self.lbx_sel_patterns.size() != 0: self.tab_control.tab(0, image=self.complete_icon) else: self.tab_control.tab(0, image=self.incomplete_icon)
class i2c(Frame) : def __init__(self,master): self.master = master self.SclIn = 0 self.SdaIn = 0 self.decode_index = [] self.decode_state1 = [] self.decode_state2 = [] self.decode_position = [] self.decode_text = [] def set_decode(self,channelStates): self.top = Toplevel(self.master) self.top.geometry("300x150") self.top.title("i2c") self.top.grab_set() self.SDAlab = Label(self.top, text="SDA:") self.SDAlab.place(x = 80,y = 20) self.SCLlab = Label(self.top, text="SCL:") self.SCLlab.place(x = 80,y = 50) self.SdaCombo = Combobox(self.top, state="readonly",width = 8) self.SdaCombo.place(x = 140,y = 20) self.SclCombo = Combobox(self.top, state="readonly",width = 8) self.SclCombo.place(x = 140,y = 50) scl_in_temp = 100 sda_in_temp = 100 for i in range(0,len(channelStates)): if(channelStates[i] == 1 and i == self.SclIn): scl_in_temp = i if(channelStates[i] == 1 and i == self.SdaIn): sda_in_temp = i for i in range(0,len(channelStates)): if(channelStates[i] == 1 and scl_in_temp == 100): scl_in_temp = i if(channelStates[i] == 1 and sda_in_temp == 100): sda_in_temp = i if (scl_in_temp == 100): scl_in_temp = 0 if (sda_in_temp == 100): sda_in_temp = 0 self.SclIn = scl_in_temp self.SdaIn = sda_in_temp self.SdaCombo['values'] += (str(self.SdaIn)) self.SclCombo['values'] += (str(self.SclIn)) for i in range(0,len(channelStates)): if (channelStates[i] == 1): if str(i) not in self.SdaCombo['values']: self.SdaCombo['values'] += (str(i),) if str(i) not in self.SclCombo['values']: self.SclCombo['values'] += (str(i),) self.Button = Button(self.top, text = "OK",height=2, width=18, command = self.OkCallBack) self.Button.place(x = 80,y = 90) self.SclCombo.current(0) self.SdaCombo.current(0) self.top.protocol('WM_DELETE_WINDOW', self.exit_handler) self.top.mainloop() def decode(self,results,max_index,frequence): print (results[self.SdaIn][100:4]) self.decode_index = [] self.decode_state1 = [] self.decode_state2 = [] self.decode_position = [] self.decode_text = [] self.decode_index.append(0) self.decode_state1.append(1) self.decode_state2.append(0) self.bit_count = 0 self.data = 0 self.decodeStrTmp = "" for i in range(1,max_index): if ((results[self.SclIn][i-1]==1 and results[self.SdaIn][i-1]==1) and (results[self.SclIn][i]==1 and results[self.SdaIn][i]==0) and self.bit_count == 0):#START self.add_point(i) self.decodeStrTmp += "St" self.decode_position.append(i-((i-self.decode_index[-1])/2)) self.decode_text.append(self.decodeStrTmp) self.decodeStrTmp = "" self.bit_count = 1 elif ((results[self.SclIn][i-1]==1 and results[self.SdaIn][i-1]==0) and (results[self.SclIn][i]==1 and results[self.SdaIn][i]==1)):#STOP self.decode_position.append(i-((i-self.decode_index[-1])/2)) self.decodeStrTmp += "Sp" self.decode_text.append(self.decodeStrTmp) self.decodeStrTmp = "" self.add_point(i) self.bit_count = 0 elif(self.bit_count > 0 and self.bit_count < 8 and results[self.SclIn][i]==1 and results[self.SclIn][i-1]==0):#ADRESS if(self.bit_count==1): self.data = 0 self.add_point(i) self.data = self.data<<1 self.data += results[self.SdaIn][i] if(self.bit_count==7): self.decodeStrTmp = str(hex(self.data)) self.data = 0 self.bit_count += 1 elif(self.bit_count == 8 and results[self.SclIn][i]==1 and results[self.SclIn][i-1]==0):#READ/WRITE if(results[self.SdaIn][i] == 1): self.decodeStrTmp = self.decodeStrTmp + "+R" else: self.decodeStrTmp = self.decodeStrTmp + "+W" self.decode_position.append(i-((i-self.decode_index[-1])/2)) self.decode_text.append(self.decodeStrTmp) self.decodeStrTmp = "" self.bit_count = 30 elif((self.bit_count == 9 or self.bit_count == 18) and results[self.SclIn][i]==1 and results[self.SclIn][i-1]==0):#ACK if(results[self.SdaIn][i] == 1): self.decodeStrTmp = self.decodeStrTmp + "NACK" else: self.decodeStrTmp = self.decodeStrTmp + "ACK" self.bit_count = 31 self.decode_position.append(i-((i-self.decode_index[-1])/2)) self.decode_text.append(self.decodeStrTmp) self.decodeStrTmp = "" elif(self.bit_count > 9 and self.bit_count < 18 and results[self.SclIn][i]==1 and results[self.SclIn][i-1]==0):#DATA if(self.bit_count==10): self.data = 0 self.data = (self.data<<1) & results[self.SdaIn][i] if(self.bit_count==17): self.decodeStrTmp = str(hex(self.data)) self.data = 0 self.bit_count += 1 elif(self.bit_count == 30 and results[self.SclIn][i]==0 and results[self.SclIn][i-1]==1): self.bit_count = 9 self.add_point(i) elif(self.bit_count == 31 and results[self.SclIn][i]==0 and results[self.SclIn][i-1]==1): self.bit_count = 10 self.add_point(i) def OkCallBack(self): self.SdaIn = int(self.SdaCombo.get()) self.SclIn = int(self.SclCombo.get()) self.exit_handler() def exit_handler(self): #self.master.deiconify() self.top.grab_release() self.top.destroy() def add_point(self,i): self.decode_index.append(i) self.decode_state1.append(self.decode_state1[-1]) self.decode_state2.append(self.decode_state2[-1]) self.decode_index.append(i+0.5) self.decode_state1.append(1-self.decode_state1[-1]) self.decode_state2.append(1-self.decode_state2[-1])
class uart(Frame) : def __init__(self,master): self.master = master self.dataPin = 0 self.baudRate = 9600 self.parity = 0 self.PusleWidth = 1.0 self.decode_index = [] self.decode_state1 = [] self.decode_state2 = [] self.decode_position = [] self.decode_text = [] def set_decode(self,channelStates): #self.master.withdraw() self.top = Toplevel(self.master) self.top.geometry("300x160") self.top.title("uart") self.top.grab_set() self.datalab = Label(self.top, text="data pin:") self.datalab.place(x = 80,y = 20) self.baudlab = Label(self.top, text="baud rate:") self.baudlab.place(x = 80,y = 50) self.dataCombo = Combobox(self.top, state="readonly",width = 8) self.dataCombo.place(x = 140,y = 20) #self.SdaCombo.current(0) self.BaudVar = StringVar() self.BaudVar.set(str(self.baudRate)) self.BaudEntry = Entry(self.top, width=11,textvariable = self.BaudVar) self.BaudEntry.place(x = 140,y = 50) data_in_temp = 100 for i in range(0,len(channelStates)): if(channelStates[i] == 1 and i == self.dataPin): data_in_temp = i for i in range(0,len(channelStates)): if(channelStates[i] == 1 and data_in_temp == 100): data_in_temp = i if (data_in_temp == 100): data_in_temp = 0 self.dataPin = data_in_temp self.dataCombo['values'] += (str(self.dataPin)) for i in range(0,len(channelStates)): if (channelStates[i] == 1): if str(i) not in self.dataCombo['values']: self.dataCombo['values'] += (str(i),) self.parity_var = IntVar() self.CB1 = Checkbutton(self.top, text='Parity bit', variable=self.parity_var, onvalue=1, offvalue=0) # self.CB1.place(x = 140,y = 80) self.parity_var.set(self.parity) self.Button = Button(self.top, text = "OK", height=2, width=18, command = self.OkCallBack) self.Button.place(x = 80,y = 110) self.dataCombo.current(0) self.top.protocol('WM_DELETE_WINDOW', self.exit_handler) self.top.mainloop() def decode(self,results,max_index,frq): self.decode_index = [] self.decode_state1 = [] self.decode_state2 = [] self.decode_position = [] self.decode_text = [] self.decode_index.append(0) self.decode_state1.append(1) self.decode_state2.append(0) self.bit_count = 0 self.data = 0 self.decodeStrTmp = "" self.PulseWidth = frq / self.baudRate i = 0 while i < max_index: if (results[self.dataPin][i-1]==1 and results[self.dataPin][i]==0):#START offsetStart = int(round(self.PulseWidth)) offset8 = int(round(self.PulseWidth * 8 + self.PulseWidth/2)) self.add_point(i) self.decode_position.append(i+(self.PulseWidth/5)) self.decode_text.append("St") offsetDecode = (offset8 - offsetStart)//2 self.data = 0 for d in range(0,8): self.data = self.data>>1 offset = int(round(self.PulseWidth * (d+1) + self.PulseWidth/2)) self.data += results[self.dataPin][i+offset] * 128 self.add_point(i+offsetStart) self.decode_position.append(i+offsetDecode) self.decode_text.append(str(hex(self.data))) if(self.parity == 0): offsetStop = int(round(self.PulseWidth * 9)) self.add_point(i+offsetStop) self.decode_position.append(i+offsetStop+ (self.PulseWidth/5)) self.decode_text.append("Sp") else: offsetParity = int(round(self.PulseWidth * 9)) offsetStop = int(round(self.PulseWidth * 10)) self.add_point(i+offsetParity) self.decode_position.append(i+offsetParity+ (self.PulseWidth/5)) self.decode_text.append(str(results[self.dataPin][i+int(offsetParity + self.PulseWidth/2)])) self.add_point(i+offsetStop) self.decode_position.append(i+ offsetStop + (self.PulseWidth/5)) self.decode_text.append("Sp") i+=offsetStop i+=1 else: i+=1 def OkCallBack(self): self.dataPin = int(self.dataCombo.get()) self.baudRate = int(self.BaudVar.get()) self.exit_handler() self.parity = self.parity_var.get() def exit_handler(self): self.top.grab_release() self.top.destroy() def add_point(self,i): self.decode_index.append(i) self.decode_state1.append(self.decode_state1[-1]) self.decode_state2.append(self.decode_state2[-1]) self.decode_index.append(i+0.5) self.decode_state1.append(1-self.decode_state1[-1]) self.decode_state2.append(1-self.decode_state2[-1])