2016-05-19 2 views
0

У меня есть окно чата для клиента части приложения чата, который использует Tkinter для графического интерфейса:Python 3 Tkinter несколько функций, работающих одновременно

import socket 
import select 
import time 
from threading import Thread 
from multiprocessing import Process 
import sys 
from tkinter import * 

HOST = "localhost" 
PORT = 5678 

client_socket = socket.socket() 
client_socket.settimeout(2) 

try: 
    client_socket.connect((HOST, PORT)) 
except: 
    print("Connection failed.") 
    sys.exit() 
print("Connected to [" + str(HOST) + "," + str(PORT) + "] successfully") 


class ChatWindow: 
    def __init__(self): 
     form = Tk() 
     form.minsize(200, 200) 
     form.resizable(0, 0) 
     form.title("Chat") 

     box = Entry(form) 

     form.bind("<Return>", lambda x: self.sendmessage(self.textbox.get())) 

     area = Text(form, width=20, height=10) 

     area.config(state=DISABLED) 

     area.grid(row=0, column=1, padx=5, pady=5, sticky=W) 
     box.grid(row=1, column=1, padx=5, pady=5, sticky=W) 

     self.textbox = box 
     self.textarea = area 

     p1 = Process(target=updating) 
     p1.start() 
     p2 = Process(target=tryrecvmessage) 
     p2.start() 

    def addchat(self, msg, clear=False): 
     self.textarea.config(state=NORMAL) 
     self.textarea.insert(END, msg + "\n") 
     if clear: 
      # Option to clear text in box on adding 
      self.textbox.delete(0, END) 
     self.textarea.see(END) 
     self.textarea.config(state=DISABLED) 

    def sendmessage(self, msg): 
     data = str.encode(msg) 
     client_socket.send(data) 
     self.addchat("<You> " + msg, True) 

    def updating(self): 
     while True: 
      form.update() 
      form.update_idletasks() 
      time.sleep(0.01) 

    def tryrecvmessage(self): 
     while True: 
      read_sockets, write_sockets, error_sockets = select.select([client_socket], [], []) 
      for sock in read_sockets: 
       data = sock.recv(4096) 
       if data: 
        self.addchat(data) 
       else: 
        self.addchat("Disconnected...") 
        sys.exit() 

if __name__ == "__main__": 
    window = ChatWindow() 

Я хочу функцию updating() и функций tryrecvmessage() запускать одновременно , так что графический интерфейс продолжает обновляться, пока клиент все еще получает сообщения с сервера. Я также пробовал использовать модуль threading, но мне нужно, чтобы потоки были созданы ниже, где определены другие функции, но другие функции должны быть определены ниже __init__(). Что я делаю?

+0

Что происходит вместо этого? –

ответ

0

Вы можете присоединить функции к циклу событий Tk, используя метод after, как я объяснил в this question. По существу синтаксис after выглядит следующим образом:

after(ms, command = [function object]) 

Что она делает это прикрепить объект функции передается в качестве аргумента command к петле Tk событий, повторяя это каждый раз, когда ms миллисекунд прошли.

Одно предостережение здесь: вы хотели бы удалить while True от функций, так как after будет постоянно их повторять.

+0

Он не может сделать это на 'tryrecvmessage', потому что получение данных с сервера сокетов может занять много времени, что остановит его основное окно. –

+0

Вот что я понял. Что вы порекомендуете? – Theo

Смежные вопросы