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