def add_widget(self): #add module #chat area #create a area that can scroll,where a main window contain many small window chat_text_area = ScrolledText(self) chat_text_area['width'] = 110 chat_text_area['height'] = 30 #window have two row(input area and button), #So the first row has to be aligned with the second row, columnspan=2 chat_text_area.grid(row=0, column=0, columnspan=2) #'green' is a label, and sets its color to green. All text with this label is green chat_text_area.tag_config('green', foreground='green') chat_text_area.tag_config('system', foreground='red') #Then we should save this area in a dictionary like other area self.children['chat_text_area'] = chat_text_area #input area chat_input_area = Text(self, name='chat_input_area') chat_input_area['width'] = 100 chat_input_area['height'] = 7 chat_input_area.grid(row=1, column=0, pady=10) #send area send_button = Button(self, name='send_button') send_button['text'] = 'send' send_button['width'] = 5 send_button['height'] = 2 send_button.grid(row=1, column=1)
class HelpOpening(tkinter.Toplevel): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.title("Что такое места перекрытия в конструкции дверей-купе?.") self.text = ScrolledText(self, wrap='word', height=40, width=120) self.text_p1 = """ Что такое места перекрытия в конструкции дверей-купе? Двери-купе перемещаются относительно друг друга по соседним полозьям, и чтобы внешне фасад шкафа-купе смотрелся нормально, край передней двери перекрывает край соседней двери на ширину профиля. Это и называется "местом перекрытия". Если в проём встраиваются две двери, между дверями создаётся одно место перекрытия. Если встраиваются три двери, получается два места перекрытия. Если встраиваются четыре двери, мест перекрытий может быть и три, а может быть и два. Пять дверей - четыре места перекрытия. На рисунке внизу всё показано наглядно. Чаще всего мест перекрытий бывает на один меньше, чем дверей, но бывают и исключения, как на примере четырёх дверей. Поэтому нужно быть внимательным при заполнении формы параметров дверей-купе """ self.text.insert(1.0, self.text_p1) self.text.tag_add('title', 2.0, '2.end') self.text.tag_config('title', font=('bold', )) self.image = Image.open( os.path.join(settings.help_img, 'opening_schem.png')) self.photo = ImageTk.PhotoImage(self.image) self.img = tkinter.Label(self, relief='flat', bd=0, image=self.photo) self.text.window_create(tkinter.INSERT, window=self.img) self.text.insert('end', ' ') self.text.pack(fill='x', side='left')
def add_weight(self): """添加组件的方法""" ## 采用grid布局 # 交互区 chat_input_area = Text(self, name='chat_input_area') chat_input_area['width'] = 100 chat_input_area['height'] = 7 chat_input_area.grid(row=0, column=0, pady=10) # run按钮 send_button = Button(self, name='send_button') send_button['text'] = 'Run' send_button['width'] = 5 send_button['height'] = 2 send_button.grid(row=0, column=1) # 响应区 chat_text_area = ScrolledText(self) chat_text_area['width'] = 110 chat_text_area['height'] = 30 chat_text_area.grid(row=1, column=0, columnspan=2) chat_text_area.tag_config('green', foreground='#008B00') chat_text_area.tag_config('system', foreground='red') self.children['chat_text_area'] = chat_text_area
class ConsoleUi(logging.Handler): def __init__(self, parent, update_interval=50, process_lines=500): logging.Handler.__init__(self) self.update_interval = update_interval self.process_lines = process_lines self.parent = parent #self.after(self.update_interval, self.fetch_lines) # Create a ScrolledText wdiget self.scrolled_text = ScrolledText(self.parent, state='disabled', height=20) self.scrolled_text.grid(row=0, column=0, sticky=(N, S, W, E)) self.scrolled_text.configure(font='TkFixedFont') self.scrolled_text.tag_config('INFO', foreground='black') self.scrolled_text.tag_config('DEBUG', foreground='gray') self.scrolled_text.tag_config('WARNING', foreground='orangered') self.scrolled_text.tag_config('ERROR', foreground='red') self.scrolled_text.tag_config('CRITICAL', foreground='red', underline=1) self.scrolled_text.tag_config('OTHER', foreground='blue') #ConsoleUi.display = self.display ConsoleUi.displayText = self.displayText ConsoleUi.clearDisp = self.clearDisp def emit(self, record): msg = self.format(record) self.scrolled_text.configure(state='normal') self.scrolled_text.insert(tk.END, msg + '\n', record.levelname) self.scrolled_text.configure(state='disabled') # Autoscroll to the bottom self.scrolled_text.yview(tk.END) def clearDisp(self, *args): print('clearDisp') self.scrolled_text.configure(state='normal') self.scrolled_text.delete(0.0, tk.END) self.scrolled_text.configure(state='disabled') def displayText(self, *args): # for text files text = ' '.join([str(a) for a in args]) print(text, end='') self.scrolled_text.configure(state='normal') if ' ERROR ' in text: tag = 'ERROR' elif ' DEBUG ' in text: tag = 'DEBUG' elif ' INFO ' in text: tag = 'INFO' elif ' WARNING ' in text: tag = 'WARNING' elif ' CRITICAL ' in text: tag = 'CRITICAL' else: tag = 'OTHER' text = text+'\n' self.scrolled_text.insert(tk.END, text, tag) self.scrolled_text.configure(state='disabled') # Autoscroll to the bottom self.scrolled_text.yview(tk.END) self.scrolled_text.update_idletasks()
def __init__(self, parent, controller): codeforceObj = Codeforce() codeforceEvents = codeforceObj.codeforceEvents tk.Frame.__init__(self, parent, highlightbackground="lightblue", highlightcolor="lightblue", highlightthickness=1, width=720, height=500, bd=0) heading = tk.Label(self, text=""" ============================================================================================ CODEFORCE EVENTS ============================================================================================""", fg="#00e6e6", bg="#0d0d0d", font=LARGE_FONT) heading.pack(expand=False, fill="both") text = ScrolledText(self, font=LARGE_FONT, fg="#00ff00", bg="#1a1a1a", cursor="arrow") text.pack(expand=True, fill='both') text.insert(tk.INSERT, "\n root", 'red') text.insert(tk.INSERT, " @ ", 'white') text.insert(tk.INSERT, "Notifier") text.insert(tk.INSERT, " ># ", 'lightblue') text.insert(tk.INSERT, " get codeforceevents ") for event in codeforceEvents: text.insert(tk.INSERT, "\n\n [+] ", 'orange') name = event['title'] text.insert(tk.INSERT, name, 'lightblue') startTime = event['start'] startTime = "\n\t> " + "Starts: " + startTime text.insert(tk.INSERT, startTime) duration = "\n\t> Duration: " + event['duration'] text.insert(tk.INSERT, duration) beforeStartTime = "\n\t> Before start: " + event['beforeStart'] text.insert(tk.INSERT, beforeStartTime) beforeRegTime = "\n\t> Before registration: " + event['beforeReg'] text.insert(tk.INSERT, beforeRegTime) codeforceUrl = event['url'] text.insert(tk.INSERT, "\n\t> Event url: ") text.insert(tk.INSERT, codeforceUrl, ('link', codeforceUrl)) text.insert(tk.INSERT, "\n") text.tag_config('link', foreground="#3385ff") text.tag_bind('link', '<Button-1>', self.openLink) text.tag_config('lightblue', foreground="#00e6e6") text.tag_config('red', foreground="red") text.tag_config('white', foreground="white") text.tag_config('orange', foreground="#ff6600") text.config(state=tk.DISABLED)
class ConsoleUi: """Poll messages from a logging queue and display them in a scrolled text widget""" def __init__(self, frame): self.frame = frame self.input_start_idx = tk.END # Create a ScrolledText wdiget self.scrolled_text = ScrolledText(frame, state='disabled', height=12) self.scrolled_text.pack(expand=True, fill=tk.BOTH) self.scrolled_text.configure(font='TkFixedFont') self.scrolled_text.tag_config('INFO', foreground='black') self.scrolled_text.tag_config('DEBUG', foreground='gray') self.scrolled_text.tag_config('WARNING', foreground='dark orange') self.scrolled_text.tag_config('ERROR', foreground='red') self.scrolled_text.tag_config('CRITICAL', foreground='red', underline=1) self.scrolled_text.bind('<Key>', self.key_press) # Create a logging handler using a queue self.log_queue = queue.Queue() self.queue_handler = QueueHandler(self.log_queue) formatter = logging.Formatter('%(asctime)s:\t%(message)s', datefmt='%H:%M:%S') self.queue_handler.setFormatter(formatter) logger.addHandler(self.queue_handler) # Start polling messages from the queue self.frame.after(100, self.poll_log_queue) def display(self, record): msg = record.getMessage() self.scrolled_text.configure(state='normal') self.scrolled_text.insert(tk.END, msg + '\n', record.levelname) # self.scrolled_text.configure(state='disabled') # Autoscroll to the bottom self.scrolled_text.yview(tk.END) self.scrolled_text.mark_set('input_start', 'end-1c') self.scrolled_text.mark_gravity('input_start', tk.LEFT) def poll_log_queue(self): while True: try: record = self.log_queue.get(block=False) except queue.Empty: break else: self.display(record) # Check every 100ms if there is a new message in the queue to display self.frame.after(100, self.poll_log_queue) def key_press(self, event): """Function used to send any inputs to the input_queue when the return key is pressed""" if event.char == '\r': user_input = self.scrolled_text.get('input_start', 'end-1c').strip() input_queue.put(user_input) self.scrolled_text.mark_set('input_start', 'end-1c')
def __init__(self, parent, controller): leetcodeObj = Leetcode() leetcodeEvents = leetcodeObj.leetcodeEvents tk.Frame.__init__(self, parent, highlightbackground="lightblue", highlightcolor="lightblue", highlightthickness=1, width=720, height=500, bd=0) heading = tk.Label(self, text=""" ============================================================================================ LEETCODE EVENTS ============================================================================================""", fg="#00e6e6", bg="#0d0d0d", font=LARGE_FONT) heading.pack(expand=False, fill="both") text = ScrolledText(self, font=LARGE_FONT, fg="#00ff00", bg="#1a1a1a", cursor="arrow") text.pack(expand=True, fill='both') text.insert(tk.INSERT, "\n root", 'red') text.insert(tk.INSERT, " @ ", 'white') text.insert(tk.INSERT, "Notifier") text.insert(tk.INSERT, " ># ", 'lightblue') text.insert(tk.INSERT, " get leetcodeEvents ") for event in leetcodeEvents: text.insert(tk.INSERT, "\n\n [+] ", 'orange') name = event['title'] text.insert(tk.INSERT, name, 'lightblue') startTime = event['start'] startTime = "\n\t> " + "Starts: " + startTime endTime = "\n\t> " + "Finish: " + event['finish'] description = startTime + endTime + "\n\t> " text.insert(tk.INSERT, description) leetcodeUrl = event['url'] text.insert(tk.INSERT, "\n\t> Event url: ") text.insert(tk.INSERT, leetcodeUrl, ('link', leetcodeUrl)) text.insert(tk.INSERT, "\n") text.tag_config('link', foreground="#3385ff") text.tag_bind('link', '<Button-1>', self.openLink) text.tag_config('lightblue', foreground="#00e6e6") text.tag_config('red', foreground="red") text.tag_config('white', foreground="white") text.tag_config('orange', foreground="#ff6600") text.config(state=tk.DISABLED)
class ConsoleUi: """Poll messages from a logging queue and display them in a scrolled text widget""" def __init__(self, frame): self.frame = frame # Create a ScrolledText wdiget self.scrolled_text = ScrolledText(frame, state='disabled', height=12) self.scrolled_text.grid(row=0, column=0, sticky=(N, S, W, E)) self.scrolled_text.configure(font='TkFixedFont') self.scrolled_text.tag_config('INFO', foreground='white', background='green') self.scrolled_text.tag_config('DEBUG', foreground='gray') self.scrolled_text.tag_config('WARNING', foreground='yellow', background='purple') self.scrolled_text.tag_config('ERROR', foreground='black', background='yellow') self.scrolled_text.tag_config('CRITICAL', foreground='white', background='red', underline=1) # Create a logging handler using a queue self.log_queue = queue.Queue() self.queue_handler = QueueHandler(self.log_queue) formatter = logging.Formatter('%(asctime)s: %(message)s', "%d-%m %H:%M") self.queue_handler.setFormatter(formatter) logger.addHandler(self.queue_handler) # Start polling messages from the queue self.frame.after(100, self.poll_log_queue) def display(self, record): msg = self.queue_handler.format(record) self.scrolled_text.configure(state='normal') self.scrolled_text.insert(tk.END, msg + '\n', record.levelname) self.scrolled_text.configure(state='disabled') # Autoscroll to the bottom self.scrolled_text.yview(tk.END) def poll_log_queue(self): # Check every 100ms if there is a new message in the queue to display while True: try: record = self.log_queue.get(block=False) except queue.Empty: break else: self.display(record) self.frame.after(100, self.poll_log_queue)
class Principal(Thread): conexion = socket.socket() conexion.bind(('localhost', 20001)) conexion.listen(5) client, addr = conexion.accept() def __init__(self, master): Thread.__init__(self) frame = Frame(master) frame.pack() self.mensaje = ScrolledText(frame, height=10, width=80, bg='mint cream', state=NORMAL) self.mensaje.pack() sframe = Frame(frame) sframe.pack(anchor='w') self.pro = Label(sframe, text="Servidor >>") self.env_msj = Entry(sframe, width=80) self.env_msj.focus_set() self.env_msj.bind(sequence="<Return>", func=self.enviar) self.pro.pack(side=LEFT) self.env_msj.pack(side=LEFT) self.boton = Button(text="Cerrar", command=ventana.destroy, height=2, width=10, bg="MistyRose3") self.boton.pack(side=RIGHT) self.mensaje.tag_config("yo", foreground='black', font='Fixedsys 14') self.mensaje.insert(END, 'Bienvenido al Chat Servidor\n\n', "yo") self.mensaje.configure(state=DISABLED) def enviar(self, args): self.mensaje.configure(state=NORMAL) text = self.env_msj.get() if text == "": text = " " self.mensaje.tag_config("el", foreground='midnight blue', font='Fixedsys 14') self.mensaje.insert(END, 'Servidor >> %s \n' % text, "el") self.env_msj.delete(0, END) self.client.send(str.encode(text)) self.env_msj.focus_set() self.mensaje.configure(state=DISABLED) self.mensaje.see(END) def run(self): msj_entrante(self.client, self.mensaje)
def __init__(self,root): self.root = root # create a Frame for the Text and Scrollbar txt_frm = tki.Frame(self.root, width=800, height=600) txt_frm.pack(fill="both", expand=True) # Set to fullscreen if True if setToFullscreen: self.root.attributes('-fullscreen', True) # ensure a consistent GUI size txt_frm.grid_propagate(False) # function when enter is pressed self.root.bind('<Return>', GUI.func) #Create invitation label label1 = Label(self.root, text="Chatte mit mir", width=50, height=1, bg="white") label1.place(relx=0.5, rely=0.05, anchor=CENTER) label1.config(font=("Courier", 44)) photo = PhotoImage(file="background.png") label2 = Label(txt_frm, image=photo) label2.image = photo # keep a reference! label2.place(relx=0.5, rely=0.5, anchor=CENTER) global txt0 # textbox display thinking process txt0 = Entry(txt_frm, width=20, justify='center') txt0.place(relx=0.5, rely=0.19, anchor=CENTER) # Hide progress bar if no speech is not used if not useSpeechRecognition: txt0.place_forget() self.lbl1 = tki.Label(txt_frm, text="Chatbot - Halten sie den Knopf beim sprechen gedrückt \n oder nutzen sie die Tastatur um mit mir zu kommunizieren") self.lbl1.place(relx=0.5, rely=0.29, anchor=CENTER) global txt1 # chatbox txt1 = ScrolledText(txt_frm, borderwidth=3, relief="sunken", height=25,width=60) txt1.config(font=("consolas", 12), undo=True, wrap='word') txt1.place(relx=0.5, rely=0.48, anchor=CENTER) txt1.tag_config('green', foreground='green') txt1.tag_config('red', foreground='red') global inp1 # Inputbox for Keyboard inputs inp1 = Entry(txt_frm, width=77) inp1.place(relx=0.5, rely=0.768, anchor=CENTER) inp1.focus_set()
class ConsoleLog: def __init__(self, frame): self.frame = frame self.scrolled_text = ScrolledText(self.frame, height=10, state="disabled", bg="dodger blue") self.scrolled_text.grid(row=0, columnspan=6) self.scrolled_text.configure(font="tkFixedFont", state="normal") self.scrolled_text.tag_config("INFO", foreground="black") self.scrolled_text.tag_config("WARNING", foreground="OrangeRed4") self.scrolled_text.tag_config("DEBUG", foreground='purple4') self.scrolled_text.tag_config("ERROR", foreground='red') self.scrolled_text.tag_config("CRITICAL", foreground="red4", underline="1") # Create a loggin handler using a queue self.log_queue = queue.Queue() self.queue_handler = QueueHandler(self.log_queue) formatter = logging.Formatter('%(asctime)s: %(message)s', datefmt="%I:%M:%S %p") self.queue_handler.setFormatter(formatter) logger.addHandler(self.queue_handler) self.frame.after(100, self.poll_log_queue) def display_log(self, record): msg = self.queue_handler.format(record) self.scrolled_text.configure(state="normal") self.scrolled_text.insert(END, msg + '\n', record.levelname) self.scrolled_text.configure(state="disabled") # autoscroll to bottom self.scrolled_text.yview(END) def poll_log_queue(self): # Check every 100ms if there is a new message to display in the queue while True: try: record = self.log_queue.get(block=False) except queue.Empty: break else: print(record) self.display_log(record) self.frame.after(100, self.poll_log_queue)
def setupUI(self): contents = ScrolledText() contents.pack(side=BOTTOM, expand=True, fill=BOTH) contents.tag_config('orange', background='orange') contents.tag_config('lightgreen', background='lightgreen') contents.insert(INSERT, "\n") contents.insert(INSERT, "\n") contents.insert(INSERT, "\n") contents.insert( INSERT, " CASA Beam-Beam found that the user's own initial phase-coordinates already existed.\n" ) contents.insert( INSERT, " ___________________________________________________________________________________\n" ) contents.insert(INSERT, "\n") contents.insert(INSERT, "\n") contents.insert( INSERT, " If mant to use CASA Beam-Beam initial phase-coordinates, click the button " ) contents.insert(INSERT, "'Yes'", 'lightgreen') contents.insert(INSERT, "\n\n") contents.insert( INSERT, " If mant to use the user's own initial phase-coordinates, click the button " ) contents.insert(INSERT, "'No'", 'orange') contents.insert(INSERT, "\n") Btn = Btn_def() btn1 = Button(self, text="No. Using user's phase-coordinates", bg="orange", command=lambda: Btn.NO_Btn()).pack(side=LEFT) btn2 = Button(self, text="Yes. Using CASA Beam-Beam's phases-coordinates", bg="lightgreen", command=lambda: Btn.YES_Btn()).pack(side=RIGHT) return
class ConsoleUi: """Poll messages from a logging queue and display them in a scrolled text widget.""" def __init__(self, frame, simple_time=False): self.frame = frame # Create a ScrolledText wdiget if simple_time: font='80' else: font='' self.scrolled_text = ScrolledText(frame, state='disabled', height=39) self.scrolled_text.grid(row=0, column=0, sticky=(N, S, W, E)) self.scrolled_text.configure(font='TkFixedFont') self.scrolled_text.tag_config('INFO', foreground='black', font=font) self.scrolled_text.tag_config('DEBUG', foreground='gray', font=font) self.scrolled_text.tag_config('WARNING', foreground='orange', font=font) self.scrolled_text.tag_config('ERROR', foreground='red', font=font) self.scrolled_text.tag_config('CRITICAL', foreground='red', underline=1, font=font) # Create a logging handler using a queue self.log_queue = Queue() self.queue_handler = QueueHandler(self.log_queue) formatter = logging.Formatter('%(asctime)s: %(message)s') if simple_time is True: formatter = logging.Formatter("%(asctime)s: %(message)s", "%H:%M:%S") self.queue_handler.setFormatter(formatter) logger.addHandler(self.queue_handler) # Start polling messages from the queue self.frame.after(100, self.poll_log_queue) def display(self, record): msg = self.queue_handler.format(record) self.scrolled_text.configure(state='normal') self.scrolled_text.insert(tk.END, msg + '\n', record.levelname) self.scrolled_text.configure(state='disabled') # Autoscroll to the bottom self.scrolled_text.yview(tk.END) def poll_log_queue(self): # Check every 100ms if there is a new message in the queue to display while True: try: record = self.log_queue.get(block=False) except Queue_Empty: break else: self.display(record) self.frame.after(100, self.poll_log_queue) def pass_logger(self, in_logger): in_logger.addHandler(self.queue_handler) def set_levels(self, levels): self.queue_handler.addFilter(MyFilter(levels))
class Visual(tk.Frame): """This class represents visual bot""" botname = BOT_NAME username = USER_NAME def __init__(self, *args): tk.Frame.__init__(self, *args) self.label = tk.Label(self, text=self.botname) self.label.pack() self.chat = ScrolledText(self, wrap=WORD, state=DISABLED, height=CHAT_HEIGHT, width=CHAT_WIDTH) self.chat.pack() self.comment = tk.Text(self, wrap=WORD, height=COMMENT_HEIGHT, width=COMMENT_WIDTH) self.comment.pack() self.button = tk.Button(self, text=BUTTON_TEXT, command=self.button_callback) self.button.pack() self.talk = ProcessSentence() def button_callback(self): text = self.comment.get("1.0", END) self.update_chat(self.talk.get_user_name(), text) text.rstrip(os.linesep) responce = self.talk.check_for_greeting(text) if responce: self.update_chat(self.talk.get_bot_name(), responce + '\n') def update_chat(self, name, text): self.chat.configure(state=NORMAL) self.chat.insert('end', name + " : ", 'GREEN') self.chat.tag_config('GREEN', foreground='GREEN') self.chat.insert('end', text) self.chat.see(END) self.chat.configure(state=DISABLED)
def add_widgets(self): chat_textarea = ScrolledText(self) chat_textarea['width'] = 110 chat_textarea['height'] = 30 chat_textarea.grid(row=0, column=0, columnspan=2) chat_textarea.tag_config('green', foreground='#008B00') chat_textarea.tag_config('system', foreground='red') self.children['chat_textarea'] = chat_textarea chat_inputarea = Text(self, name='chat_inputarea') chat_inputarea['width'] = 100 chat_inputarea['height'] = 7 chat_inputarea.grid(row=1, column=0, pady=10) send_button = Button(self, name='send_button') send_button['text'] = '发送' send_button['width'] = 5 send_button['height'] = 2 send_button.grid(row=1, column=1)
class ConsoleUi: """Poll messages from a logging queue and display them in a scrolled text widget""" def __init__(self, frame, master): self.frame = frame # Create a ScrolledText wdiget self.scrolled_text = ScrolledText(frame, state='disabled', height=12) self.scrolled_text.grid(row=0, column=0, sticky=(N, S, W, E)) self.scrolled_text.configure(font='TkFixedFont') self.scrolled_text.tag_config('INFO', foreground='black') self.scrolled_text.tag_config('DEBUG', foreground='gray') self.scrolled_text.tag_config('WARNING', foreground='orange') self.scrolled_text.tag_config('ERROR', foreground='red') self.scrolled_text.tag_config('CRITICAL', foreground='red', underline=1) # Create a logging handler using a queue self.log_queue = queue.Queue() self.queue_handler = QueueHandler(self.log_queue) formatter = logging.Formatter('%(message)s') self.queue_handler.setFormatter(formatter) logger.addHandler(self.queue_handler) # Start polling messages from the queue self.frame.after(100, self.poll_log_queue) self.scrolled_text.pack(fill=BOTH, expand=1) self.button_quit = Button(self.frame, text="Quit", fg="red", command=master.quit) self.button_quit.pack(anchor=NE, side=RIGHT) def display(self, record): msg = self.queue_handler.format(record) self.scrolled_text.configure(state='normal') self.scrolled_text.insert(END, msg + '\n', record.levelname) self.scrolled_text.configure(state='disabled') # Autoscroll to the bottom self.scrolled_text.yview(END) def poll_log_queue(self): # Check every 100ms if there is a new message in the queue to display while True: try: record = self.log_queue.get(block=False) except queue.Empty: break else: self.display(record) self.frame.after(100, self.poll_log_queue)
def widgets_init(self): '''控件初始化''' # 聊天区 chat_text_area = ScrolledText(self, name='chat_text_area') chat_text_area['width'] = 110 chat_text_area['height'] = 30 chat_text_area.grid(row=0, column=0, columnspan=2) chat_text_area.tag_config('green', foreground='#008B00') chat_text_area.tag_config('system', foreground='red') self.children['chat_text_area'] = chat_text_area # 输入区 chat_input_area = Text(self, name='chat_input_area') chat_input_area['width'] = 100 chat_input_area['height'] = 4 chat_input_area.grid(row=1, column=0, pady=10) # 发送按钮 send_button = Button(self, name='send_button') send_button['text'] = '发送' send_button['width'] = 5 send_button['height'] = 2 send_button.grid(row=1, column=1)
class DebugLogger(object): def __init__(self): self.GUI = tk.Toplevel() self.GUI.protocol('WM_DELETE_WINDOW', self.GUI.withdraw) self.GUI.title("Debug Console") self.textbox = ScrolledText(self.GUI) self.textbox.configure(state="disabled") self.textbox.pack(fill="both", expand=True) self.textbox.tag_config('stdout', foreground='blue') self.textbox.tag_config('stderr', foreground='red') self.GUI.focus() self.stdout = StdOut(self) self.stderr = StdErr(self) def write(self, buf, type): self.textbox.configure(state="normal") self.textbox.insert(tk.END, str(buf), type) self.textbox.configure(state="disabled") self.textbox.see("end") def flush(self): pass
class ConsoleWindow(tk.Frame): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # Create a ScrolledText wdiget self.scrolled_text = ScrolledText(self, height=7, state="disabled") self.scrolled_text.pack(expand=True, fill="both") self.scrolled_text.configure(font="TkFixedFont") self.scrolled_text.tag_config("INFO", foreground="green") self.scrolled_text.tag_config("DEBUG", foreground="gray") self.scrolled_text.tag_config("WARNING", foreground="orange") self.scrolled_text.tag_config("ERROR", foreground="red") self.scrolled_text.tag_config("CRITICAL", foreground="red", underline=1) # Create a logging handler using a queue self.log_queue = queue.Queue() self.queue_handler = QueueHandler(self.log_queue) formatter = logging.Formatter("%(asctime)s: %(message)s") self.queue_handler.setFormatter(formatter) logger.addHandler(self.queue_handler) # Start polling messages from the queue self.after(100, self.poll_log_queue) def display(self, record): msg = self.queue_handler.format(record) self.scrolled_text.configure(state="normal") self.scrolled_text.insert(tk.END, msg + "\n", record.levelname) self.scrolled_text.configure(state="disabled") self.scrolled_text.yview(tk.END) def poll_log_queue(self): # Check every 100ms if there is a new message in the queue to display while True: try: record = self.log_queue.get(block=False) except queue.Empty: break else: self.display(record) self.after(100, self.poll_log_queue) def close(self): pass
class ConsoleUi: """Poll messages from a logging queue and display them in a scrolled text widget""" def __init__(self, frame): self.frame = frame # Create a ScrolledText wdiget self.scrolled_text = ScrolledText(frame, state="disabled", height=12) self.scrolled_text.grid(row=0, column=0, sticky=(N, S, W, E)) self.scrolled_text.configure(font="TkFixedFont") self.scrolled_text.tag_config("INFO", foreground="black") self.scrolled_text.tag_config("DEBUG", foreground="gray") self.scrolled_text.tag_config("WARNING", foreground="orange") self.scrolled_text.tag_config("ERROR", foreground="red") self.scrolled_text.tag_config("CRITICAL", foreground="red", underline=1) # Create a logging handler using a queue self.log_queue = queue.Queue() self.queue_handler = QueueHandler(self.log_queue) formatter = logging.Formatter("%(asctime)s: %(message)s") self.queue_handler.setFormatter(formatter) logger.addHandler(self.queue_handler) # Start polling messages from the queue self.frame.after(100, self.poll_log_queue) def display(self, record): msg = self.queue_handler.format(record) self.scrolled_text.configure(state="normal") self.scrolled_text.insert(tk.END, msg + "\n", record.levelname) self.scrolled_text.configure(state="disabled") # Autoscroll to the bottom self.scrolled_text.yview(tk.END) def poll_log_queue(self): # Check every 100ms if there is a new message in the queue to display while True: try: record = self.log_queue.get(block=False) except queue.Empty: break else: self.display(record) self.frame.after(100, self.poll_log_queue)
class ConsoleUi: """Poll messages from a logging queue and display them in a scrolled text widget""" def __init__(self, frame): self.frame = frame # Create a ScrolledText wdiget self.scrolled_text = ScrolledText(frame, state='disabled', height=12) self.scrolled_text.grid(row=0, column=0, sticky=(N, S, W, E)) self.scrolled_text.configure(font='TkFixedFont') self.scrolled_text.tag_config('INFO', foreground='black') self.scrolled_text.tag_config('DEBUG', foreground='gray') self.scrolled_text.tag_config('WARNING', foreground='orange') self.scrolled_text.tag_config('ERROR', foreground='red') self.scrolled_text.tag_config('CRITICAL', foreground='red', underline=1) # Create a logging handler using a queue self.log_queue = queue.Queue() self.queue_handler = QueueHandler(self.log_queue) # Start polling messages from the queue self.frame.after(100, self.poll_log_queue) def display(self): msg = self.queue_handler self.scrolled_text.configure(state='normal') self.scrolled_text.insert(tk.END, msg + '\n') self.scrolled_text.configure(state='disabled') # Autoscroll to the bottom self.scrolled_text.yview(tk.END) def poll_log_queue(self): print("checked") # Check every 100ms if there is a new message in the queue to display while True: try: print("OOOOOOOOOin", queue.Empty()) record = self.log_queue.get(block=False) except queue.Empty: break else: self.display() self.frame.after(100, self.poll_log_queue)
class LoggingWindow: # Based on: https://github.com/beenje/tkinter-logging-text-widget def __init__(self, master): self.master = master self.scrolled_text = ScrolledText(master=master, state='disabled', height=15) self.scrolled_text.grid(row=0, column=0) self.scrolled_text.configure(font='TkFixedFont') self.scrolled_text.tag_config('INFO', foreground='black') self.scrolled_text.tag_config('DEBUG', foreground='gray') self.scrolled_text.tag_config('WARNING', foreground='orange') self.scrolled_text.tag_config('ERROR', foreground='red') # Get the logger self.logger = logging.getLogger() self.log_queue = queue.Queue() self.queue_handler = QueueHandler(self.log_queue) formatter = logging.Formatter( '%(asctime)s : %(levelname)s : %(message)s') self.queue_handler.setFormatter(formatter) self.logger.addHandler(self.queue_handler) # Start polling messages from the queue self.master.after(100, self.poll_log_queue) self.autoscroll = tk.BooleanVar() tk.Checkbutton(master, text='Autoscroll Log', variable=self.autoscroll).\ grid(row=1, column=0, sticky=tk.W) self.autoscroll.set(True) def display(self, record): msg = self.queue_handler.format(record) self.scrolled_text.configure(state='normal') self.scrolled_text.insert(tk.END, msg + '\n', record.levelname) self.scrolled_text.configure(state='disabled') # Autoscroll to the bottom if self.autoscroll.get(): self.scrolled_text.yview(tk.END) def poll_log_queue(self): # Check every 100ms if there is a new message in the queue to display while True: try: record = self.log_queue.get(block=False) except queue.Empty: break else: self.display(record) self.master.after(100, self.poll_log_queue)
class chat: # HOST = '172.28.32.140' HOST = '172.93.34.44' PORT = 9999 ADDR = (HOST, PORT) tmp = 0 def __init__(self): self.s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # ----------------------------------------------------------------------------- self.root = Tk() #主聊天人窗口 self.master = StringVar() self.MasterEntry = Entry(self.root, textvariable=self.master, width=8, font=('Verdana', 15), bg='turquoise', highlightcolor='red') self.master.set("bbb") # to self.labelto = Label(self.root, text=' to ', width=8, font=('Arial', 12)) # 客户聊天人窗口 self.client = StringVar() self.ClientEntry = Entry(self.root, textvariable=self.client, width=8, font=('Verdana', 15), bg='yellowgreen') self.client.set("aaa") # 聊天窗口 self.t_show = ScrolledText(self.root, width=40, height=30, font=('Verdana', 12), background='#ffffff', state=DISABLED) self.t_show.tag_config('m', foreground='turquoise') self.t_show.tag_config('c', foreground='yellowgreen') #self.t_show.insert('1.0', '') # 聊天输入窗口 self.chat = StringVar() self.ChatEntry = Entry(self.root, textvariable=self.chat, width=25, font=('Verdana', 15), foreground='gray') self.chat.set("Enter message") self.ChatEntry.bind('<Key-Return>', self.enter_send) # bind enter键按下事件 self.ChatEntry.bind('<FocusIn>', self.chat_cursor_enter) # bind 光标进入事件 self.ChatEntry.bind('<FocusOut>', self.chat_cursor_leave) # bind 光标离开事件 #发送和退出按钮 self.SendButton = Button(self.root, text="发送", width=16, command=self.send) self.ExitButton = Button(self.root, text="退出", width=8, command=self.exit, padx=5) #图片显示 self.photo = PhotoImage(file='./gif/xiaoqie.gif') self.labelimage = Label(image=self.photo) self.labelimage.image = self.photo self.labelimage.grid(row=1, column=3, columnspan=2, rowspan=1, sticky=W + E + N + S) self.MasterEntry.grid(row=0, column=0) self.labelto.grid(row=0, column=1) self.ClientEntry.grid(row=0, column=2) self.t_show.grid(row=1, column=0, columnspan=3, rowspan=1, sticky=W + E + N + S, padx=10, pady=10) self.ChatEntry.grid(row=2, column=0, columnspan=2, padx=10, pady=10) self.SendButton.grid(row=2, column=2) self.ExitButton.grid(row=2, column=3, columnspan=2) # self.s.sendto('hello'.encode('utf-8'), ('172.28.32.140', 9999)) self.s.sendto('hello'.encode('utf-8'), self.ADDR) print('thread %s is running...' % threading.current_thread().name) self.t = threading.Thread(target=self.recv_loop, name='LoopThread') self.t.setDaemon(True) # 设置为守护线程,守护进程有个好处就是主进程结束,自动结束,解决之前窗口强制退出报错问题 self.t.start() self.t = threading.Thread(target=self.flash, name='ImageThread') self.t.setDaemon(True) # 设置为守护线程,守护进程有个好处就是主进程结束,自动结束,解决之前窗口强制退出报错问题 self.t.start() # self.root.mainloop() def flash(self): # PhotoImage(file='F:/wuyongxiang/laoying/images/' + str(tmp) + '.gif') #files = os.listdir('F:/wuyongxiang/study/python/untitled1/gif/xiaoqie/') files = os.listdir('./gif/xiaoqie/') print(files) files.sort(key=lambda x: int(x[:-4])) # 使用sort 的key 的lambda 按大小进行排序 print(files) photos = [PhotoImage(file='./gif/xiaoqie/' + filet) for filet in files] # print('F:/wuyongxiang/laoying/images/'+file) print('photos is : %d' % len(photos)) #time.sleep(1) while True: self.tmp = self.tmp + 1 for photo in photos: print('%s ' % photo) self.labelimage.configure( image=photo) #这样就可以不在使用grid重新排版添加控件,如此节省资源 self.labelimage.image = photo #self.labelimage.grid(row=0, column=0, rowspan=2, columnspan=2) #不在需要重新布局,这样太占资源 #self.labelimage1.grid(row=1, column=3, columnspan=2, rowspan=1, sticky=W + E + N + S) a = random.uniform(0.1, 0.4) #随机产生浮点数 0.1-0.4之间 #print('aaaaaaaaaaaaaaaaaaaaa %f'%a) time.sleep(a) del photo if self.tmp > 2: del photos files = os.listdir('./gif/xiaoqie/') # print(files) files.sort( key=lambda x: int(x[:-4])) # 使用sort 的key 的lambda 按大小进行排序 # print(files) # photos=[0] photos = [ PhotoImage(file='./gif/xiaoqie/' + filet) for filet in files ] # print('F:/wuyongxiang/laoying/images/'+file) # print('photos is : %d' % len(photos)) print('--------------------------') self.tmp = 0 with Image.open('./gif/xiaoqie.gif') as im: if im.is_animated: frames = [f.copy() for f in ImageSequence.Iterator(im)] # frames.reverse() # 内置列表倒序方法 # frames.reverse() random.shuffle(frames) frames[0].save('./gif/xiaoqie.gif', save_all=True, append_images=frames[1:]) im = Image.open("./gif/xiaoqie.gif") im.save("./gif/xiaoqie/0.gif") while True: try: seq = im.tell() im.seek(seq + 1) im.save("./gif/xiaoqie/%s.gif" % (seq), quality=100) except EOFError: break def chat_cursor_enter(self, event): if self.chat.get() == 'Enter message' or self.chat.get() == '': self.chat.set("") self.ChatEntry['foreground'] = 'black' # 重新设置Entry字体颜色 def chat_cursor_leave(self, event): self.ChatEntry['foreground'] = 'gray' # 重新设置Entry字体颜色 if self.chat.get() == 'Enter message' or self.chat.get( ) == '': # 如果输入框里面有输入内容则不使用默认语句覆盖 self.chat.set("Enter message") # def send(self): # print('test!') def enter_send(self, event): print('按下Enter: ' + event.char) self.send() def send(self): # 发送数据: # s.sendto(data, ('172.93.34.44', 9999)) if self.master.get() == '': self.t_show.config(state=NORMAL) #让消息显示框可以正常输入 self.t_show.insert(END, '请输入您的姓名!\n', 'm') self.t_show.config(state=DISABLED) #让消息显示框禁止输入 return if self.client.get() == '': self.t_show.config(state=NORMAL) # 让消息显示框可以正常输入 self.t_show.insert(END, '请输入对方姓名!\n', 'm') self.t_show.config(state=DISABLED) # 让消息显示框禁止输入 return # self.DefaultMaster=self.master.get() # self.DefaultClient=self.master.get() tmpdata = b'<' + self.master.get().encode( 'utf-8') + b' to ' + self.client.get().encode( 'utf-8') + b'>data=' + self.chat.get().encode('utf-8') print('send data is: %s' % tmpdata) self.s.sendto(tmpdata, self.ADDR) # s.sendto(sendvar.get().encode('utf-8'), ('172.93.34.44', 9999)) # self.t_show.insert(END, ' ' + self.chat.get() + ':' + self.master.get() + '\n','m') self.t_show.config(state=NORMAL) # 让消息显示框可以正常输入 self.t_show.insert(END, self.chat.get() + '\n\n', 'm') self.t_show.config(state=DISABLED) # 让消息显示框禁止输入 self.t_show.see(END) # 让滚动条一直处于最下端 self.chat.set('') def exit(self): tpdata = b'<' + self.master.get().encode( 'utf-8') + b' to ' + self.client.get().encode( 'utf-8') + b'><!quit>' print('exit send :%s' % tpdata) self.s.sendto(tpdata, self.ADDR) # self.s.sendto(b'<'+self.master.get().encode('utf-8')+b' to '+self.client.get().encode('utf-8')+b'><!quit>data=',self.ADDR) # self.s.sendto( '<!quit>data='.encode('utf-8'),self.ADDR) # self.ExitButton['text'] = '成功' #time.sleep(1) # 一定要延时,否则没等消息过来终止线程,窗口退出会异常 self.root.destroy() def recv_loop(self): print('thread %s is running...' % threading.current_thread().name) self.s.settimeout(2) while True: # time.sleep(3) # 接收数据: # self.rec = self.s.recv(1024).decode('utf-8') try: self.rec = self.s.recv(1024) # break except socket.timeout: print('-------超时,重新接收--------') continue print('接收的数据是:%s' % self.rec.decode('utf-8')) # patternclient = # 匹配查找client 名字8 if re.search(re.compile(b"<!quit>"), self.rec) != None: break if re.search(re.compile(b"(?<=<).+?(?= to)"), self.rec) != None: clientname = re.search(re.compile(b"(?<=<).+?(?= to)"), self.rec).group(0).decode('utf-8') if re.search(re.compile(b"(?<=data=).+"), self.rec) != None: # 带有谁发送提示 # self.t_show.insert(END,clientname+':'+re.search(re.compile(b"(?<=data=).+"),self.rec).group(0).decode('utf-8')+'\n','a') self.t_show.config(state=NORMAL) # 让消息显示框可以正常输入 self.t_show.insert( END, re.search(re.compile(b"(?<=data=).+"), self.rec).group(0).decode('utf-8') + '\n\n', 'c') self.t_show.config(state=DISABLED) # 让消息显示框禁止输入 self.t_show.see(END) # 让滚动条一直处于最下端 if self.master.get() != clientname: # 防止自己跟自己聊天 self.client.set(clientname)
if usr_name == '': user = addr # 聊天窗口 # 创建图形界面 root = tkinter.Tk() root.title(usr_name) # 窗口命名为用户名 root['height'] = 400 root['width'] = 580 root.resizable(0, 0) # 限制窗口大小 # 创建多行文本框 listbox = ScrolledText(root) listbox.place(x=5, y=0, width=570, height=320) # 文本框使用的字体颜色 listbox.tag_config('red', foreground='red') listbox.tag_config('blue', foreground='blue') listbox.tag_config('green', foreground='green') listbox.tag_config('black', foreground='black') listbox.insert(tkinter.END, 'Welcome to the chat room!', 'blue') # 表情功能代码部分 # 16个按钮, 使用全局变量, 方便创建和销毁 b1 = '' b2 = '' b3 = '' b4 = '' b5 = '' b6 = '' b7 = '' b8 = ''
# 创建多行文本框 chatbox = ScrolledText(mainWin) chatbox.place(x=20, y=20, width=860, height=460) chatFont = ft.Font(family='Microsoft YaHei', size=12, weight=ft.NORMAL, slant=ft.ROMAN) chatbox.configure(font=chatFont) # 文本框使用的字体颜色 sysFont = ft.Font(family='Microsoft YaHei', size=12, weight=ft.NORMAL, slant=ft.ITALIC) chatbox.tag_config('sys', foreground='black', font=sysFont) # 系统输出 chatbox.insert(tkinter.END, 'Welcome to Mini Chatroom!\n', 'sys') chatbox.tag_config('mg', foreground='#4169E1') # 自己@所有人 chatbox.tag_config('og', foreground='#9400D3') # 别人@所有人 chatbox.tag_config('mo', foreground='#008B45') # 自己@别人 chatbox.tag_config('om', foreground='#FF3030') # 别人@自己 ''' *** 功能实现 *** ''' # 当前功能 0:text(default) / 1:emoji / 2:file status = 0 # 输入文本框(默认place) iptText = tkinter.Text(mainWin, width=120) iptText.place(x=20, y=560, width=750, height=140) iptFont = ft.Font(family='Microsoft YaHei', size=12,
class CmdlAppGui(): def __init__(self, title, cb_input): self.title = title self.cb_input = cb_input # the callback function for user input self.here = False # the gui is not here, yet self.root = tk.Tk() self.root.title(title) self.frm = ttk.Frame(master=self.root, padding="3 3 12 12") self.build(self.frm) self.here = True def start(self): self.frm.mainloop() self.here = False # the gui is no longer here def put_msg(self, text, style=0): # display user mesages in the left window if self.here: if style == 1: self.scrollmsg.insert(tk.INSERT, text, 'bold') else: self.scrollmsg.insert(tk.INSERT, text, '') self.scrollmsg.yview_scroll(99,'pages') else: print("GUI msg: {0}".format(text)) def put_data(self, text, style=0): # display user data in the right window if self.here: if style == 1: self.scrolldata.insert(tk.INSERT, text, 'bold') else: self.scrolldata.insert(tk.INSERT, text, '') self.scrolldata.yview_scroll(99,'pages') else: print("GUI data: {0}".format(text)) def build(self, frm): # layout of the gui elements frm.grid(column=0, row=0, sticky=(tk.N, tk.W, tk.E, tk.S)) frm.columnconfigure(0, weight=1) frm.columnconfigure(1, weight=2) frm.rowconfigure(0, weight=1) self.scrollmsg = ScrolledText(frm, wrap=tk.WORD, width=40) self.scrollmsg.grid(column=0, row=1, sticky="EW") self.scrollmsg.tag_config('bold', font=('Courier',10,'bold')) self.scrolldata = ScrolledText(frm, wrap=tk.WORD, width=40) self.scrolldata.grid(column=1, row=1, rowspan=9, sticky="NS") self.scrolldata.tag_config('bold', font=('Courier',10,'bold')) self.entrytext = tk.StringVar() self.entry = ttk.Entry(frm, textvariable=self.entrytext) self.entry.grid(column=0, row=3, sticky='EW') self.entry.bind("<Return>", self.on_press_enter) btn_quit = ttk.Button(frm, text="QUIT", command=self.finish) btn_quit.grid(column=0, row=9, sticky="EW") for child in frm.winfo_children(): child.grid_configure(padx=5, pady=5) self.entry.focus_set() # set the focus on the entry field def on_press_enter(self, event): # react to the enter key: send the text input to the callback function text = self.entrytext.get() self.cb_input(text) if self.here: self.entrytext.set('') self.entry.focus_set() # set the focus on the entry field def finish(self): # program call to terminate GUI self.here = False self.entry.unbind("<Return>") self.root.destroy()
if user: s.send(user.encode()) # 发送用户名 else: s.send('用户名不存在'.encode()) user = IP + ':' + PORT # 聊天窗口 root1 = tkinter.Tk() root1.geometry("640x480") root1.title('群聊') root1.resizable(0, 0) # 消息界面 listbox = ScrolledText(root1) listbox.place(x=5, y=0, width=640, height=320) listbox.tag_config('tag1', foreground='red', backgroun="yellow") listbox.insert(tkinter.END, '欢迎进入群聊,大家开始聊天吧!', 'tag1') INPUT = tkinter.StringVar() INPUT.set('') entryIuput = tkinter.Entry(root1, width=120, textvariable=INPUT) entryIuput.place(x=5, y=320, width=580, height=170) # 在线用户列表 listbox1 = tkinter.Listbox(root1) listbox1.place(x=510, y=0, width=130, height=320) def send(*args): message = entryIuput.get() + '~' + user + '~' + chat s.send(message.encode())
class Chat_UI(): def __init__(self, main_window): # region UI global USERNAME self.online_users_listbox = '' # 用于显示在线用户的列表框 self.online_users = [] # 在线用户列表 self.chatter = '群聊' # 聊天对象, 默认为群聊 self.main_window = main_window self.main_window.geometry('590x420+320+100') self.main_window.resizable(0, 0) # 消息区域 self.message_aera = ScrolledText(self.main_window) self.message_aera.place(x=5, y=5, width=450, height=360) # 消息区字体颜色 self.message_aera.tag_config('red', foreground='red') self.message_aera.tag_config('blue', foreground='blue') self.message_aera.tag_config('green', foreground='green') self.message_aera.insert(tkinter.END, '您已进入聊天室\n', 'blue') # 在线用户区 self.online_users_listbox = tkinter.Listbox(self.main_window) self.online_users_listbox.place(x=455, y=5, width=130, height=360) # 在用户列表绑定选择聊天对象事件 self.online_users_listbox.bind('<ButtonRelease-1>', self.select_chatter) # 消息编辑区 self.message_text = tkinter.StringVar() self.message_text.set('') self.message_entry = tkinter.Entry(self.main_window, width=120, textvariable=self.message_text) self.message_entry.place(x=5, y=375, width=435, height=30) # 发送按钮 self.send_button = tkinter.Button(self.main_window, text='发送', command=self.send) self.send_button.place(x=455, y=375, width=60, height=30) # 绑定回车发送信息 self.main_window.bind('<Return>', self.send) # 清空按钮 self.send_button = tkinter.Button(self.main_window, text='清空', command=self.clear) self.send_button.place(x=525, y=375, width=60, height=30) # endregion self.my_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.my_socket.connect((SERVER_IP, SERVER_PORT)) # 用户名+=ip+port addr = self.my_socket.getsockname() # 获取客户端ip和端口号 addr = addr[0] + ':' + str(addr[1]) # SERVER_IP:port USERNAME = USERNAME + ' (' + addr + ')' self.main_window.title(USERNAME + ' 群聊') self.my_socket.send(USERNAME.encode()) r = threading.Thread(target=self.recv) r.start() # 开始线程接收信息 # 清空按钮事件 def clear(self, *args): self.message_text.set('') # 发送按钮事件 def send(self, *args): self.online_users.append('群聊') if self.chatter not in self.online_users: tkinter.messagebox.showerror('发送失败', message='请选择聊天对象') return False if self.chatter == USERNAME: tkinter.messagebox.showerror('发送失败', message='请不要选择自己') return False msg = USERNAME + ':;' + self.message_entry.get() + ':;' + self.chatter self.my_socket.send(msg.encode()) self.clear() # 发送后清空文本框 return True # 选择聊天对象事件 def select_chatter(self, *args): # 获取点击的索引然后得到内容(用户名) index = self.online_users_listbox.curselection()[0] if index == 0 or index == 1: self.main_window.title(USERNAME + ' 群聊') self.chatter = '群聊' else: self.chatter = self.online_users_listbox.get(index) self.main_window.title(USERNAME + ' --> ' + self.chatter) # 刷新在线列表 def refresh_list(self, receive_data): self.online_users_listbox.delete(0, tkinter.END) # 清空列表框 online_count = ('在线人数: ' + str(len(receive_data)) + ' 人') self.online_users_listbox.insert(tkinter.END, online_count) self.online_users_listbox.itemconfig(tkinter.END, fg='black', bg="lightgray") self.online_users_listbox.insert(tkinter.END, '群聊') self.online_users_listbox.itemconfig(tkinter.END, fg='black') for data in receive_data: self.online_users_listbox.insert(tkinter.END, data) self.online_users_listbox.itemconfig(tkinter.END, fg='black') # 接收服务端发送的信息 def recv(self): while True: receive_data = self.my_socket.recv(1024) receive_data = receive_data.decode() try: # 接收到在线用户列表 receive_data = json.loads(receive_data) self.online_users = receive_data self.refresh_list(receive_data) except: # 接收到消息 receive_data = receive_data.split(':;') data1 = receive_data[0] # 发送信息的用户名 data2 = receive_data[1].strip() # 消息 data3 = receive_data[2] # 聊天对象 if data3 == '群聊': data2 = data1 + ' to all : ' + data2 + '\n' if data1 == USERNAME: # 自己发送的 self.message_aera.insert(tkinter.END, data2, 'blue') else: # 接收的 self.message_aera.insert(tkinter.END, data2, 'green') elif data1 == USERNAME or data3 == USERNAME: # 私聊 data2 = data1 + ' to ' + data3 + ' : ' + data2 + '\n' self.message_aera.insert(tkinter.END, data2, 'red') self.message_aera.see(tkinter.END) def __del__(self): self.my_socket.close() # 关闭 TCP 连接
class ChatGUI(Frame): def __init__(self, parent, conn, title): #Frame.__init__(self, parent, background="grey") self.parent = parent self.conn = conn self.title = title self.centerWindow() self.initUI() def initUI(self): self.lineCounter = 0 # create a custom font self.customFontHeader = font.Font(family="Calibri", slant = "italic") #family="Helvetica", weight="bold", slant="italic") self.customFontMessage = font.Font(family="Calibri") self.parent.title(self.title) frame = Frame(self.parent) frame.pack(fill=BOTH, expand=1, side=LEFT) self.box = ScrolledText(frame, wrap=WORD, relief = GROOVE, width=30, height=18, font=self.customFontMessage) self.box.insert(END, 'Welcome to Python Chat!') self.box.config(state=DISABLED) self.box.pack(expand="yes", fill=BOTH, side=TOP) self.textarea = Text(frame, width=30, height=5) #self.textarea.insert(END, "") self.textarea.bind("<KeyRelease-Return>", self.gettext) #Se metto on press, rimane una newline in piu self.textarea.pack(expand="yes", fill=BOTH, side=TOP) okButton = Button(frame, text="Panic Button", activebackground="red", command=self.sendFile) okButton.pack(expand="no", fill=BOTH, side=TOP) self.usersFrame = Frame(self.parent) self.usersFrame.pack(fill=BOTH, expand=1, side=RIGHT) self.userListbox = Listbox(self.usersFrame, width=3) self.userListbox.bind("<Double-Button-1>", self.privateChat) self.userListbox.pack(fill=BOTH, expand=1) self.updateUsersFrame() def centerWindow(self): w = 600 h = 475 sw = self.parent.winfo_screenwidth() sh = self.parent.winfo_screenheight() x = (sw - w)/2 y = (sh - h)/2 self.parent.geometry('%dx%d+%d+%d' % (w, h, x, y)) def gettext(self, e): #e sta per event, questo e' un listener text = self.textarea.get("1.0", END + " - 2c") # 1.0: row:columa - END-2c rimuove l'ultimo carattere, una newline \r\n self.textarea.delete("0.0", END) #NON VA: il problema e' che viene inviato il carattere di newline ma non incluso nell'area a causa della bind mi sa. Devo escluderlo io self.sendToServer(text) def printConversation(self, message): self.box.config(state=NORMAL) self.box.insert(END,"\n" + message) self.lineCounter = self.lineCounter + 2 #m = re.match("\[.*\] From .*\n", self.box.get("0.0", END)) m = re.search("\[.*\].*:", message, re.MULTILINE) if m is not None: #print("MATCH") #print(m.group(0)) #print(str(m.start(0)) + "_" + str(m.end(0))) #print("COUNTER") #print(str(self.lineCounter) + "." + str(m.start(0)+1) + "___" + str(self.lineCounter) + "." + str(m.end(0))) self.box.tag_add("header", str(self.lineCounter) + "." + str(m.start(0)), str(self.lineCounter) + "." + str(m.end(0))) self.box.tag_config("header", font=self.customFontHeader, foreground = "blue") self.box.config(state=DISABLED) #self.box.yview_scroll(10000,"units") self.box.see(END) def sendToServer(self, messageToSend): self.conn.send(messageToSend.encode(encoding='utf_8', errors='strict')) def sendFile(self): #aprire una dialog di quelle predefinite (Sfoglia...) #capire come fare la send di un file sul socket... pass def updateUsersFrame(self): global connectedClients self.userListbox.delete(0, END) self.userListbox.insert(END, "Connected users") for item in connectedClients: self.userListbox.insert(END, item) #self.userListbox.update() #self.usersFrame.update() def privateChat(self, e): global conversationBoxList userselected = self.userListbox.selection_get() if not userselected == "Connected users": print("EVVAI CHAT PRIVATA con "+userselected) newWindow = Toplevel(self.parent) newWindow.title("Python Chat with "+userselected) newWindow.minsize(400, 475) newWindow.focus() def disconnectPM(): del conversationBoxList[userselected] newWindow.destroy() newWindow.protocol('WM_DELETE_WINDOW', disconnectPM) #label = Label(newWindow, text="PROVA PROVA") #label.pack(side="top", fill="both", padx=10, pady=10) frame = Frame(newWindow) frame.pack(fill=BOTH, expand=1, side=LEFT) box = ScrolledText(frame, wrap=WORD, relief = GROOVE, width=30, height=18, font=self.customFontMessage) box.config(state=DISABLED) box.pack(expand="yes", fill=BOTH, side=TOP) textarea = Text(frame, width=30, height=5) textarea.bind("<KeyRelease-Return>", lambda event : self.getprivatetext(event, textarea, userselected)) textarea.pack(expand="yes", fill=BOTH, side=TOP) #aggiungo alla mappa globale il box di conversazione conversationBoxList[userselected] = box def receivePrivateChat(self, connectingUser): global conversationBoxList print("CHAT PRIVATA in arrivo con "+connectingUser) newWindow = Toplevel(self.parent) newWindow.title("Python Chat requested by "+connectingUser) newWindow.minsize(400, 475) newWindow.focus() def disconnectPM(): del conversationBoxList[connectingUser] newWindow.destroy() newWindow.protocol('WM_DELETE_WINDOW', disconnectPM) #label = Label(newWindow, text="PROVA PROVA") #label.pack(side="top", fill="both", padx=10, pady=10) frame = Frame(newWindow) frame.pack(fill=BOTH, expand=1, side=LEFT) box = ScrolledText(frame, wrap=WORD, relief = GROOVE, width=30, height=18, font=self.customFontMessage) box.config(state=DISABLED) box.pack(expand="yes", fill=BOTH, side=TOP) textarea = Text(frame, width=30, height=5) textarea.bind("<KeyRelease-Return>", lambda event : self.getprivatetext(event, textarea, connectingUser)) textarea.pack(expand="yes", fill=BOTH, side=TOP) #aggiungo alla mappa globale il box di conversazione conversationBoxList[connectingUser] = box def getprivatetext(self, e, textarea, nickname): text = textarea.get("1.0", END + " - 2c") textarea.delete("0.0", END) self.sendToServer("##" + nickname + "##" + text) def setprivatetext(self, nickname, message, isLocalMessage): #isLocalMessage identifica un messaggio che mando io e che devo ri-ricevere nella mia finestra if isLocalMessage: for i in conversationBoxList.keys(): box = conversationBoxList[i] box.config(state=NORMAL) box.insert(END,"\n" + message) box.config(state=DISABLED) box.see(END) else: conversationbox = conversationBoxList[nickname] conversationbox.config(state=NORMAL) conversationbox.insert(END,"\n" + message) #self.lineCounter = self.lineCounter + 2 #m = re.match("\[.*\] From .*\n", self.box.get("0.0", END)) #m = re.search("\[.*\].*:", message, re.MULTILINE) ''' if m is not None: #print("MATCH") #print(m.group(0)) #print(str(m.start(0)) + "_" + str(m.end(0))) #print("COUNTER") #print(str(self.lineCounter) + "." + str(m.start(0)+1) + "___" + str(self.lineCounter) + "." + str(m.end(0))) self.box.tag_add("header", str(self.lineCounter) + "." + str(m.start(0)), str(self.lineCounter) + "." + str(m.end(0))) self.box.tag_config("header", font=self.customFontHeader, foreground = "blue") ''' conversationbox.config(state=DISABLED) #self.box.yview_scroll(10000,"units") conversationbox.see(END)
class Application(Frame): def __init__(self, master=None): self.warning = '【封号防止】\n' + \ '请尽量在自己的日常刷魂时间使用\n' + \ '请不要长时间连续使用,任何使你看起来明显违背人类正常作息规律的行为,很容易会被鬼使黑盯上\n' + \ '当你离开了常在城市,请不要使用,这会被认为是找了代练\n' + \ '点到为止,贪婪是万恶之源\n' self.label = r'阴阳师-网易游戏' self.hwnd = None self.shell = None if not self.info_get(): self.scaling = 1 self.clear_time = 35 self.fight = None self.timing_value = None # 控件初始化 Frame.__init__(self, master) self.pack() self.frame1 = Frame(self) self.frame1.pack() self.frame2 = Frame(self) self.frame2.pack() self.label_scaling = Label(self.frame1) self.var_scaling = StringVar(self.frame1) self.entry_scaling = Entry(self.frame1) self.button_scaling_explain = Button(self.frame1) self.label_mode = Label(self.frame1) self.var_mode = StringVar(self.frame1) self.listbox_mode = ttk.Combobox(self.frame1) self.button_mode_explain = Button(self.frame1) self.label_member = Label(self.frame1) self.var_member = IntVar() self.radio1 = Radiobutton(self.frame1) self.radio2 = Radiobutton(self.frame1) self.label_clear_time = Label(self.frame1) self.var_clear_time = StringVar(self.frame1) self.entry_clear_time = Entry(self.frame1) self.button_clear_time_explain = Button(self.frame1) self.label_offer = Label(self.frame1) self.var_offer_mode = StringVar(self.frame1) self.listbox_offer_mode = ttk.Combobox(self.frame1) self.label_timing_mode = Label(self.frame1) self.var_timing_mode = StringVar(self.frame1) self.listbox_timing_mode = ttk.Combobox(self.frame1) self.var_timing_value = StringVar(self.frame1) self.entry_timing_value = Entry(self.frame1) self.entry_test = Entry(self.frame1) self.test_btn = Button(self.frame1) self.start_ctn = Button(self.frame2) self.stop_ctn = Button(self.frame2) self.info_box = ScrolledText(self.frame2) self.queue = Queue(maxsize=1) self._running = 1 self.create_main() @staticmethod def check_hwnd(label): # 获取游戏窗口句柄 hwnd = win32gui.FindWindow(None, label) if hwnd: return hwnd else: print('游戏没有运行') return False @staticmethod def init_window_place(root, x, y): screenwidth = root.winfo_screenwidth() screenheight = root.winfo_screenheight() root.resizable(False, False) root.update_idletasks() root.deiconify() width = root.winfo_width() height = root.winfo_height() size = '%dx%d+%d+%d' % (width, height, (screenwidth - width) / x, (screenheight - height) / y) root.geometry(size) def jump_window(self): # 跳转到游戏窗口 win32gui.SetForegroundWindow(self.hwnd) win32gui.PostMessage(self.hwnd, win32con.WM_SYSCOMMAND, win32con.SC_RESTORE, 0) def get_scaling(self): var = self.entry_scaling.get() try: var = float(var) except ValueError: messagebox.showinfo(title='提示', message='缩放倍率只能为数字') return False if var > 2: messagebox.showinfo(title='提示', message='缩放倍率过高') return False return var def get_clear_time(self): var = self.var_clear_time.get() try: var = float(var) except ValueError: messagebox.showinfo(title='提示', message='平均通关时间只能为数字') return False if var <= 5: messagebox.showinfo(title='提示', message='平均通关时间不能小于5') return False return var def get_timimg(self): if self.listbox_timing_mode.get() == '无': return True var = self.var_timing_value.get() try: var = float(var) except ValueError: messagebox.showinfo(title='提示', message='预定结束只能填入数字') return False if var < 1: messagebox.showinfo(title='提示', message='数字过小,无法执行') return False return var @staticmethod def time_format(second): try: second = int(second) except ValueError: return second if second > 60: m, s = divmod(second, 60) h, m = divmod(m, 60) return ':'.join( (str(h).zfill(2), str(m).zfill(2), str(s).zfill(2))) else: return second def info_get(self): try: with shelve.open('mysetting.db') as data: setting_data = data['setting'] self.scaling = setting_data['scaling'] self.clear_time = setting_data['clear_time'] except KeyError: return False return True def info_save(self): with shelve.open('mysetting.db') as data: setting_data = dict() setting_data['scaling'] = self.var_scaling.get() setting_data['clear_time'] = self.var_clear_time.get() data['setting'] = setting_data def turn_radio_on(self, *args): type(args) var = self.listbox_mode.get() if var == '司机': self.radio1.configure(state='active') self.radio2.configure(state='active') else: self.radio1.configure(state='disabled') self.radio2.configure(state='disabled') def turn_entry_on(self, *args): type(args) var = self.listbox_timing_mode.get() if var == '定时[分钟]' or var == '场数': self.entry_timing_value.configure(state='normal') else: self.entry_timing_value.configure(state='disabled') def fight_start(self): self.scaling = self.get_scaling() if not self.scaling: return False self.clear_time = self.get_clear_time() if not self.clear_time: return False self.timing_value = self.get_timimg() if not self.timing_value: return False self.info_save() # 获取游戏窗口句柄 self.hwnd = self.check_hwnd(self.label) if not self.hwnd: messagebox.showinfo(title='提示', message='游戏没有运行') return False self.shell = win32com.client.Dispatch("WScript.Shell") # self.shell.SendKeys('%') self.jump_window() time.sleep(0.5) self.fight = GameController(self.hwnd, self.scaling) thread1 = threading.Thread(target=self.fight_thread, name='fight_thread') thread2 = threading.Thread(target=self.offer_thread, name='offer_thread') # 将线程状态、队列内容置为1 self._running = 1 if self.queue.empty(): self.queue.put(1) else: self.queue.get() self.queue.put(1) self.start_ctn.configure(state='disabled') self.stop_ctn.configure(state='active') thread1.start() thread2.start() def fight_thread(self): self.jump_window() if not self.queue.empty(): self.queue.get() self.info_box.mark_set('insert', END) self.info_box.insert('insert', str(self.warning) + '\n', 'RED') self.info_box.tag_config('RED', foreground='red') var = '[%s]挂机开始' % datetime.datetime.now().strftime("%H:%M:%S") self.info_box.mark_set('insert', END) self.info_box.insert('insert', str(var) + '\n') self.info_box.see(END) rounds = 0 total_time = 0 beginning_timg = time.clock() while True: if self._running == 1: fight_start_time = time.clock() self.fight.form_team_phase(self.listbox_mode.get(), self.var_member.get(), self.queue) self.fight.wait_fight_finish_phase(self.clear_time, self.queue) self.jump_window() self.fight.settle_phase(self.queue) if self._running == 1: fight_end_time = time.clock() fight_time = fight_end_time - fight_start_time # time.sleep(0.5) rounds = rounds + 1 total_time = total_time + fight_time elapsed_time = fight_end_time - beginning_timg var = '第 %s 场 耗时:%s 共计:%s' % \ (rounds, self.time_format(fight_time), self.time_format(elapsed_time)) self.info_box.mark_set('insert', END) self.info_box.insert('insert', str(var) + '\n') self.info_box.see(END) # 检查是否到达预定结束场数或时间 if (self.listbox_timing_mode.get() == '场数' and rounds >= self.timing_value) or \ (self.listbox_timing_mode.get() == '定时[分钟]' and elapsed_time / 60 >= self.timing_value): win32gui.PostMessage(self.hwnd, win32con.WM_CLOSE, 0, 0) self.fight_stop() var = '已到达预定目标,游戏窗口已关闭。下线15分钟后buff自动关闭' self.info_box.mark_set('insert', END) self.info_box.insert('insert', str(var) + '\n') self.info_box.see(END) time.sleep(random.uniform(1, 2)) elif self._running == 0: return def fight_stop(self): # 将线程状态、队列内容置为0 self._running = 0 self.queue.put(0) self.start_ctn.configure(state='active') self.stop_ctn.configure(state='disabled') var = '[%s]挂机结束。记得关御魂buff' % datetime.datetime.now().strftime( "%H:%M:%S") self.info_box.mark_set('insert', END) self.info_box.insert('insert', str(var) + '\n') self.info_box.see(END) def offer_thread(self): while True: if self._running == 1: self.fight.check_offer(self.listbox_offer_mode.get(), self.queue) elif self._running == 0: return @staticmethod def resource_path(relative_path): """ Get absolute path to resource, works for dev and for PyInstaller """ base_path = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__))) return os.path.join(base_path, relative_path) def what_is_scaling_window(self): what_is_scaling = Toplevel(self) what_is_scaling.title('缩放倍率 - 不能自动获取,技术就是这么菜,不服憋着_(:3」∠)_') frame1 = Frame(what_is_scaling) frame1.pack() frame2 = Frame(what_is_scaling) frame2.pack() title = Label(frame1) title['text'] = '\n【 缩放倍率 】' title.pack() desc1 = Message(frame1) desc1['width'] = 600 desc1['text'] = '\n缩放倍率是指Windows系统在不改变分辨率的情况下,将窗口和图标放大以达到更加舒适的显示效果的功能\n' + \ '\n在某些分辨率下,Windows会自动设置一个超过100%的倍率。请确定自己系统当前的缩放倍率设置,并填入缩放倍率一栏中\n' + \ '\n不正确的缩放倍率设置,会导致坐标计算不准\n' + \ '\n若设置的缩放倍率是100%,则填入1,若是125%,则填1.25,依次类推\n' desc1.pack() label_win10 = Label(frame2) label_win10['text'] = 'Windows 10' label_win10.grid(row=0, column=0) label_win7 = Label(frame2) label_win7['text'] = 'Windows 7' label_win7.grid(row=0, column=1) ipath = self.resource_path('image/win10.png') load = PLI_Image.open(ipath) load = load.resize(tuple(map(lambda x: int(x * 0.5), load.size))) render = ImageTk.PhotoImage(load) img_win10 = Label(frame2, image=render) img_win10.image = render img_win10.grid(row=1, column=0) ipath = self.resource_path('image/win7.png') load = PLI_Image.open(ipath) load = load.resize(tuple(map(lambda x: int(x * 0.5), load.size))) render = ImageTk.PhotoImage(load) img_win7 = Label(frame2, image=render) img_win7.image = render img_win7.grid(row=1, column=1) self.init_window_place(what_is_scaling, 1.3, 3) def when_click_start_window(self): when_click_start = Toplevel(self) when_click_start.title('模式说明') var = self.listbox_mode.get() if var == '单刷': title = Label(when_click_start) title['text'] = '\n【 单刷模式 】' title.pack() desc = Message(when_click_start) desc['text'] = '\n请把游戏调整至如图所示界面,再点START\n' desc['width'] = 300 desc.pack() ipath = self.resource_path('image/single.png') load = PLI_Image.open(ipath) load = load.resize(tuple(map(lambda x: int(x * 0.7), load.size))) render = ImageTk.PhotoImage(load) img = Label(when_click_start, image=render) img.image = render img.pack() elif var == '乘客': title = Label(when_click_start) title['text'] = '\n【 乘客模式 】' title.pack() desc = Message(when_click_start) desc['text'] = '\n建议接受了司机的默认邀请,再点START\n' + \ '因为我不会在战斗里帮你点开始...不服憋着\n_(:3」∠)_\n' desc['width'] = 300 desc.pack() ipath = self.resource_path('image/passenger_accept.png') load = PLI_Image.open(ipath) load = load.resize(tuple(map(lambda x: int(x * 0.7), load.size))) render = ImageTk.PhotoImage(load) img = Label(when_click_start, image=render) img.image = render img.pack() elif var == '司机': title = Label(when_click_start) title['text'] = '\n【 司机模式 】' title.pack() desc = Message(when_click_start) desc['text'] = '\n建议对乘客发出默认邀请,回到组队界面再点START\n' + \ '因为自动发出邀请这个功能没写...不服憋着\n_(:3」∠)_\n' desc['width'] = 300 desc.pack() ipath = self.resource_path('image/driver_invite.png') load = PLI_Image.open(ipath) load = load.resize(tuple(map(lambda x: int(x * 0.5), load.size))) render = ImageTk.PhotoImage(load) img1 = Label(when_click_start, image=render) img1.image = render img1.pack() ipath = self.resource_path('image/driver_form.png') load = PLI_Image.open(ipath) load = load.resize(tuple(map(lambda x: int(x * 0.5), load.size))) render = ImageTk.PhotoImage(load) img2 = Label(when_click_start, image=render) img2.image = render img2.pack() self.init_window_place(when_click_start, 1.3, 3) def what_is_clear_time(self): what_is_clear = Toplevel(self) what_is_clear.title('平均通关时间说明') title = Label(what_is_clear) title['text'] = '\n【 平均通关时间 】' title.pack() desc = Message(what_is_clear) desc['text'] = '\n平均通关时间是指在游戏中,从按下开始战斗到进入结算奖励界面所经过的时间(秒)\n' + \ '\n程序会在经过指定的时间后,再开始检测游戏画面是否进入了结算界面\n' + \ '\n如果设置一个较短的时间也可以,不过设置一个合理的时间,能节省你CPU资源\n(其实也没占多少_(:3」∠)_\n' desc['width'] = 300 desc.pack() self.init_window_place(what_is_clear, 1.3, 3) def create_main(self): self.label_scaling['text'] = '缩放倍率' self.var_scaling.set(self.scaling) self.entry_scaling['textvariable'] = self.var_scaling self.label_scaling.grid(row=0, column=0, sticky='E') self.entry_scaling.grid(row=0, column=1, sticky='W', columnspan=2) self.button_scaling_explain['text'] = '?' self.button_scaling_explain['command'] = self.what_is_scaling_window self.button_scaling_explain['relief'] = 'flat' self.button_scaling_explain.grid(row=0, column=2, sticky='E') self.label_mode['text'] = '模式' self.var_mode.set('单刷') self.listbox_mode['textvariable'] = self.var_mode self.listbox_mode['width'] = 10 self.listbox_mode['values'] = ["单刷", "乘客", "司机"] self.listbox_mode.bind("<<ComboboxSelected>>", self.turn_radio_on) self.label_mode.grid(row=1, column=0, sticky='E') self.listbox_mode.grid(row=1, column=1, sticky='W') self.button_mode_explain['text'] = '?' self.button_mode_explain['command'] = self.when_click_start_window self.button_mode_explain['relief'] = 'flat' self.button_mode_explain.grid(row=1, column=2, sticky='W') self.var_member.set(2) self.label_member['text'] = '车队人数' self.label_member.grid(row=2, column=0, sticky='E') self.radio1['text'] = '2人' self.radio1['variable'] = self.var_member self.radio1['value'] = 2 # self.radio1['command'] = self.test_val3 self.radio1.grid(row=2, column=1, sticky='W') self.radio1.configure(state='disabled') self.radio2['text'] = '3人' self.radio2['variable'] = self.var_member self.radio2['value'] = 3 # self.radio2['command'] = self.test_val3 self.radio2.grid(row=2, column=2, sticky='W') self.radio2.configure(state='disabled') self.label_clear_time['text'] = '平均通关时间' self.var_clear_time.set(self.clear_time) self.entry_clear_time['textvariable'] = self.var_clear_time self.label_clear_time.grid(row=3, column=0, sticky='E') self.entry_clear_time.grid(row=3, column=1, sticky='W', columnspan=2) self.button_clear_time_explain['text'] = '?' self.button_clear_time_explain['command'] = self.what_is_clear_time self.button_clear_time_explain['relief'] = 'flat' self.button_clear_time_explain.grid(row=3, column=2, sticky='E') self.label_offer['text'] = '好友发来悬赏' self.var_offer_mode.set('接受') self.listbox_offer_mode['textvariable'] = self.var_offer_mode self.listbox_offer_mode['width'] = 10 self.listbox_offer_mode['values'] = ["接受", "拒绝"] self.listbox_offer_mode.bind("<<ComboboxSelected>>", self.turn_radio_on) self.label_offer.grid(row=4, column=0, sticky='E') self.listbox_offer_mode.grid(row=4, column=1, sticky='W') self.label_timing_mode['text'] = '预定结束' self.var_timing_mode.set('无') self.listbox_timing_mode['textvariable'] = self.var_timing_mode self.listbox_timing_mode['width'] = 10 self.listbox_timing_mode['values'] = ["无", "定时[分钟]", "场数"] self.listbox_timing_mode.bind("<<ComboboxSelected>>", self.turn_entry_on) self.label_timing_mode.grid(row=5, column=0, sticky='E') self.listbox_timing_mode.grid(row=5, column=1, sticky='W') self.var_timing_value.set('') self.entry_timing_value['textvariable'] = self.var_timing_value self.entry_timing_value['width'] = 5 self.entry_timing_value.configure(state='disabled') self.entry_timing_value.grid(row=5, column=2, sticky='W') self.start_ctn['text'] = 'START' self.start_ctn['width'] = 10 self.start_ctn['height'] = 2 self.start_ctn['command'] = self.fight_start self.start_ctn['relief'] = 'groove' self.start_ctn.grid(row=0, column=0, sticky='E') self.stop_ctn['text'] = 'STOP' self.stop_ctn['width'] = 10 self.stop_ctn['height'] = 2 self.stop_ctn['command'] = self.fight_stop self.stop_ctn['relief'] = 'groove' self.stop_ctn.grid(row=0, column=1, sticky='W') self.stop_ctn.configure(state='disabled') self.info_box['width'] = 40 self.info_box['height'] = 20 self.info_box.grid(row=1, column=0, columnspan=2) self.info_box.see(END) var = '请授予此程序管理员权限运行,否则在游戏窗口内鼠标无法被控制' self.info_box.mark_set('insert', END) self.info_box.insert('insert', str(var) + '\n') self.info_box.see(END)
class OptimizerMainWindow: """ classdocs """ # TODO: change that name def reactToClick(self, event): a = AddRestrictionDialog(self) def __init__(self, optimizer): # always have a reference to model/controller self.optimizer = optimizer # setup main GUI and make stretchable self.guiRoot = Tk() self.guiRoot.title("OPTIMIZR") self.guiRoot.columnconfigure(1, weight=1) self.guiRoot.rowconfigure(0, weight=1) # left (settings) and right (sequences) part self.frameLeft = Frame(self.guiRoot) self.frameLeft.grid(row=0, column=0, sticky=W + E + N + S) self.frameLeft.columnconfigure(0, weight=1) self.frameRight = Frame(self.guiRoot) self.frameRight.grid(row=0, column=1, sticky=W + E + N + S) self.frameRight.columnconfigure(0, weight=1) self.frameRight.rowconfigure(0, weight=1) self.frameRight.rowconfigure(1, weight=1) self.frameSpeciesControll = LabelFrame(self.frameLeft, text="Species", pady=10, padx=10) self.frameSpeciesControll.columnconfigure(1, weight=1) self.frameOptimizationControll = LabelFrame(self.frameLeft, text="Optimization", pady=10, padx=10) self.frameRestrictionControll = LabelFrame(self.frameLeft, text="Restriction Enzymes", pady=10, padx=10) self.frameSpeciesControll.grid(row=0, column=0, sticky=W + E, padx=10, pady=10) self.frameOptimizationControll.grid(row=1, column=0, sticky=W + E, padx=10, pady=10) self.frameRestrictionControll.grid(row=2, column=0, sticky=W + E, padx=10, pady=10) # Species Controll Label(self.frameSpeciesControll, text="Source:").grid(row=0, column=0) Label(self.frameSpeciesControll, text="Target:").grid(row=1, column=0) self.comboSourceSpecies = Combobox(self.frameSpeciesControll, state="readonly") self.comboSourceSpecies.grid(row=0, column=1, pady=5, sticky="ew") self.comboTargetSpecies = Combobox(self.frameSpeciesControll, state="readonly") self.comboTargetSpecies.grid(row=1, column=1, pady=5, sticky="we") self.buttonSpeciesList = Button(self.frameSpeciesControll, text="Edit Species List") self.buttonSpeciesList.grid(row=2, column=1, pady=5, sticky="e") self.comboSourceSpecies.bind("<<ComboboxSelected>>", self.actionOptimizerSettingsChanged) self.comboTargetSpecies.bind("<<ComboboxSelected>>", self.actionOptimizerSettingsChanged) # Optimization Controll Label(self.frameOptimizationControll, text="Optimization Strategy:").grid(row=0, column=0) self.comboOptimizationStrategy = Combobox(self.frameOptimizationControll, state="readonly") self.comboOptimizationStrategy.grid(row=0, column=1) self.comboOptimizationStrategy["values"] = self.optimizer.possibleOptimizationStrategies self.comboOptimizationStrategy.bind("<<ComboboxSelected>>", self.actionOptimizerSettingsChanged) # Restriction Enzymes self.listRestriction = Listbox(self.frameRestrictionControll) self.listRestriction.grid(row=0, column=0, columnspan=3, pady=5, sticky=W + E) self.frameRestrictionControll.columnconfigure(0, weight=1) self.buttonRestricionAdd = Button(self.frameRestrictionControll, text=" + ") self.buttonRestricionDel = Button(self.frameRestrictionControll, text=" - ") self.buttonRestricionAdd.grid(row=1, column=1, padx=5) self.buttonRestricionDel.grid(row=1, column=2, padx=5) # Source Sequence Frame self.frameSourceSequence = LabelFrame(self.frameRight, text="Source Sequence", padx=10, pady=10) self.frameResultSequence = LabelFrame(self.frameRight, text="Result Sequence", padx=10, pady=10) self.frameSourceSequence.grid(row=0, column=0, sticky="wens", padx=10, pady=10) self.frameResultSequence.grid(row=1, column=0, sticky="wens", padx=10, pady=10) self.buttonSourceLoad = Button(self.frameSourceSequence, text=" Load ") self.textSourceSeq = ScrolledText(self.frameSourceSequence, height=10) self.buttonSourceLoad.grid(row=0, column=1, sticky="e", pady=5) self.textSourceSeq.grid(row=1, column=0, columnspan=2, sticky="wens") self.frameSourceSequence.columnconfigure(0, weight=1) self.frameSourceSequence.rowconfigure(1, weight=1) self.textSourceSeq.frame.columnconfigure(1, weight=1) self.textSourceSeq.frame.rowconfigure(0, weight=1) self.buttonOptimize = Button(self.frameResultSequence, text=" OPTIMIZE! ") self.buttonOptimize.bind("<ButtonRelease>", self.actionOptimize) self.buttonRemoveRestriction = Button(self.frameResultSequence, text=" RESTRICTION-B-GONE! ") self.buttonRemoveRestriction.bind("<ButtonRelease>", self.actionRemoveRestricion) self.buttonSaveResult = Button(self.frameResultSequence, text=" Save ") self.textResultSequence = ScrolledText(self.frameResultSequence, height=10) self.buttonOptimize.grid(column=0, row=0, pady=5, sticky="w") self.buttonRemoveRestriction.grid(column=1, row=0, pady=5, padx=10, sticky="w") self.textResultSequence.grid(row=1, column=0, columnspan=4, sticky="wens") self.buttonSaveResult.grid(row=2, column=3, pady=5, sticky="e") self.frameResultSequence.columnconfigure(2, weight=1) self.frameResultSequence.rowconfigure(1, weight=1) self.textResultSequence.frame.columnconfigure(1, weight=1) self.textResultSequence.frame.rowconfigure(0, weight=1) self.textSourceSeq.bind("<<Modified>>", self.actionSequenceModified) self.textResultSequence.bind("<<Modified>>", self.actionSequenceModified) # generate color tags for textboxes for i in range(101): # green for normal codons (r, g, b) = colorsys.hsv_to_rgb(210 / 360, i / 100, 1.0) colorHex = "#%02x%02x%02x" % (int(r * 255), int(g * 255), int(b * 255)) self.textSourceSeq.tag_config("normal" + str(i), background=colorHex) self.textResultSequence.tag_config("normal" + str(i), background=colorHex) # red for codons with restriction sites (r, g, b) = colorsys.hsv_to_rgb(5 / 360, i / 100, 1.0) colorHex = "#%02x%02x%02x" % (int(r * 255), int(g * 255), int(b * 255)) self.textSourceSeq.tag_config("restrict" + str(i), background=colorHex) self.textResultSequence.tag_config("restrict" + str(i), background=colorHex) # Set (minimum + max) Window size self.guiRoot.update() self.guiRoot.minsize(self.guiRoot.winfo_width(), self.guiRoot.winfo_height()) self.buttonRestricionAdd.bind("<ButtonRelease>", self.reactToClick) self.buttonRestricionDel.bind("<ButtonRelease>", self.actionRestrictionEnzymeDelete) self.buttonSpeciesList.bind("<ButtonRelease>", self.actionEditSpeciesButton) self.buttonSourceLoad.bind("<ButtonRelease>", self.actionLoadSequence) self.buttonSaveResult.bind("<ButtonRelease>", self.actionSaveSequence) # TEST # self.listRestriction.insert("end", "EcoRI") # self.listRestriction.insert("end", "BamHI") # # dummy event to manually trigger update self.guiRoot.bind("<<Update>>", self.actionUpdate) self.actionUpdate(None) self.guiRoot.mainloop() def actionRestrictionEnzymeDelete(self, event): try: selectedEnzyme = self.listRestriction.selection_get() self.optimizer.restrictionEnzymeList.remove(selectedEnzyme) self.guiRoot.event_generate("<<Update>>") except tkinter.TclError: # no selection pass def actionUpdate(self, event): # print("update called") # clear list of restriction enzymes self.listRestriction.delete(0, "end") for r in self.optimizer.restrictionEnzymeList: self.listRestriction.insert("end", r) self.comboSourceSpecies.delete(0, "end") self.comboTargetSpecies.delete(0, "end") speciesValues = list() for (taxid, name) in self.optimizer.speciesList: speciesValues.append(taxid + ": " + name) self.comboSourceSpecies["values"] = speciesValues self.comboTargetSpecies["values"] = speciesValues if self.comboSourceSpecies.get() not in speciesValues: self.comboSourceSpecies.set("") if self.comboTargetSpecies.get() not in speciesValues: self.comboTargetSpecies.set("") self.textSourceSeq.edit_modified(True) self.textResultSequence.edit_modified(True) self.optimizer.saveConfig("config.ini") def actionEditSpeciesButton(self, event): speciesListDialog = SpeciesListDialog(self) def actionOptimizerSettingsChanged(self, event=None): # print("Something happened") strategy = self.comboOptimizationStrategy.get() sourceString = self.comboSourceSpecies.get() targetString = self.comboTargetSpecies.get() if not (strategy and sourceString and targetString): return sourceTaxid = sourceString.split(":")[0] targetTaxid = targetString.split(":")[0] self.optimizer.setOptimizer(sourceTaxid, targetTaxid, strategy) self.textSourceSeq.edit_modified(True) self.textResultSequence.edit_modified(True) # self.optimizer.testPrint() def actionOptimize(self, event=None): self.optimizer.runOptimization() self.textSourceSeq.edit_modified(True) self.textResultSequence.edit_modified(True) def actionRemoveRestricion(self, event=None): self.optimizer.runRestricionRemoval() self.textSourceSeq.edit_modified(True) self.textResultSequence.edit_modified(True) def actionSequenceModified(self, event=None): # necessary if, otherwise -> infinite loop if self.textSourceSeq.edit_modified(): seq = self.textSourceSeq.get("1.0", "end").strip() seq = stripCharsNotInList(seq.upper(), ["A", "C", "G", "T"]) self.optimizer.setSourceSeq(seq) oldInsert = self.textSourceSeq.index("insert") self.textSourceSeq.delete("1.0", "end") sourceCodons = self.optimizer.getCodonsForPrint(True) if not sourceCodons: self.textSourceSeq.insert("end", self.optimizer.sourceSequence) else: for (co, sc, r) in sourceCodons: if sc: if not r: self.textSourceSeq.insert("end", co, "normal" + str(int(sc * 100))) # print("normal"+str(int(sc*100))) else: self.textSourceSeq.insert("end", co, "restrict" + str(int(sc * 100))) else: # remainder without color self.textSourceSeq.insert("end", co) self.textSourceSeq.mark_set("insert", oldInsert) # reset the modified status at the very end self.textSourceSeq.edit_modified(False) if self.textResultSequence.edit_modified(): seq = self.textResultSequence.get("1.0", "end").strip() # self.optimizer.setOptimizedSeq(seq) oldInsert = self.textResultSequence.index("insert") self.textResultSequence.delete("1.0", "end") targetCodons = self.optimizer.getCodonsForPrint(False) if not targetCodons: self.textSourceSeq.insert("end", self.optimizer.optimizedSequence) else: for (co, sc, r) in targetCodons: if sc: if not r: self.textResultSequence.insert("end", co, "normal" + str(int(sc * 100))) # print("normal"+str(int(sc*100))) else: self.textResultSequence.insert("end", co, "restrict" + str(int(sc * 100))) else: # remainder without color self.textResultSequence.insert("end", co) self.textSourceSeq.mark_set("insert", oldInsert) self.textResultSequence.edit_modified(False) def actionLoadSequence(self, event=None): filename = tkinter.filedialog.askopenfilename() if filename: seq = sequenceIO.readFile(filename) self.textSourceSeq.delete("1.0", "end") self.textSourceSeq.insert("end", seq) self.textSourceSeq.edit_modified(True) def actionSaveSequence(self, event=None): filename = tkinter.filedialog.asksaveasfilename() if filename: # print("file is " + filename) with open(filename, mode="w") as fd: fd.write(self.optimizer.optimizedSequence)
def send(name): IP = '127.0.0.1' PORT = 9001 user = name listbox1 = '' # 用于显示在线用户的列表框 ii = 0 # 用于判断是开还是关闭列表框 users = [] # 在线用户列表 chat = '----------群聊----------' # 聊天对象, 默认为群聊 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((IP, PORT)) if user: s.send(user.encode()) # 发送用户名 else: s.send('no'.encode()) # 没有输入用户名则标记no # 如果没有用户名则将ip和端口号设置为用户名 addr = s.getsockname() # 获取客户端ip和端口号 addr = addr[0] + ':' + str(addr[1]) if user == '': user = addr ## 聊天窗口 # 创建图形界面 root = tkinter.Tk() root.title(user) # 窗口命名为用户名 root['height'] = 390 root['width'] = 580 root.resizable(0, 0) # 限制窗口大小 # 创建多行文本框 listbox = ScrolledText(root) listbox.place(x=5, y=0, width=570, height=320) # 文本框使用的字体颜色 listbox.tag_config('red', foreground='red') listbox.tag_config('blue', foreground='blue') listbox.tag_config('green', foreground='green') listbox.insert(tkinter.END, '欢迎进入聊天室!', 'blue') #emoticon # 四个按钮, 使用全局变量, 方便创建和销毁 b1 = '' b2 = '' b3 = '' b4 = '' p1 = ImageTk.PhotoImage(file = '捂脸.png') p2 = ImageTk.PhotoImage(file = '奸笑.png') p3 = ImageTk.PhotoImage(file = '皱眉.png') p4 = ImageTk.PhotoImage(file = '机智.png') # 用字典将标记与表情图片一一对应, 用于后面接收标记判断表情贴图 dic = {'aa**':p1, 'bb**':p2, 'cc**':p3, 'dd**':p4} ee = 0 # 判断表情面板开关的标志 # 发送表情图标记的函数, 在按钮点击事件中调用 def mark(exp): # 参数是发的表情图标记, 发送后将按钮销毁 global ee mes = exp + ':;' + user + ':;' + chat s.send(mes.encode()) b1.destroy() b2.destroy() b3.destroy() b4.destroy() ee = 0 # 四个对应的函数 def bb1(): mark('aa**') def bb2(): mark('bb**') def bb3(): mark('cc**') def bb4(): mark('dd**') def express(): nonlocal b1, b2, b3, b4, ee if ee == 0: ee = 1 b1 = tkinter.Button(root, command=bb1, image=p1, relief=tkinter.FLAT ,bd=0) b2 = tkinter.Button(root, command=bb2, image=p2, relief=tkinter.FLAT ,bd=0) b3 = tkinter.Button(root, command=bb3, image=p3, relief=tkinter.FLAT ,bd=0) b4 = tkinter.Button(root, command=bb4, image=p4, relief=tkinter.FLAT ,bd=0) b1.place(x=5, y=248) b2.place(x=75, y=248) b3.place(x=145, y=248) b4.place(x=215, y=248) else: ee = 0 b1.destroy() b2.destroy() b3.destroy() b4.destroy() # 创建表情按钮 eBut = tkinter.Button(root, text='表情', command=express) eBut.place(x=5, y=320, width=60, height=30) def picture(): pass # 创建发送图片按钮 pBut = tkinter.Button(root, text='图片', command=picture) pBut.place(x=65, y=320, width=60, height=30) def shot(): pass # 创建截屏按钮 sBut = tkinter.Button(root, text='截屏', command=shot) sBut.place(x=125, y=320, width=60, height=30) def file(): pass # 创建文件按钮 fBut = tkinter.Button(root, text='文件', command=file) fBut.place(x=185, y=320, width=60, height=30) # 创建多行文本框, 显示在线用户 listbox1 = tkinter.Listbox(root) listbox1.place(x=445, y=0, width=130, height=320) def users_online(): nonlocal listbox1, ii if ii == 1: listbox1.place(x=445, y=0, width=130, height=320) ii = 0 else: listbox1.place_forget() # 隐藏控件 ii = 1 # 查看在线用户按钮 button1 = tkinter.Button(root, text='在线用户', command=users_online) button1.place(x=505, y=320, width=70, height=30) # 创建输入文本框和关联变量 a = tkinter.StringVar() a.set('') entry = tkinter.Entry(root, width=120, textvariable=a) entry.place(x=5, y=348, width=570, height=40) def send(*args): # 没有添加的话发送信息时会提示没有聊天对象 users.append('----------群聊----------') if chat not in users: tkinter.messagebox.showerror('发送失败', message = '没有聊天对象!') return if chat == user: tkinter.messagebox.showerror('发送失败', message = '不能私聊自己!') return mes = entry.get() + ':;' + user + ':;' + chat # 添加聊天对象标记 s.send(mes.encode()) a.set('') # 发送后清空文本框 # 创建发送按钮 button = tkinter.Button(root, text='发送', command=send) button.place(x=515, y=353, width=60, height=30) root.bind('<Return>', send) # 绑定回车发送信息 def private(*args): nonlocal chat # 获取点击的索引然后得到内容(用户名) indexs = listbox1.curselection() index = indexs[0] chat = listbox1.get(index) # 修改客户端名称 if chat == '----------群聊----------': root.title(user) return ti = user + ' --> ' + chat root.title(ti) # 在显示用户列表框上设置绑定事件 listbox1.bind('<ButtonRelease-1>', private) # 用于时刻接收服务端发送的信息并打印, def recv(): nonlocal users while True: data = s.recv(1024) data = data.decode() # 没有捕获到异常则表示接收到的是在线用户列表 try: data = json.loads(data) users = data listbox1.delete(0, tkinter.END) # 清空列表框 number = (' 在线人数: ' + str(len(data)) + ' 人') listbox1.insert(tkinter.END, number) listbox1.itemconfig(tkinter.END,fg='green', bg="#f0f0ff") listbox1.insert(tkinter.END, '----------群聊----------') listbox1.itemconfig(tkinter.END,fg='green') for i in range(len(data)): listbox1.insert(tkinter.END, (data[i])) listbox1.itemconfig(tkinter.END,fg='green') except: data = data.split(':;') data1 = data[0].strip() # 消息 data2 = data[1] # 发送信息的用户名 data3 = data[2] # 聊天对象 #data [' liyuan:bb**', 'liyuan', '----------群聊----------'] # 发消息的人 和消息 发送者 接收者 markk = data1.split(':')[1] print(data) print(markk) # 判断是不是表情 # 如果字典里有则贴图 if markk in dic: print("do something") data4 = '\n' + data2 + ':' # 例:名字-> \n名字: if data3 == '----------群聊----------': if data2 == '\n' + user: # 如果是自己则将则字体变为蓝色 listbox.insert(tkinter.END, data4, 'blue') listbox.image_create(tkinter.END, image=dic[markk]) else: listbox.insert(tkinter.END, data4, 'green') # END将信息加在最后一行 listbox.image_create(tkinter.END, image=dic[markk]) elif data2 == user or data3 == user: # 显示私聊 listbox.insert(tkinter.END, data4, 'red') # END将信息加在最后一行 listbox.image_create(tkinter.END, image=dic[markk]) else: data1 = '\n' + data1 if data3 == '----------群聊----------': if data2 == '\n' + user: # 如果是自己则将则字体变为蓝色 listbox.insert(tkinter.END, data1, 'blue') else: listbox.insert(tkinter.END, data1, 'green') # END将信息加在最后一行 elif data2 == user or data3 == user: # 显示私聊 listbox.insert(tkinter.END, data1, 'red') # END将信息加在最后一行 listbox.see(tkinter.END) # 显示在最后 r = threading.Thread(target=recv) r.start() # 开始线程接收信息 root.mainloop() s.send(b'quit') s.close() # 关闭图形界面后关闭TCP连接
class App(Frame): def __init__(self, parent): Frame.__init__(self, parent) self.parent = parent self.initUI() self.bmm = BMMSegment(4) self.mp = MaxProbabilitySegment() self.tagger = HMM_Viterbi_POS_TAGGER() self.parser = TopDownParser() self.cykParser = CYKParser() def initUI(self): self.parent.title("双向最大匹配分词") self.pack(fill=BOTH, expand=1) self.columnconfigure(0, weight=3) self.columnconfigure(1, weight=3) self.columnconfigure(2, pad=7) self.rowconfigure(1, weight=3) self.rowconfigure(5, weight=3) self.menubar = Menu(self.parent) self.fileMenu = Menu(self.menubar, tearoff=0) self.fileMenu.add_command(label="读入规则文件", command=self.onLoadRules_CYK) self.fileMenu.add_separator() self.fileMenu.add_command(label="退出", command=self.parent.quit) self.menubar.add_cascade(label="文件", menu=self.fileMenu) self.parent.config(menu=self.menubar) self.label1 = Label(self, text="请输入PCFG语法规则或加载规则文件(如:S -> NP VP 0.1)") self.label1.grid(sticky=W, pady=4, padx=5) self.inputText = ScrolledText(self) self.inputText.grid(row=1, column=0, columnspan=2, rowspan=3, padx=5, sticky=E+W+N) self.inputText.tag_config('highlight', background='yellow') self.label2 = Label(self, text='请输入文本:') self.label2.grid(row=4, column=0, sticky=W, pady=4, padx=5) self.outputText = ScrolledText(self) self.outputText.grid(row=5, column=0, columnspan=2, rowspan=3, padx=5, sticky=E+S+W) self.rightFrame = Frame(self) self.rightFrame.grid(row=1, column=3, rowspan=7) self.bmmBtn = Button(self.rightFrame, text="双向最大匹配", command=self.onBMM) self.bmmBtn.pack(side="top", expand=True, pady=8) self.mpBtn = Button(self.rightFrame, text="最大概率分词", command=self.onMP) self.mpBtn.pack(side="top", expand=True, pady=8) self.hmmBtn = Button(self.rightFrame, text='HMM词性标注', command=self.onHMM) self.hmmBtn.pack(side="top", expand=True, pady=8) self.parseBtn = Button(self.rightFrame, text='语法分析', command=self.onTopdownParse) self.parseBtn.pack(side="top", expand=True, pady=8) self.cykBtn = Button(self.rightFrame, text='PCFG语法分析', command=self.onCYK) self.cykBtn.pack(side="top", expand=True, pady=8) self.reBtn = Button(self.rightFrame, text='RegEx提取信息', command=self.onRE) self.reBtn.pack(side="top", expand=True, pady=8) # HINT: Place additional button here self.quitBtn = Button(self.rightFrame, text="退出", command=self.onQuit) self.quitBtn.pack(side="top", expand=True, pady=8) def onQuit(self): self.quit() ############################## BMM Segmentation ######################################### def onBMM(self): self.outputText.delete('1.0', END) inStr = self.inputText.get('1.0', END).strip() start = time.clock() result = self.bmm.BMM(inStr, self.inputText) self.outputText.insert(INSERT, result) elapsed = time.clock() - start if result != '': self.label2['text'] = '分词结果 耗时: ' + '{0:.1f} ms'.format(elapsed*1000) ######################### Maximum Probability Segmentation ############################### def onMP(self): self.outputText.delete('1.0', END) inStr = self.inputText.get('1.0', END).strip() start = time.clock() result = self.mp.MaxProbability(inStr) self.outputText.insert(INSERT, result) elapsed = time.clock() - start if result != '': self.label2['text'] = '分词结果 耗时: ' + '{0:.1f} ms'.format(elapsed*1000) ############################## HMM Pos-tagging ########################################## def onHMM(self): self.outputText.delete('1.0', END) inStr = self.inputText.get('1.0', END).strip() if inStr == '': return start = time.clock() segmented = self.mp.MaxProbability(inStr) obs = [w.strip('/') for w in segmented.split()] result = self.tagger.Viterbi(obs) elapsed = time.clock() - start self.outputText.insert(INSERT, result) if result != '': self.label2['text'] = '词性标注结果 耗时: ' + '{0:.1f} ms'.format(elapsed*1000) ############################## Top-down parsing ######################################### def onTopdownParse(self): inStr = self.outputText.get('1.0', END).strip() if inStr == '': sentence = ['the', 'old', 'man', 'cried'] self.outputText.insert(INSERT, ' '.join(sentence)) else: sentence = inStr.strip().split() start = time.clock() succeed = self.parser.parse(sentence) elapsed = time.clock() - start if succeed: self.label2['text'] = '语法分析完成 结果:成功 耗时:' + '{0:.1f} ms'.format(elapsed*1000) newWindow = Toplevel(self) newWindow.title('自顶向下语法分析') self.textbox = Entry(newWindow) self.textbox.pack(fill=X, expand=1) self.tree = Treeview(newWindow) self.tree.heading('#0', text='语法树', anchor='w') self.tree.pack(fill=BOTH, expand=1) parseString = self.parser.printParseTree() self.textbox.insert(INSERT, parseString) self.buildParseTree_TopDown('', 'S', self.parser.rules, self.parser.choices) else: self.label2['text'] = '语法分析完成 结果:失败 耗时:' + '{0:.1f} ms'.format(elapsed*1000) def onLoadRules_TopDown(self): fname = askopenfilename(initialdir='./data', initialfile='rules.txt') if fname != '': self.inputText.delete('1.0', END) with open(fname) as f: self.inputText.insert(INSERT, f.read()) self.parser.loadRules(fname) def buildParseTree_TopDown(self, parent, symbol, rules, choices): if choices[symbol] == -1: newNode = self.tree.insert(parent, 'end', text=symbol, open=True) self.tree.insert(newNode, 'end', text=' | '.join(rules[symbol][0])) else: c = choices[symbol] newParent = self.tree.insert(parent, 'end', text=symbol, open=True) for symbl in rules[symbol][c]: self.buildParseTree_TopDown(newParent, symbl, rules, choices) ############################## CYK-PCFG parsing ######################################### def onLoadRules_CYK(self): fname = askopenfilename(initialdir='./data', initialfile='rules_pcfg.txt') if fname != '': self.inputText.delete('1.0', END) with open(fname) as f: self.inputText.insert(INSERT, f.read()) self.parser.loadRules(fname) def buildParseTree_CYK(self, parent, beg, end, symbol_id): backPt = self.cykParser.BP[beg][end][symbol_id] symbol = self.cykParser.id2symb[symbol_id] if backPt.s == -1: newNode = self.tree.insert(parent, 'end', text=symbol, open=True) self.tree.insert(newNode, 'end', text=self.cykParser.words[beg-1], open=True) else: newParent = self.tree.insert(parent, 'end', text=symbol, open=True) self.buildParseTree_CYK(newParent, beg, backPt.s, backPt.Y) self.buildParseTree_CYK(newParent, backPt.s+1, end, backPt.Z) def onCYK(self): inStr = self.outputText.get('1.0', END).strip() if inStr == '': sentence = 'fish people fish tanks' self.outputText.insert(INSERT, sentence) else: sentence = inStr start = time.clock() parseString, prob = self.cykParser.parse(sentence) elapsed = time.clock() - start self.label2['text'] = 'PCFG语法分析完成 结果:成功 耗时:' + '{0:.1f} ms'.format(elapsed*1000) newWindow = Toplevel(self) newWindow.title('PCFG语法分析') self.textbox = Entry(newWindow) self.textbox.pack(fill=X, expand=1) self.tree = Treeview(newWindow) self.tree.heading('#0', text='语法树 (概率:{0:.8f})'.format(prob), anchor='w') self.tree.pack(fill=BOTH, expand=1) self.textbox.insert(INSERT, parseString) self.buildParseTree_CYK('', 1, len(self.cykParser.words), self.cykParser.symb2id['S']) def onRE(self): window = Toplevel(self) window.title('正则表达式信息提取') label = Label(window) label.pack() result = ScrolledText(window) result.pack(fill=BOTH, expand=1) htmlFile = 'data/凤凰网.html' start = time.clock() titles = regex.fetchTitles(htmlFile) links = regex.fetchLinks(htmlFile) elapsed = time.clock() - start label['text'] = '耗时: {0:.1f} ms'.format(elapsed*1000) result.insert(INSERT, 'Titles:\n') result.insert(INSERT, '\n'.join(titles)) result.insert(INSERT, '\n\nLinks:\n') result.insert(INSERT, '\n'.join(links))
class ChatGUI(Frame): def __init__(self, parent, conn): #Frame.__init__(self, parent, background="grey") self.parent = parent self.conn = conn self.centerWindow() self.initUI() def initUI(self): self.lineCounter = 0 # create a custom font self.customFontHeader = font.Font(family="Calibri", slant = "italic") #family="Helvetica", weight="bold", slant="italic") self.customFontMessage = font.Font(family="Calibri") self.parent.title("Python Chat") frame = Frame(self.parent) frame.pack(fill=BOTH, expand=1, side=LEFT) self.box = ScrolledText(frame, wrap=WORD, relief = GROOVE, width=30, height=18, font=self.customFontMessage) self.box.insert(END, 'Welcome to Python Chat!') self.box.config(state=DISABLED) self.box.pack(expand="yes", fill=BOTH, side=TOP) self.textarea = Text(frame, width=30, height=5) #self.textarea.insert(END, "") self.textarea.bind("<KeyRelease-Return>", self.gettext) #Se metto on press, rimane una newline in piu self.textarea.pack(expand="yes", fill=BOTH, side=TOP) okButton = Button(frame, text="Panic Button", activebackground="red", command=self.sendFile) okButton.pack(expand="no", fill=BOTH, side=TOP) self.usersFrame = Frame(self.parent) self.usersFrame.pack(fill=BOTH, expand=1, side=RIGHT) self.userListbox = Listbox(self.usersFrame, width=3) self.userListbox.pack(fill=BOTH, expand=1) self.updateUsersFrame() def centerWindow(self): w = 600 h = 475 sw = self.parent.winfo_screenwidth() sh = self.parent.winfo_screenheight() x = (sw - w)/2 y = (sh - h)/2 self.parent.geometry('%dx%d+%d+%d' % (w, h, x, y)) def gettext(self, e): #e sta per event, questo e' un listener text = self.textarea.get("1.0", END) # 1.0: row:columa - END-2c rimuove l'ultimo carattere, una newline \r\n if "\n" in text: text = text.replace("\n", "") self.textarea.delete("0.0", END) #NON VA: il problema e' che viene inviato il carattere di newline ma non incluso nell'area a causa della bind mi sa. Devo escluderlo io self.sendToServer(text) def printConversation(self, message): self.box.config(state=NORMAL) self.box.insert(END,"\n" + message) self.lineCounter = self.lineCounter + 2 #m = re.match("\[.*\] From .*\n", self.box.get("0.0", END)) m = re.search("\[.*\].*:", message, re.MULTILINE) if m is not None: #print("MATCH") #print(m.group(0)) #print(str(m.start(0)) + "_" + str(m.end(0))) #print("COUNTER") #print(str(self.lineCounter) + "." + str(m.start(0)+1) + "___" + str(self.lineCounter) + "." + str(m.end(0))) self.box.tag_add("header", str(self.lineCounter) + "." + str(m.start(0)), str(self.lineCounter) + "." + str(m.end(0))) self.box.tag_config("header", font=self.customFontHeader, foreground = "blue") self.box.config(state=DISABLED) #self.box.yview_scroll(10000,"units") self.box.see(END) def sendToServer(self, messageToSend): self.conn.send(messageToSend.encode(encoding='utf_8', errors='strict')) def sendFile(self): #aprire una dialog di quelle predefinite (Sfoglia...) #capire come fare la send di un file sul socket... pass def updateUsersFrame(self): global connectedClients self.userListbox.delete(0, END) self.userListbox.insert(END, "Connected users") for item in connectedClients: self.userListbox.insert(END, item)
class NamedWindow(object): """ This creates a window for the Tkui which you can then write to programmatically. This allows modules to spin off new named windows and write to them. """ def __init__(self, windowname, master, partk): """ Initializes the window @param windowname: the name of the new window @type windowname: string @param master: the main tk window @type master: toplevel """ self._parent = master self._tk = Toplevel(partk) self._windowname = windowname # map of session -> (bold, foreground, background) self._currcolors = {} # ses -> string self._unfinishedcolor = {} self._do_i_echo = 1 self._tk.geometry("500x300") self._tk.title("Lyntin -- " + self._windowname) self._tk.protocol("WM_DELETE_WINDOW", self.close) if os.name == "posix": fontname = "Courier" else: fontname = "Fixedsys" fnt = tkinter.font.Font(family=fontname, size=12) self._txt = ScrolledText(self._tk, fg="white", bg="black", font=fnt, height=20) self._txt.pack(side=TOP, fill=BOTH, expand=1) # handles improper keypresses self._txt.bind("<KeyPress>", self._ignoreThis) # initialize color tags self._initColorTags() def convertColor(self, name): """ Tk has this really weird color palatte. So I switched to using color names in most cases and rgb values in cases where I couldn't find a good color name. This method allows me to specify either an rgb or a color name and it converts the color names to rgb. @param name: either an rgb value or a name @type name: string @returns: the rgb color value @rtype: string """ if name[0] == "#": return name rgb = self._tk._getints( self._tk.tk.call('winfo', 'rgb', self._txt, name)) rgb = "#%02x%02x%02x" % (old_div(rgb[0], 256), old_div( rgb[1], 256), old_div(rgb[2], 256)) print(name, "converted to: ", rgb) return rgb def _initColorTags(self): """ Sets up Tk tags for the text widget (fg/bg).""" for ck in list(fg_color_codes.keys()): color = self.convertColor(fg_color_codes[ck]) self._txt.tag_config(ck, foreground=color) for ck in list(bg_color_codes.keys()): self._txt.tag_config(ck, background=bg_color_codes[ck]) self._txt.tag_config("u", underline=1) def _ignoreThis(self, tkevent): """ This catches keypresses to this window. """ return "break" def close(self): """ Closes and destroys references to this window. """ self._parent.removeWindow(self._windowname) self._tk.destroy() def _yadjust(self): """Handles y scrolling after text insertion.""" self._txt.yview('moveto', '1') # if os.name != 'posix': self._txt.yview('scroll', '20', 'units') def _clipText(self): """ Scrolls the text buffer up so that the new text written at the bottom of the text buffer can be seen. """ temp = self._txt.index("end") ind = temp.find(".") temp = temp[:ind] if (temp.isdigit() and int(temp) > 800): self._txt.delete("1.0", "100.end") def write(self, msg): """ This writes text to the text buffer for viewing by the user. This is overridden from the 'base.BaseUI'. """ if type(msg) == tuple: msg = msg[0] if type(msg) == bytes: msg = message.Message(msg, message.LTDATA) line = msg.data ses = msg.session if line == '': return color, leftover = buffer_write(msg, self._txt, self._currcolors, self._unfinishedcolor) if msg.type == message.MUDDATA: self._unfinishedcolor[ses] = leftover self._currcolors[ses] = color self._clipText() self._yadjust()