2017-07-20 7 views
0

Nun, ich bekomme ein Problem bei der Verwendung von "IDs" in Kivy.Immer wieder Fehler bei der Verwendung von "IDs" in kv-Datei

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

als ich "self.root.ids.message.text" verwenden, zeigt es immer, dass " 'super' Objekt kein Attribut 'getattr' hat". Ich habe viele Male gesucht, aber keine Lösung gefunden. Unten ist die kv-Datei davon: -

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

Bitte helfen.

+0

Ich habe "id: message", unter TextInput, aber immer noch mit dem gleichen Fehler –

+1

vielleicht sollten Sie einige Attribute in der Klasse 'ChatApp' durch die Implementierung eines' _init___ (self): 'Konstruktor und Aufruf' super() ChatApp, self) .__ init __() 'innerhalb – PRMoureu

+0

Danke für Ihren Vorschlag, aber es hat nicht funktioniert. –

Antwort

0

ScreenManager ist nicht das übergeordnete Element von ChatApp. Sie müssen eine Möglichkeit finden, Ihre Widgets korrekt zu referenzieren. Dies ist eine Skizze einer möglichen Lösung. Obwohl nicht getestet! Versuchen Sie alternativ, ScreenManager zu erweitern, und arbeiten Sie von dort mit StringProperty, ObjectProperty und ids. Hoffe es hilft, obwohl nicht getestet. Wenn Sie ein eigenständiges Beispiel ohne twisted haben, könnte ich Ihnen besser helfen und meine Lösung testen.

Python

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 

kv

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

Es funktionierte wie ein Charm Thanx, aber die TexInput Box wurde nicht anklickbar, aber ich werde es lösen. Thanx –

+0

Hallo @akashtyagi, wenn diese oder jede Antwort Ihre Frage gelöst hat, denken Sie bitte daran, es zu akzeptieren, indem Sie auf das Häkchen klicken. Dies zeigt der breiteren Gemeinschaft, dass Sie eine Lösung gefunden haben und sowohl dem Antworter als auch sich selbst einen guten Ruf verschaffen. Auch wenn Sie etwas mögen, können Sie es aufwerten. Es besteht keine Verpflichtung, dies zu tun. – PalimPalim

+0

Entschuldigung @PalimPalim Ich bin neu in stackoverflow, also wusste ich das nicht. Ich upvoted es und überprüfte es und danke nochmal für die Lösung –

0

Hier ist die ganze progran ohne seine sehr einfach verdreht, aber ich Schwierigkeiten habe Methode von einer kv-Taste im Aufruf.

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

seine zeigt Fehler:

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__' 

Tut mir leid, wenn ich etwas Dummes gemacht habe. Ich denke, dass ich Schwierigkeit habe, app-Methode zu verwenden, um irgendeine Funktion anzurufen. Wenn ja, bitte sagen Sie mir, wie Sie "self.app" verwenden können.

+0

gab es einen kleinen Referenzierungsfehler. Wenn Sie Ihre Verbindungsmethode auf 'def connect (self) aktualisieren: print (self.screen2.ids.txt_msg.text)' funktioniert es gut. – PalimPalim

+0

ich änderte von screen1 zu screen2 und die id zu txt_msg, weil du es so in der kv-datei – PalimPalim

+0

mit schlechtem gefühl benannte, dass ich so kleine fehler gemacht habe. Übrigens danke. –

Verwandte Themen