def __init__(self, kernel, master=None): Frame.__init__(self, master) self.kernel = kernel self.grid() self.master.title("YuMi experiment") self.client_tuple = None self.master.protocol("WM_DELETE_WINDOW", self.kernel.close_setup) #self.master.geometry("100x100+500+100") config = self.kernel.read_config() frame_session_type = Frame(self.master, relief=GROOVE, borderwidth=2) frame_participant = Frame(self.master, relief=GROOVE, borderwidth=2) frame_data_bases = Frame(self.master, relief=GROOVE, borderwidth=2) frame_server = Frame(self.master, relief=GROOVE, borderwidth=2) # Session type self.rbType = StringVar(self.master) lbl1 = Label(frame_session_type, text="Session type") rb1 = Radiobutton(frame_session_type, text="Hololens", variable=self.rbType, value="hololens", command=self.type) rb2 = Radiobutton(frame_session_type, text="Monitor", variable=self.rbType, value="monitor", command=self.type) rb3 = Radiobutton(frame_session_type, text="Dialogue", variable=self.rbType, value="dialogue", command=self.type) rb4 = Radiobutton(frame_session_type, text="Projector", variable=self.rbType, value="projector", command=self.type) self.rbType.set("hololens") rb1.select() rb2.deselect() rb3.deselect() rb4.deselect() lbl1.grid(row=0, column=0, sticky=W+N) rb1.grid(row=1, column=0, sticky=W+N) rb2.grid(row=2, column=0, sticky=W+N) rb3.grid(row=3, column=0, sticky=W+N) rb4.grid(row=4, column=0, sticky=W+N) # Data base self.data_base_path = config["data_base_path"] try: listdir(self.data_base_path) except FileNotFoundError: self.data_base_path = dirname(__file__) data_files = [f for f in listdir(self.data_base_path) if isfile(join(self.data_base_path, f))] data_files = [files for files in data_files if ".csv" in files] self.data_file = StringVar(master) if len(data_files) == 0: data_files.append("No data found") self.data_file.set(data_files[0]) lbl2 = Label(frame_data_bases, text="Data base") btn_browse = Button(frame_data_bases, text="Browse", command=self.kernel.browse_db) self.db_drop = OptionMenu(frame_data_bases, self.data_file, *data_files, command=self.kernel.set_db) self.data_base_file = join(self.data_base_path, self.data_file.get()) lbl_db1 = Label(frame_data_bases, text="Found in:") lbl_db2 = Label(frame_data_bases, text="Choose:") lbl_text = self.data_base_path if len(lbl_text) > 30: lbl_text = "..." + lbl_text[-30:] self.lbl_db3 = Label(frame_data_bases, text=lbl_text) lbl2.grid(row=0, column=0, columnspan=1, sticky=W+N) lbl_db2.grid(row=1, column=0, columnspan=1, sticky=W+N) self.db_drop.grid(row=1, column=1, columnspan=3, sticky=E+N) lbl_db1.grid(row=2, column=0, columnspan=1, sticky=W+N) self.lbl_db3.grid(row=2, column=1, columnspan=3, sticky=W+N) btn_browse.grid(row=3, column=3, sticky=E+N) # Participant self.write_to_path = config["write_to_path"] try: listdir(self.write_to_path) except FileNotFoundError: self.write_to_path = dirname(__file__) part_dirs = [f for f in listdir(self.write_to_path) if isdir(join(self.write_to_path, f))] part_dirs = [dirs for dirs in part_dirs if "participant" in dirs] parts = [" ".join(part.split("_")[0:2]) for part in part_dirs] self.participant = StringVar() self.participant.set("New participant") # default value parts = [self.participant.get()] + parts lbl_part = Label(frame_participant, text="Name:") self.part_entry = Entry(frame_participant, textvariable=self.participant) lbl3 = Label(frame_participant, text="Participant") lbl_text = self.write_to_path if len(lbl_text) > 10: lbl_text = "..." + lbl_text[-10:] self.lbl4 = Label(frame_participant, text=lbl_text) lbl5 = Label(frame_participant, text="Save to:") self.dropdown_participant = OptionMenu(frame_participant, self.participant, *parts) btn_browse2 = Button(frame_participant, text="Browse", command=self.kernel.browse_part) lbl_part.grid(row=1, column=0, sticky=W+N) self.part_entry.grid(row=1, column=1, sticky=W+N) lbl3.grid(row=0, column=0, sticky=W+N) self.dropdown_participant.grid(row=2, column=1, columnspan=2, sticky=W+N+E) lbl5.grid(row=3, column=0, columnspan=1, sticky=W+N) self.lbl4.grid(row=3, column=1, sticky=W+N) btn_browse2.grid(row=4, column=1, sticky=E+N) # Server self.addr = StringVar(master) self.addrs = config["server_adrs"].split(";") self.addr.set(self.addrs[0]) self.port = StringVar(master) self.ports = config["server_ports"].split(";") self.port.set(self.ports[0]) lbl6 = Label(frame_server, text="Connect to server") lbl7 = Label(frame_server, text="Server address:") lbl8 = Label(frame_server, text="Server port:") self.rbServer1 = StringVar(self.master) rb4 = Radiobutton(frame_server, text="", variable=self.rbServer1, value="entry", command=self.server1) rb5 = Radiobutton(frame_server, text="", variable=self.rbServer1, value="list", command=self.server1) self.rbServer1.set("entry") rb4.select() rb5.deselect() self.adr_entry = Entry(frame_server, textvariable=self.addr) self.adr_drop = OptionMenu(frame_server, self.addr, *self.addrs) self.adr_drop['state'] = 'disabled' self.rbServer2 = StringVar(self.master) rb6 = Radiobutton(frame_server, text="", variable=self.rbServer2, value="entry", command=self.server2) rb7 = Radiobutton(frame_server, text="", variable=self.rbServer2, value="list", command=self.server2) rb6.select() rb7.deselect() self.rbServer2.set("entry") self.port_entry = Entry(frame_server, textvariable=self.port) self.port_drop = OptionMenu(frame_server, self.port, *self.ports) self.port_drop['state'] = 'disabled' lbl8 = Label(frame_server, text="Status:") lbl_text = "Not connected" if self.kernel.client_tuple: lbl_text = "Connected to {}".format(self.kernel.client_tuple[0].host) self.lbl9 = Label(frame_server, text=lbl_text) btn_connect = Button(frame_server, text="Connect", command=self.kernel.connect) lbl6.grid(row=0, column=0, sticky=W+E+N+S) lbl7.grid(row=1, column=0, rowspan=2, sticky=W) rb4.grid(row=1, column=2, columnspan=1, rowspan=1, sticky=W) self.adr_entry.grid(row=1, column=3, columnspan=1, rowspan=1, sticky=W+E+N+S) rb5.grid(row=2, column=2, columnspan=1, rowspan=1, sticky=W) self.adr_drop.grid(row=2, column=3, columnspan=1, rowspan=1, sticky=W+E+N+S) lbl8.grid(row=3, column=0, rowspan=2, sticky=W) rb6.grid(row=3, column=2, columnspan=1, rowspan=1, sticky=W) self.port_entry.grid(row=3, column=3, columnspan=1, rowspan=1, sticky=W+E+N+S) rb7.grid(row=4, column=2, columnspan=1, rowspan=1, sticky=W) self.port_drop.grid(row=4, column=3, columnspan=1, rowspan=1, sticky=W+E+N+S) lbl8.grid(row=5, column=0, columnspan=1, rowspan=1, sticky=W) self.lbl9.grid(row=5, column=3, columnspan=1, rowspan=1, sticky=W) btn_connect.grid(row=6, column=3, columnspan=1, rowspan=1, sticky=W) # Layout btn_launch = Button(self.master, text="Launch", command=self.kernel.launch) frame_session_type.grid(row=0,column=0, columnspan=1, rowspan=1, sticky=W+E+N+S) frame_data_bases.grid(row=1, column=1, columnspan=1, rowspan=1, sticky=W+E+N+S) frame_participant.grid(row=1, column=0, columnspan=1, rowspan=1, sticky=W+E+N+S) frame_server.grid(row=0, column=1, columnspan=1, rowspan=1, sticky=W+E+N+S) btn_launch.grid(row=2, column=1, sticky=E)
def launch(self): self.grid() self.master.title(self.title) self.master.geometry("950x950+500+100") # Use this list to keep references to the images used in the buttons. Without a reference # the garbage collector will remove them! self.images = [] # Create option frame where the buttons are located and the view frame where the images # are shown self.master.rowconfigure(1, weight=1) self.master.columnconfigure(0, weight=1) self.master.bind('<Configure>', self.kernel.layout) self.master.protocol("WM_DELETE_WINDOW", self.kernel.close_filter) self.option_frame = Frame(self.master, bg="white") self.option_frame.grid(row=0, column=0, sticky=W + E + N + S) self.view_canvas = ttk.Canvas(self.master, borderwidth=0, background="white") self.view_frame = Frame(self.view_canvas, background="white") self.vsb = Scrollbar(self.master, orient="vertical", command=self.view_canvas.yview) self.view_canvas.configure(yscrollcommand=self.vsb.set) self.vsb.grid(row=1, column=0, sticky=E + N + S) self.view_canvas.grid(row=1, column=0, sticky=W + E + N + S) self.view_canvas.create_window((4, 4), window=self.view_frame, anchor="nw", tags="self.frame") self.view_frame.bind("<Configure>", self.onFrameConfigure) # This list is used to keep a reference of the images displayed in the view frame. self.photos = [] # This list is to be able to reference the labels and delete them when the filter # is updated. self.view_labels = [] self.view_checks = [] self.view_ch_val = [] btn_frame = Frame(self.option_frame, bg="white") btn_frame.grid(row=0, column=2, rowspan=1, padx=(30, 30), sticky=W + E + N + S) btn = Button(btn_frame, text="Pick", command=self.kernel.send_pick) btn.grid(row=0, column=0, padx=(5, 5), sticky=N + W + E) btn = Button(btn_frame, text="Point", command=self.kernel.send_point) btn.grid(row=1, column=0, padx=(5, 5), sticky=N + W + E) btn = Button(btn_frame, text="Show labels", command=self.kernel.send_showLabels) btn.grid(row=2, column=0, padx=(5, 5), sticky=N + W + E) self.start_btn = Button(btn_frame, text="Start", command=self.kernel.start) self.start_btn.grid(row=0, column=1, padx=(5, 5), sticky=N + W + E) btn = Button(btn_frame, text="End session", command=self.kernel.close_filter) btn.grid(row=1, column=1, padx=(5, 5), sticky=N + W + E) btn = Button(btn_frame, text="Unselect all", command=self.kernel.unselect) btn.grid(row=2, column=1, padx=(5, 5), sticky=N + W + E) btn = Button(btn_frame, text="Remove", command=self.kernel.find_and_remove) btn.grid(row=3, column=1, padx=(5, 5), sticky=N + W + E) btn = Button(btn_frame, text="Hide labels", command=self.kernel.send_hideLabels) btn.grid(row=3, column=0, padx=(5, 5), sticky=N + W + E) btn = Button(btn_frame, text="Clear", command=self.kernel.send_clear) btn.grid(row=0, column=3, padx=(5, 5), sticky=N + W + E) btn = Button(btn_frame, text="Planning failed", command=self.kernel.send_sorryPlanning) btn.grid(row=1, column=3, padx=(5, 5), sticky=N + W + E) btn = Button(btn_frame, text="Grasping failed", command=self.kernel.send_sorryGrasping) btn.grid(row=2, column=3, padx=(5, 5), sticky=N + W + E) btn = Button(btn_frame, text="Not understand", command=self.kernel.send_badRequest) btn.grid(row=3, column=3, padx=(5, 5), sticky=N + W + E) btn = Button(btn_frame, text="New request", command=self.kernel.send_newRequest) btn.grid(row=2, column=2, padx=(5, 5), sticky=N + W + E) self.send = IntVar() self.send.set(1) Checkbutton(btn_frame, text="Send data to server", variable=self.send, bg="white").grid(row=3, column=2, sticky=N + W + E) img1 = ImageTk.PhotoImage( PIL.Image.open( resource_filename("Commands.resources.images", "back.png"))) self.init_lbl = Label(btn_frame, image=img1, bg="white") self.init_lbl.grid(row=0, column=2, padx=(5, 5), sticky=N + W + E) self.images.append(img1) # Set up the option frame. Start with the color radiobuttons self.color_frame = Frame(self.option_frame, background="white") self.color_frame.grid(row=0, column=0, rowspan=2, padx=(30, 30), sticky=W + E + N + S) lbl = Label(self.color_frame, text="Color filter", background="white") lbl.grid(row=0, column=0, columnspan=5) self.color = StringVar() self.color.set("all") colors = self.kernel.get_colors() image = PIL.Image.open( resource_filename("Commands.resources.images", "default_dont_know.png")) photo_def = ImageTk.PhotoImage(image) image_select = PIL.Image.open( resource_filename("Commands.resources.images", "default_dont_know_sel.png")) photo_select_def = ImageTk.PhotoImage(image_select) rb1 = Radiobutton(self.color_frame, image=photo_def, selectimage=photo_select_def, variable=self.color, value="all", command=lambda: self.kernel.update_filter(self), indicatoron=False) rb1.grid(row=1, column=0, rowspan=2, sticky=W + E + N + S) self.images.append(photo_select_def) self.images.append(photo_def) for i, col in enumerate(colors): image = PIL.Image.open( resource_filename("Commands.resources.images", "{}.png".format(col))) photo = ImageTk.PhotoImage(image) image_select = PIL.Image.open( resource_filename("Commands.resources.images", "{}_sel.png".format(col))) photo_select = ImageTk.PhotoImage(image_select) rb = Radiobutton(self.color_frame, image=photo, selectimage=photo_select, variable=self.color, value=col, command=lambda: self.kernel.update_filter(self), indicatoron=False) rb.grid(row=(int((i + 1) / 5) * 2) + 1, column=(i + 1) % 5, rowspan=2, sticky=W + E + N + S) rb.deselect() self.images.append(photo_select) self.images.append(photo) self.shape_frame = Frame(self.option_frame, background="white") self.shape_frame.grid(row=0, column=1, rowspan=2, padx=(30, 30), sticky=W + E + N + S) lbl = Label(self.shape_frame, text="Shape filter", background="white") lbl.grid(row=0, column=0, columnspan=5) self.shape = StringVar() self.shape.set("all") shapes = self.kernel.get_shapes() rb1 = Radiobutton(self.shape_frame, image=photo_def, selectimage=photo_select_def, variable=self.shape, value="all", command=lambda: self.kernel.update_filter(self), indicatoron=False) rb1.grid(row=1, column=0, rowspan=2, sticky=W + E + N + S) for i, sha in enumerate(shapes): image = PIL.Image.open( resource_filename("Commands.resources.images", "shape_{}.png".format(sha))) photo = ImageTk.PhotoImage(image) image_select = PIL.Image.open( resource_filename("Commands.resources.images", "shape_{}_sel.png".format(sha))) photo_select = ImageTk.PhotoImage(image_select) rb = Radiobutton(self.shape_frame, image=photo, selectimage=photo_select, variable=self.shape, value=sha, command=lambda: self.kernel.update_filter(self), indicatoron=False) rb.grid(row=(int((i + 1) / 5) * 2) + 1, column=(i + 1) % 5, rowspan=2, sticky=W + E + N + S) rb.deselect() self.images.append(photo_select) self.images.append(photo) self.kernel.update_filter(self)