Python 3 Tkinter一次运行多个函数

时间:2016-05-19 18:16:12

标签: user-interface python-3.x tkinter

我有一个聊天窗口,用于聊天应用程序的客户端部分,该窗口使用Tkinter进行GUI:

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()函数同时运行,以便GUI在客户端仍然从服务器接收消息时继续更新。我也尝试过使用threading模块,但我需要在下面创建其他函数的线程,但需要在__init__()下面定义其他函数。我该怎么办?

1 个答案:

答案 0 :(得分:0)

您可以使用after方法将函数附加到Tk事件循环,正如我在this question中所述。基本上after的语法是这样的:

after(ms, command = [function object])

它的作用是将作为command参数传入的函数对象附加到Tk事件循环,每次ms毫秒都会重复它。

这里有一点需要注意:您希望从函数中移除while True,因为after无论如何都会不断重复它们。