class index_select(Frame):
    def __init__(self,controller,current_model,master,*args,**kwargs):
        self.controller = controller
        self.current_model = current_model
        self.filtered_list = None
        self.saved_selection = None

        from tkinter import EXTENDED,Scrollbar,Y

        #dibujar widget
        super().__init__(master, *args, **kwargs)

        f_st=Frame(self)
        Label(f_st,text="Current_index: ").pack()
        Label(f_st, text="Current_filter: ").pack()
        f_st.pack()

        frame_index_listbox = Frame(self)
        self.listbox = Listbox(frame_index_listbox, exportselection=False,selectmode=EXTENDED)
        self.listbox.pack(side=LEFT)

        scrollbar = Scrollbar(frame_index_listbox)
        scrollbar.pack(side=LEFT, fill=Y)
        frame_index_listbox.pack()


        # attach listbox to scrollbar
        self.listbox.config(yscrollcommand=scrollbar.set)
        scrollbar.config(command=self.listbox.yview)

        f=Frame(self)
        Label(f,text="Filtro: ").pack(side=LEFT)
        self.entry_w = Entry(f)
        self.entry_w.pack(side=LEFT)
        f.pack()

        f2=Frame(self)
        Button(f2, text='Filter',command=self.filter_indexs).pack(side=LEFT)
        Button(f2,text='Clean Filter',command=self.clean_filter).pack(side=LEFT)
        Button(f2, text='Export sel for gen',command=self.export_selection).pack(side=LEFT)
        f2.pack()

        f3=Frame(self)
        Button(self, text='<<',command=self.next_prev(-1)).pack(side=LEFT)
        Button(self, text='>>',command=self.next_prev(1)).pack(side=LEFT)
        f3.pack()

        self.update_model(current_model)
        self.listbox.select_set(0)
        self.listbox.event_generate("<<ListboxSelect>>")
        self.listbox.bind('<<ListboxSelect>>', self.selection)

    def filter_indexs(self):
        import random
        path_filter = self.entry_w.get()
        with open(path_filter,'r') as f:
            indexs_list_str = f.read().strip()
        random.seed(3)
        indexs_list = list(set(indexs_list_str.split('\n')))
        print(len(indexs_list))
        random.shuffle(indexs_list)

        self.filtered_list = indexs_list
        self.listbox.delete(0, END)
        for item in indexs_list:
            self.listbox.insert(END, item)

    def clean_filter(self):
        self.filtered_list = None
        self.update_model(self.current_model)
        self.listbox.delete(0, END)
        for item in sorted(self.index_list):
            self.listbox.insert(END, item)
        self.saved_selection = None

    def export_selection(self):
        sel_files_folder = os.path.join('config_files','select_files')
        os.makedirs(sel_files_folder,exist_ok=True)

        sel_list = self.listbox.curselection()
        index_list = [self.listbox.get(ind) for ind in sel_list]
        print("Exporting list for image generator. List: {0}".format(index_list))
        now_s = now_string()
        out_selection_file = {'index_list' : index_list,
                              'train_result_path': self.current_model.current_config_file,
                              'details' : '',
                              'mask_file' : self.current_model.current_mask_file}
        sel_file_name = "{0}_{1}_{2}_selection.json".format(self.current_model.classifier_key,self.current_model.dataset_key,now_s)
        sel_path = os.path.join(sel_files_folder,sel_file_name)
        with open(sel_path,'w') as f:
            json.dump(out_selection_file,f)
        print("Select in {0}".format(sel_path))

    def update_model(self, current_model):
        self.model = current_model
        self.index_list = self.model.get_index_list()
        self.current_index = self.model.get_current_index()
        self.mask_list = self.model.get_current_mask_index_list()

        indexs_list = self.filtered_list if self.filtered_list else sorted(self.index_list)

        self.listbox.delete(0, END)
        for item in indexs_list:
            self.listbox.insert(END, item)

        if self.saved_selection:
            ind,ypos = self.saved_selection
            self.listbox.selection_set(ind)
            self.listbox.yview_moveto(ypos[0])  # go back to that position

    def next_prev(self,x):
        def selection():
            ind_l = self.index_list.index(self.current_index)
            n = len(self.index_list)
            n_ind_l = (ind_l+x) % n
            next = self.index_list[n_ind_l]
            self.current_index = next
            self.listbox.selection_clear(0, END)
            self.listbox.select_set(n_ind_l)
            self.controller.event_change_index(next)

        return selection

    def selection(self,event):
        w = event.widget
        index = int(w.curselection()[0])
        value = w.get(index)
        print("v: {0}".format(value))
        selected_index = value
        self.current_index = selected_index
        self.controller.event_change_index(selected_index)
        self.saved_selection = (index,self.listbox.yview())

        pass
