コード例 #1
0
    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)
コード例 #2
0
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')
コード例 #3
0
    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
コード例 #4
0
ファイル: bfmain.py プロジェクト: wfzirk/Sun-Font-Utility
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()
コード例 #5
0
    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)
コード例 #6
0
ファイル: console_ui.py プロジェクト: TobyBoyne/py-toolkit
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')
コード例 #7
0
    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)
コード例 #8
0
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)
コード例 #10
0
    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()
コード例 #11
0
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)
コード例 #12
0
    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
コード例 #13
0
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))
コード例 #14
0
ファイル: Visual.py プロジェクト: abhishekreddy/Jarvis
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)
コード例 #15
0
    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)
コード例 #16
0
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)
コード例 #17
0
    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)
コード例 #18
0
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
コード例 #19
0
ファイル: widgets.py プロジェクト: goofy0530/modlunky2
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
コード例 #20
0
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)
コード例 #21
0
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)
コード例 #22
0
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)
コード例 #23
0
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)
コード例 #24
0
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 = ''
コード例 #25
0
ファイル: ChatClient.py プロジェクト: zhliuworks/ChatRoom
# 创建多行文本框
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,
コード例 #26
0
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()
コード例 #27
0
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())
コード例 #28
0
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 连接
コード例 #29
0
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)       
コード例 #30
0
ファイル: onmyoji_win.py プロジェクト: AlanRuijia/onmyoji
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)
コード例 #31
0
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)
コード例 #32
0
ファイル: client_send2.py プロジェクト: zzzwwwwjjj/zzz
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连接
コード例 #33
0
ファイル: main_gui.py プロジェクト: achieverForever/NLP
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))
コード例 #34
0
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)
コード例 #35
0
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()