【问题标题】:Trouble starting Python Threading loop无法启动 Python 线程循环
【发布时间】:2013-03-29 21:42:41
【问题描述】:

我正在尝试在 python 中创建一个简单的“聊天”客户端。我有基础知识和一切,但我根本无法让我的线程工作。这仍然是一项正在进行的工作,因此并非所有代码都在那里,我知道,但如果您确实有任何建议作为一个整体,将不胜感激。

from Tkinter import *
import time
import socket
import thread
import threading

HOST = 'localhost'
PORT = 5454
fromserver = ''
data = ''



#Declares socket information
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

s.bind((HOST,PORT))


#Loop for receiving
def receivingloop():
    global fromserver
    while 1:
        fromserver = s.recv(30)
        time.sleep(.5)


class ChatClient:
    def __init__(self, master):

        #Use Global fromserver
        global fromserver
        global data
        #Create both frames        
        top_frame = Frame(master)
        bot_frame = Frame(master)
        #Create and pack the Buttons
        self.send_but = Button(bot_frame, \
                               text='Send',\
                               command=self.sending)
        self.quit_but = Button(bot_frame, \
                               text='Quit', \
                               command=client_window.destroy)        
        self.send_but.pack(side=LEFT)
        self.quit_but.pack(side=LEFT)




       #Create and pack label 
        self.received_lab = Label(top_frame,\
                                  text=(fromserver))        

        self.received_lab.pack()

        self.sent_lab = Label(top_frame,\
                              text='Message Sent: ' +data)

        self.sent_lab.pack()

        self.sending_entry = Entry(top_frame, \
                                   width=10)


        self.sending_entry.pack()

        #Pack Frames
        top_frame.pack()
        bot_frame.pack()


    #Function to send stuff          
    def sending(self):
        global data
        s.sendto(data,(HOST,PORT))
        data = str(self.sending_entry.get())
        print data


#Start the thread    
l1 = threading.Thread(target=receivingloop)
l1.start()


client_window = Tk()
chat_client = ChatClient(client_window)        
client_window.mainloop()

【问题讨论】:

  • 你得到什么错误?

标签: python multithreading loops tkinter chat


【解决方案1】:

如果我没记错的话,我会说接收循环方法采用 self 元素,但 self 参数只需要类,并且此方法不在类中

试试这个:

#Loop for receiving
def receivingloop():
    global fromserver
    while 1:
        fromserver = s.recv(30)
        time.sleep(.5)

【讨论】:

  • 另外,建议使用队列将数据传递给 Tkinter 的 GUI 线程:effbot.org/zone/tkinter-threads.htm
  • 它现在可以正常运行但不会更新标签。我知道服务器工作正常,因为我的其他 CLI 接收到消息并可以打印它。
【解决方案2】:

你的函数是用一个名为“self”的变量定义的,看起来你以前在一个类中拥有这个函数,但后来决定从类中提取它。

无论如何,要解决您的问题,它应该是:

def接收循环():

请注意,函数参数中的“self”部分已被删除。

另外,您可能希望将global data 添加到您的发送函数中。

【讨论】:

  • 我删除了 self 参数并添加了全局数据。我现在可以发送字符串,但我仍然无法接收它们。编辑代码以反映这一点。
  • 我不认为有一个功能可以在您发送数据后更新您的标签。另外,我猜(我对 Tkinter 不太了解)您的标签不是动态的,这意味着一旦它被初始化,如果你改变变量的内容,标签将不会被更新为它的最新内容。你必须自己做。您可能希望在向标签发送一些数据后更新标签的文本。要么创建一个更新信号,要么在你的 GUI 上调用一个函数。您可以使用时钟定期更新标签以将标签更改为最后收到的一条数据。
猜你喜欢
  • 1970-01-01
  • 2021-01-13
  • 2016-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-30
  • 1970-01-01
相关资源
最近更新 更多