Я пробую (и пытаюсь понять) сокеты в python.
Я написал следующий код, пытаясь сделать простой чат для изучения сокетов. Оказывается, я сильно врезаюсь в эту стену: я могу получить сообщение и распечатать его на консоли, но, хотя функция была вызвана, MDList не обновляется (это делают только локально отправленные сообщения). С помощью кода это может быть легче понять:
import json
import pickle
from kivymd.app import MDApp
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang.builder import Builder
from kivymd.uix.label import MDLabel
from kivymd.uix.list import OneLineListItem
import pickle
class Main(Screen):
def definir_usuario(self):
global user
user = self.ids.user.text
return user
class Chat(Screen):
def receber_mensagem(self, men):
print(type(men))
msg_format = str(men)
self.mostrar_mensagem(msg_format)
return
def enviar_mensagem(self, mensagem):
while True:
from client import enviar
usrmsg = {'Usuario':user, 'Mensagem':mensagem}
quem = usrmsg['Usuario']
msg = usrmsg['Mensagem']
msg_format = str(f"{quem}: {msg}")
enviar(usrmsg)
self.mostrar_mensagem(msg_format)
break
def mostrar_mensagem(self, mensagem):
print(f"print dentro do mostrar_mensagem {mensagem}")
self.ids.chatview.add_widget(OneLineListItem(text=f"{mensagem}"))
self.ids.mensagem.text = ""
class Commapp(MDApp):
def build(self):
KV = Builder.load_file("commapgui.kv")
return KV
if __name__ == "__main__":
Commapp().run()
вызываемая функция - "mostrar_mensagem" (извините, она была написана только для моего самообучения, поэтому имена функций на португальском языке).
Он печатает сообщение, но эти строки
self.ids.chatview.add_widget(OneLineListItem(text=f"{mensagem}"))
self.ids.mensagem.text = ""
, похоже, ничего не делают, когда функция запускается из данных, полученных из сокета.
Что касается ошибок, Единственное, что необычно, это:
[WARNING] <kivy.uix.gridlayout.GridLayout object at 0x11409c590> have no cols or rows set, layout is not triggered.
Не уверен, что это может быть необходимо, но мой код kivyMD ниже:
ScreenManager:
Main:
name: "Main"
Chat:
name: "Chat"
: AnchorLayout: BoxLayout: size_hint_x: 0.5 pos_hint_x: 0.5 padding : 60 интервал: 30 ориентация: «вертикаль» BoxLayout: ориентация: «вертикаль» MDLabel: текст: «Bem vindo! \ NEscolha um nome de usuário:» MDTextField: id: user hint_text: «Digite o nome escolhido» текст: 'Di go 'AnchorLayout: BoxLayout: size_hint_x: 0,5 pos_hint_y: 0,5 интервал: 50 MDFillRoundFlatButton: text:' OK 'on_press: root .definir_usuario () on_release: root .manager.current = "Chat" MDRoundFlat: textFlat: "Sair" on_release: app.stop ()
: GridLayout: rows: 2 padding: 50 spacing: 25 ScrollView: MDList: size_hint: (1,1) spacing: 25 id: chatview canvas.before: Color : rgba: (0,0,0,0.13) Прямоугольник: size: self .size pos: self.pos BoxLayout: size_hint: (0.1, 0.1) canvas.before: Color: rgba: (155,155,0,0.5) Прямоугольник: size: self.size pos: self.pos интервал: 10 MDTextField: id: mensagem hint_text: Текст "Mensagem": 'Oi, Didi go' многострочный: False write_tab: False focus: True MDIconButton: icon: "email-send" focus_next: True on_press: root .enviar_mensagem (mensagem.text)
Есть идеи?
Спасибо!