带套接字的kivyTextInput

2024-09-28 17:29:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试创建一个Python服务器(使用python3)从客户机(用Kivy开发)接收信息。我试图使用套接字,但出现错误: “文本输入'不支持缓冲区接口” 如果您能告诉我我的错误在哪里,我将不胜感激:)

我的委托人:

from kivy.app import App
#kivy.require("1.8.0")
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.textinput import TextInput
import socket


class LoginScreen(GridLayout):
    def __init__(self,**kwargs):
        super(LoginScreen, self).__init__(**kwargs)
        self.cols=2
        my_socket = socket.socket()
        host=socket.gethostname()
        my_socket.connect((host,80))

        self.add_widget(Label(text='username'))
        self.username = TextInput(multiline=False)
        self.add_widget(self.username)
        my_socket.send(self.username)
        my_socket.close()

        self.add_widget(Label(text='Password'))
        self.password = TextInput(multiline=False,password=True)
        self.add_widget(self.password)


class SimpleKivy(App):
    def build(self):
        return LoginScreen()


if __name__=='__main__':
    SimpleKivy().run()

我的服务器:

^{pr2}$

感谢您的帮助:)


Tags: fromimportself服务器addmyusernamepassword
2条回答

我的客户代码:

from kivy.app import App
# kivy.require("1.8.0")
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
import socket


class LoginScreen(GridLayout):
    def __init__(self, **kwargs):
        super(LoginScreen, self).__init__(**kwargs)
        self.cols = 3
        self.my_socket = socket.socket()
        #host = socket.gethostname()
        #port = 8585
        self.my_socket.connect(('127.0.0.1', 8080))

        self.add_widget(Label(text='username'))
        self.username = TextInput(multiline=False)
        self.add_widget(self.username)

        self.add_widget(Label(text='Password'))
        self.password = TextInput(multiline=False, password=True)
        self.add_widget(self.password)

        self.submit_button = Button(text='Submit')
        self.submit_button.bind(on_press=self.submit_username)
        self.add_widget(self.submit_button)

    def submit_username(self, *args):
        # Make sure to validate the input before submitting to the server
        self.my_socket.send(self.username.text.encode('utf-8'))


class SimpleKivy(App):
    def build(self):
        return LoginScreen()

这是我的服务器代码:

^{pr2}$

也许我需要写:self.my_插座.close()在客户端代码中?在

针对缓冲区的问题,需要将bytes()发送到套接字。它不接受字符串。 我认为使用套接字是如此低的水平,不是这里的最佳实践。尝试开发一个restapi,它接受来自客户端的请求并为您执行db操作。CherryPy非常小,对于这样一个简单的开始是很好的。回到客户端代码,尝试创建一个Button,并将其绑定到一个方法,该方法将用户名发送到服务器。在当前代码中,您正在将kivy.uix.textinput.TextInput对象发送到服务器,而您需要使用对象的text属性发送它的文本。我建议做如下修改

from kivy.app import App
# kivy.require("1.8.0")
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
import socket


class LoginScreen(GridLayout):
    def __init__(self, **kwargs):
        super(LoginScreen, self).__init__(**kwargs)
        self.cols = 3
        self.my_socket = socket.socket()
        host = socket.gethostname()
        port = 8585
        self.my_socket.connect((host, port))

        self.add_widget(Label(text='username'))
        self.username = TextInput(multiline=False)
        self.add_widget(self.username)

        self.add_widget(Label(text='Password'))
        self.password = TextInput(multiline=False, password=True)
        self.add_widget(self.password)

        self.submit_button = Button(text='Submit')
        self.submit_button.bind(on_press=self.submit_username)
        self.add_widget(self.submit_button)

    def submit_username(self, *args):
        # Make sure to validate the input before submitting to the server
        self.my_socket.send(bytes(self.username.text))


class SimpleKivy(App):
    def build(self):
        return LoginScreen()


if __name__ == '__main__':
    SimpleKivy().run()

相关问题 更多 >