在 kivy 框架中为套接字创建不同线程的问题

problem in creating a different thread for socket in kivy framework

我正在使用 kivy 框架和 socket.in 回调函数此代码 conn, addr=s.accept() 对 kivy 造成问题并停止其 work.that 的意思是当我点击 start server 按钮 kivy gui 不是 responding.I 试图创建一个线程,我使用了:Thread(target=s.listen()).start() 但是这个线程的工作与 kivy 不同吗? 我应该怎么做才能使 kivy 响应套接字?


代码:

import kivy
from threading import Thread
import socket
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
from kivy.uix.gridlayout import GridLayout
from kivy.clock import Clock



    
s=socket.socket()
s.bind(('localhost',1234))
Thread(target=s.listen()).start()
print('listen')


class me (App):
    def __init__(self):
        super().__init__()
        
        self.b=Button(text='start server',on_press=self.callback)
        self.g=GridLayout(cols=4)
        self.l=Label(text='listening...')
        self.t=TextInput(hint_text='Type here your message: ' )
        self.g.add_widget(self.b)
        self.g.add_widget(self.t)
        self.g.add_widget(self.l) 
    def build(self):
            return self.g
        
    def callback(self,click):
        conn, addr=s.accept()



m=me()


m.run()

试试这个:

from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
from kivy.uix.gridlayout import GridLayout
from kivy.app import App



import socket
from threading import Thread


class Me(App):
    def __init__(self):
        super().__init__()

        self.b = Button(text='start server', on_press=self.callback)
        self.g = GridLayout(cols=4)
        self.l = Label(text='listening...')
        self.t = TextInput(hint_text='Type here your message: ')
        self.g.add_widget(self.b)
        self.g.add_widget(self.t)
        self.g.add_widget(self.l)

    def build(self):
        return self.g


    def stream(self):
        while True:
            conn, addr = self.sock.accept()
            print(addr)
            conn.send(self.t.text.encode())
            print(f"{self.t.text} sended!")
            conn.close()

    def callback(self, click):
        self.sock = socket.socket()
        self.sock.bind(('localhost', 1234))
        self.sock.listen(1000)
        Thread(target=self.stream).start()
        print("server started")


m = Me()
m.run()