как показать полученный объект через сокет на kivyMD GUI - PullRequest
0 голосов
/ 29 мая 2020

Я пробую (и пытаюсь понять) сокеты в 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)

Есть идеи?

Спасибо!

...