Получение ошибки снова и снова при использовании "идентификаторы" в файле 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".