Esempio n. 2
0
    def init_list(self):
        '''查看记录页'''
        self.main.show_list()

        label_list_titles = Label(
            self.frame_list,
            text='\n序号        起始日期       持续天数    间隔天数',
            bg='#FFF0F5'  #lavenderblush
        )
        label_list_titles.pack(side='top',
                               anchor='w',
                               padx=self.window_width / 40)

        frame_list_top = Frame(
            self.frame_list,
            padx=self.window_width / 40,
            bg='#FFF0F5'  #lavenderblush
        )
        frame_list_top.pack(side='top', fill='x')

        #滚动条控件
        scrollbar_list = Scrollbar(frame_list_top, orient='vertical')
        scrollbar_list.pack(side='right', anchor='n', fill='y')

        listbox_list = Listbox(
            frame_list_top,
            activestyle='none',
            selectmode='single',
            height=20,
            font=('consolas', 10),
            yscrollcommand=scrollbar_list.set  #列表绑定滚动条
        )
        listbox_list.insert('end', *self.main.print_list)  #载入全部记录
        listbox_list.insert('end', '  +')  #末尾空行方便插入最新记录
        listbox_list.pack(side='right', anchor='n', expand='yes', fill='x')

        scrollbar_list.configure(command=listbox_list.yview)  #滚动条绑定列表
        listbox_list.yview_moveto(1)  #视图默认滚动到底
        # listbox_list.selection_set(self.main.count - 1)
        # listbox_list.event_generate("<<ListboxSelect>>")    #默认选择最后一条记录

        frame_list_bottom = Frame(
            self.frame_list,
            padx=self.window_width / 40,
            pady=self.window_height / 20,
            bg='#FFF0F5'  #lavenderblush
        )
        frame_list_bottom.pack(side='top', fill='x')

        def click_insert():
            '''点击插入记录'''
            if len(listbox_list.curselection()) == 1:
                index = listbox_list.curselection()[0]

                dialog_insert = Toplevel()  #弹出对话框
                dialog_insert.wm_transient(self.window)  #与父窗口关联,窗口管理器不会当成独立窗口
                dialog_insert.focus_set()  #焦点切换到对话框
                dialog_insert.grab_set()  #事件不会传入父窗口(父窗口无法点击)
                dialog_insert.withdraw()  #隐藏窗口(等到窗口宽高位置设定好后再显示)
                dialog_insert.title('插入经期记录 (第{}行)'.format(index + 1))  #窗口标题

                frame_insert = Frame(
                    dialog_insert,
                    padx=self.window_width / 20,
                    pady=self.window_width / 20,
                    bg='#FFF0F5'  #lavenderblush
                )
                frame_insert.pack()

                #以下为开始日期控件组

                frame_insert_fromdate = Frame(
                    frame_insert,
                    bg='#FFF0F5'  #lavenderblush
                )
                frame_insert_fromdate.pack(side='top', anchor='s')

                label_from = Label(frame_insert_fromdate,
                                   text='开始日期:  ',
                                   bg='#FFF0F5')
                label_from.pack(side='left', anchor='n')

                box_yyyy1 = Combobox(frame_insert_fromdate,
                                     width=4,
                                     state='readonly')  #年选项框
                box_yyyy1['value'] = tuple(range(2000, date.today().year + 1))
                box_yyyy1.current(date.today().year - 2000)  #默认值为今天
                box_yyyy1.pack(side='left', anchor='n')

                label_year1 = Label(frame_insert_fromdate,
                                    text='年  ',
                                    bg='#FFF0F5')
                label_year1.pack(side='left', anchor='n')

                box_mm1 = Combobox(frame_insert_fromdate,
                                   width=2,
                                   state='readonly')  #月选项框
                box_mm1['value'] = tuple(range(1, 13))
                box_mm1.current(date.today().month - 1)  #默认值为今天
                box_mm1.pack(side='left', anchor='n')

                label_month1 = Label(frame_insert_fromdate,
                                     text='月  ',
                                     bg='#FFF0F5')
                label_month1.pack(side='left', anchor='n')

                box_dd1 = Combobox(frame_insert_fromdate,
                                   width=2,
                                   state='readonly')  #日选项框
                box_dd1['value'] = tuple(range(1, 32))
                box_dd1.current(date.today().day - 1)  #默认值为今天
                box_dd1.pack(side='left', anchor='n')

                label_day1 = Label(frame_insert_fromdate,
                                   text='日\n',
                                   bg='#FFF0F5')
                label_day1.pack(side='left', anchor='n')

                #以下为结束日期控件组

                frame_insert_todate = Frame(
                    frame_insert,
                    bg='#FFF0F5'  #lavenderblush
                )
                frame_insert_todate.pack(side='top', anchor='s')

                label_to = Label(frame_insert_todate,
                                 text='结束日期:  ',
                                 bg='#FFF0F5')
                label_to.pack(side='left', anchor='n')

                box_yyyy2 = Combobox(frame_insert_todate,
                                     width=4,
                                     state='readonly')  #年选项框
                box_yyyy2['value'] = tuple(range(2000, date.today().year + 1))
                box_yyyy2.current(date.today().year - 2000)  #默认值为今天
                box_yyyy2.pack(side='left', anchor='n')

                label_year2 = Label(frame_insert_todate,
                                    text='年  ',
                                    bg='#FFF0F5')
                label_year2.pack(side='left', anchor='n')

                box_mm2 = Combobox(frame_insert_todate,
                                   width=2,
                                   state='readonly')  #月选项框
                box_mm2['value'] = tuple(range(1, 13))
                box_mm2.current(date.today().month - 1)  #默认值为今天
                box_mm2.pack(side='left', anchor='n')

                label_month2 = Label(frame_insert_todate,
                                     text='月  ',
                                     bg='#FFF0F5')
                label_month2.pack(side='left', anchor='n')

                box_dd2 = Combobox(frame_insert_todate,
                                   width=2,
                                   state='readonly')  #日选项框
                box_dd2['value'] = tuple(range(1, 32))
                box_dd2.current(date.today().day - 1)  #默认值为今天
                box_dd2.pack(side='left', anchor='n')

                label_day2 = Label(frame_insert_todate,
                                   text='日\n\n',
                                   bg='#FFF0F5')
                label_day2.pack(side='left', anchor='n')

                def insert():
                    '''点击对话框中的插入记录按钮'''
                    #获取开始日期
                    yyyy1 = int(box_yyyy1.get())
                    mm1 = int(box_mm1.get())
                    dd1 = int(box_dd1.get())

                    #获取结束日期
                    yyyy2 = int(box_yyyy2.get())
                    mm2 = int(box_mm2.get())
                    dd2 = int(box_dd2.get())

                    self.main.insert(index, yyyy1, mm1, dd1, yyyy2, mm2, dd2)
                    if self.main.add_error:
                        #插入记录异常
                        messagebox.showinfo(message=self.main.error_msg,
                                            parent=dialog_insert)
                    else:
                        #插入记录成功
                        dialog_insert.destroy()  #关闭对话框
                        self.refresh()  #刷新页面相关信息
                        messagebox.showinfo(message='插入记录成功!')

                #对话框的插入记录按钮
                btn_insert_enter = Button(
                    frame_insert,
                    text='插入记录',
                    bd=2,
                    relief='groove',
                    bg='#FFFFFF',  #white
                    fg='#FF1493',  #deeppink
                    activebackground='#FFFFFF',
                    activeforeground='#FF1493',
                    command=insert)
                btn_insert_enter.pack(side='top', anchor='n')

                dialog_insert.update_idletasks()  #手动更新显示,以获得布局后的窗口宽高来设置窗口位置
                dialog_insert_x = int(
                    (dialog_insert.winfo_screenwidth() * self.scale_factor -
                     dialog_insert.winfo_width()) / 2)
                dialog_insert_y = int(
                    (dialog_insert.winfo_screenheight() * self.scale_factor -
                     dialog_insert.winfo_height()) / 2)
                dialog_insert.geometry('+{}+{}'.format(
                    dialog_insert_x, dialog_insert_y))  #设置窗口位置
                dialog_insert.resizable(False, False)  #锁定窗口大小
                dialog_insert.deiconify()  #显示窗口
                # dialog_insert.wait_window()

        #插入记录按钮
        btn_insert = Button(
            frame_list_bottom,
            text='在选中行上方\n插入记录',
            height=2,
            bd=2,
            relief='groove',
            bg='#FFFFFF',  #white
            fg='#FF1493',  #deeppink
            activebackground='#FFFFFF',
            activeforeground='#FF1493',
            command=click_insert)
        btn_insert.pack(side='left', expand='yes')

        def delete():
            '''点击删除选中记录'''
            if len(listbox_list.curselection()) == 1:
                index = listbox_list.curselection()[0]
                if index < self.main.count:
                    ans = messagebox.askokcancel(message='确定要删除选中的记录吗?')
                    if ans:
                        self.main.delete(index)
                        self.click_list()

        #删除选中记录按钮
        btn_delete = Button(
            frame_list_bottom,
            text='删除选中记录',
            height=2,
            bd=2,
            relief='groove',
            bg='#FFFFFF',  #white
            fg='#FF1493',  #deeppink
            activebackground='#FFFFFF',
            activeforeground='#FF1493',
            command=delete)
        btn_delete.pack(side='left', expand='yes')

        def delete_all():
            '''点击删除全部记录'''
            if self.main.count > 0:
                ans = messagebox.showwarning(title='警告', message='危险操作')
                if ans:
                    ans = messagebox.askokcancel(title='警告:危险操作',
                                                 message='确定要删除全部记录吗?')
                    if ans:
                        ans = messagebox.askokcancel(title='点击确定将删除全部记录',
                                                     message='真的要删除全部记录吗?')
                        if ans:
                            self.main.delete_all()
                            self.click_list()

        #删除全部记录按钮
        btn_delete_all = Button(
            frame_list_bottom,
            text='删除全部记录',
            height=2,
            bd=2,
            relief='groove',
            bg='#FFFFFF',  #white
            fg='#FF1493',  #deeppink
            activebackground='#FFFFFF',
            activeforeground='#FF1493',
            command=delete_all)
        btn_delete_all.pack(side='left', expand='yes')
