在kv文件中使用"ids"时一次又一次地出错



好吧,我在kivy中使用"ids"时遇到了问题。

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()

请帮忙。

ScreenManager 不是 ChatApp 的父级。您需要找到一种正确引用小部件的方法。这是可能的解决方案的草图。虽然没有经过测试!或者,尝试扩展ScreenManager,然后从那里使用StringProperty,ObjectProperty和ids。希望它有所帮助,尽管没有经过测试。如果您有一个没有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()

聊天.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"

聊天2.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"。

最新更新