Получение ошибки снова и снова при использовании "идентификаторы" в файле KV

Ну, я получаю проблемы при использовании "идентификаторы" в kivy.

from twisted.internet import reactor, protocol
from twisted.protocols.basic import LineReceiver

class User(protocol.Protocol):
    def connectionMade(self):
        self.transport.write("hey brother")

    def dataReceived(self, data):
        print (data)

class ChatClientFActory(protocol.ClientFactory):
    protocol=User

    def __init__(self,app):
        self.app=app

class ClientFactory(protocol.ClientFactory):
    def buildProtocol(self, addr):
        return User()

def run():
    reactor.connectTCP("localhost",8000,ClientFactory())
    reactor.run()


from kivy.app import App
from kivy.uix.relativelayout import RelativeLayout
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen, ScreenManager

Builder.load_file("chat.kv")
Builder.load_file("chat2.kv")

class User1(Screen):
    pass
class User2(Screen):
    pass

s=ScreenManager()
s.add_widget(User1(name="start"))
s.add_widget(User2(name="let's_chat"))

class ChatApp(App):
    def connect(self):
        print(self.root.ids.message.text)
        self.parent.current="let's_chat"

    def build(self):
        return s

if __name__=="__main__":
    ChatApp().run()

Когда я использую "self.root.ids.message.text", он всегда показывает, что "супер" объект не имеет атрибута "getattr". Я искал много раз, но не нашел решения. Ниже приведен файл kv этого:-

<User1>:
    RelativeLayout:
        TextInput:
            text:
            pos_hint:{"center_x":.5,"center_y":.5}
            size_hint: .3, .2
        Button:
            text:"start"
            pos_hint:{"x":0,"bottom":0}
            size_hint: .3, .2
            on_press:
                app.connect()

Пожалуйста помоги.

2 ответа

Решение

ScreenManager не является родителем ChatApp. Вам нужно найти способ правильной ссылки на ваши виджеты. Это эскиз возможного решения. Хотя не проверено! В качестве альтернативы, попробуйте расширить ScreenManager и продолжить работу с StringProperty, ObjectProperty и идентификаторами. Надеюсь, что это помогает, хотя не проверено. Если у вас есть отдельный пример без twisted Я мог бы помочь вам лучше и проверить мое решение.

питон

class ChatApp(App):
    sm = ObjectProperty()
    screen1 = ObjectProperty()
    screen2 = ObjectProperty()

    def connect(self):
        print(self.screen1.ids.txtinpt.text)
        self.sm.current="let's_chat"

    def build(self):
        self.sm=ScreenManager()
        self.screen1 = User1(name="start")
        self.screen2 = User2(name="let's_chat")
        self.sm.add_widget(self.screen1)
        self.sm.add_widget(self.screen2)
        return self.sm

киловольт

<User1>:
    RelativeLayout:
        TextInput:
            id: txtinpt
            pos_hint:{"center_x":.5,"center_y":.5}
            size_hint: .3, .2

Вот весь програнн без скручивания, это очень просто, но у меня возникают трудности при вызове метода с помощью кнопки kv.

Chat.py

from kivy.app import App
from kivy.uix.relativelayout import RelativeLayout
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen, ObjectProperty

Builder.load_file("chat.kv")
Builder.load_file("chat2.kv")


class User1(Screen):
    pass

class User2(Screen):
    pass


class ChatApp(App):
    sm = ObjectProperty()
    screen1 = ObjectProperty()
    screen2 = ObjectProperty()

    def connect(self):
        print(self.screen1.ids.txtinpt.text)

    def build(self):
        self.sm=ScreenManager()
        self.screen1 = User1(name="start")
        self.screen2 = User2(name="chat_screen")
        self.sm.add_widget(self.screen1)
        self.sm.add_widget(self.screen2)
        return self.sm






if __name__=="__main__":
    ChatApp().run()

chat.kv

<User1>:
    RelativeLayout:
        TextInput:
            id:Username
            pos_hint:{"center_x": .5, "center_y": .7}
            size_hint: .3, .2
        TextInput:
            id:Password
            pos_hint:{"center_x": .5, "center_y": .5}
            size_hint: .3, .2
        Button:
            text:"send"
            pos_hint:{"center_x": .5, "center_y": .3}
            size_hint: .3, .2
            on_press:
                root.manager.current="chat_screen"

chat2.kv

<User2>:
    RelativeLayout:
        Label:
            id:show_msg
            text:""
            pos_hint:{"x":0,"top":1}
            size_hint_x: root.width
            size_hint_y: .5
        TextInput:
            id:txt_msg
            pos_hint:{"x": 0, "bottom": 0}
            size_hint: .6, .2
            multiline:False
        Button:
            text:"send_msg"
            pos_hint:{"x": .7, "bottom": 0}
            size_hint: .3, .2
            on_press:
                app.connect()

ошибка показа:

File "/root/PycharmProjects/Chat/chat2.kv", line 19, in <module>
     app.connect()
   File "/root/PycharmProjects/Chat/Chat.py", line 23, in connect
     print(self.screen1.ids.txtinpt.text)
   File "kivy/properties.pyx", line 839, in kivy.properties.ObservableDict.__getattr__ (/tmp/pip-build-0vou9szt/kivy/kivy/properties.c:12654)
 AttributeError: 'super' object has no attribute '__getattr__'

Извините, если я сделал что-то глупое. Я думаю, что я испытываю трудности в использовании метода приложения для вызова любой функции. Если да, то, пожалуйста, скажите мне, как использовать "self.app".

Другие вопросы по тегам