Esempio n. 3
0
class TinyChat(Tk):
    def __init__(self, *args, **kwargs):
        Tk.__init__(self, *args, **kwargs)

        try:  # Set icon
            self.iconbitmap('icon.ico')
        except Exception:
            pass

        self.wm_title('TinyChat')
        self.resizable(False, False)

        try:
            self.eval('tk::PlaceWindow %s center' %
                      self.winfo_pathname(self.winfo_id()))
        except TclError:
            pass

        self.bind('<Key>', self.keypress)

        self.sound_played_for_notification = False
        self.new_notification = False
        self.line_width = 42

        self.msg_list = Listbox(self,
                                selectmode=SINGLE,
                                height=10,
                                width=self.line_width,
                                borderwidth=0)
        self.msg_scb = Scrollbar(self, orient='vertical')
        self.msg_scb.grid(padx=0, pady=0, row=0, column=1, sticky=N + S)
        self.msg_list.config(yscrollcommand=self.msg_scb.set)
        self.msg_scb.config(command=self.msg_list.yview)

        self.entry_box = Entry(self,
                               textvariable=StringVar(),
                               bd=0,
                               width=self.line_width,
                               bg='white',
                               fg='black')
        self.entry_button = Button(self,
                                   text='→',
                                   width=3,
                                   command=self.send_msg)

        self.msg_list.grid(padx=0, pady=0, row=0, column=0)
        self.entry_box.grid(padx=0, pady=0, row=1, column=0)
        self.entry_button.grid(padx=0, pady=0, row=1, column=1)

        # Connect on the ethernet port
        self.ETH = ETHConnection(OTHER_IP, IS_SERVER)

        # self.msg_recv_thread = Thread(target=self.recv_msg)
        # self.msg_recv_thread.start()
        # self.notifications_thread = Thread(target=self.notifications)
        # self.notifications_thread.start()
        self.msg_recv_thread = self.recv_msg()
        self.notifications_thread = self.notifications()

        self.wm_attributes('-topmost', 1)
        self.bind('<FocusIn>', self.handle_focus)
        self.protocol('WM_DELETE_WINDOW', self.on_closing)
        self.mainloop()

    def send_msg(self):
        global MY_NAME, OTHER_IP, IS_SERVER
        msg_to_send = self.entry_box.get()
        self.entry_box.delete(0, END)

        if msg_to_send:
            if msg_to_send[0] == '/':  # Commands
                cmd = msg_to_send.split(' ')

                if cmd[0] == '/?':
                    self.msg_list.insert(END, ' ')
                    self.msg_list.insert(END, 'HELP:')
                    self.msg_list.insert(
                        END,
                        '/setname NAME - Sets your name for the given NAME.')
                    self.msg_list.insert(END, '/re - Tries to reconnect.')
                    self.msg_list.insert(
                        END, '/ip IP - Sets the partner\'s ip to IP.')
                    self.msg_list.insert(END, ' ')
                if cmd[0] == '/setname':
                    MY_NAME = cmd[1].strip()
                if cmd[0] == '/re':
                    self.ETH.reconnect()
                if cmd[0] == '/ip':
                    OTHER_IP = cmd[1].strip()

                return

            msg_to_send = MY_NAME + ': ' + msg_to_send
            self.add_msg(msg_to_send)

            try:
                self.ETH.send(msg_to_send)
            except:
                self.msg_list.insert(
                    END, 'There is noone on the other end  ¯\\_(ツ)_/¯.')

                # Try to reestabilish connection
                self.ETH.reconnect()
                self.msg_recv_thread = self.recv_msg()
                self.msg_recv_thread.start()

    def add_msg(self, msg):
        if len(msg) > self.line_width:
            for i in range(int(len(msg) / self.line_width) + 1):
                self.msg_list.insert(
                    END, msg[i * self.line_width:(i + 1) * self.line_width])
        else:
            self.msg_list.insert(END, msg)

        self.msg_list.yview_moveto('1')  # Scroll down to the last message

    def handle_focus(self, e):
        self.new_notification = False

    @threaded
    def recv_msg(self):
        global EXITED
        while not EXITED:
            time.sleep(0.1)

            if not self.ETH:
                continue

            data = self.ETH.recv(1024)
            if data:
                self.add_msg(data)
                self.new_notification = True
                self.sound_played_for_notification = False

    @threaded
    def notifications(self):
        global EXITED
        while not EXITED:
            time.sleep(0.1)

            if self.new_notification:
                if not self.sound_played_for_notification:
                    playsound('audio/notification.wav')
                    self.sound_played_for_notification = True

    def on_closing(self):
        """
        if self.ETH.is_connected:
            self.ETH.send(MY_NAME + ' has left the chat.')
            self.ETH.close()
        """
        global EXITED
        EXITED = True
        self.notifications_thread.join()
        self.msg_recv_thread.join()
        self.destroy()

    def keypress(self, event):
        # print(repr(event.char))
        # Turned off because \x08 == Ctrl + h and \x08 == Backspace
        # if event.char == '\x08':  # Ctrl + h
        # self.help()

        if event.char == '\r':
            self.send_msg()
            self.msg_list.yview_moveto('1')  # Scroll down to the last message