Kivy: String von .py an Label .kv übergeben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
DMD-OL
User
Beiträge: 327
Registriert: Samstag 26. Dezember 2015, 16:21

Das habe ich schon verstanden.
Ich werde mich aber erstmal um meine Baustelle, wieso ich in einer Funktion zwar ein TextInput lesen, aber ein Label in derselben Klasse nicht mit Text beschreiben kann.
DMD-OL
User
Beiträge: 327
Registriert: Samstag 26. Dezember 2015, 16:21

Wieso?

Code: Alles auswählen

class SecondScreen(Screen):
    def __init__(self, **kwargs):
        super(SecondScreen, self).__init__(**kwargs)


    def write(self):
        user_input = str(self.ids.input1.text)
        communication.write(user_input)
        self.label1.text = user_input   # Hier funktioniert das


    def receive(self, server_input):
        print(server_input)
        self.label1.text = "Hello world"  # Hier funktioniert das nicht
Wieso ist in der Funktion "write" alles ok und in "receive" nicht?

Code: Alles auswählen

 Traceback (most recent call last):
   File "C:\Program Files\Python310\lib\threading.py", line 1016, in _bootstrap_inner
     self.run()
   File "C:\Program Files\Python310\lib\threading.py", line 953, in run
     self._target(*self._args, **self._kwargs)
   File "C:\Users\dmd__\Documents\Programmierung\PyCharm\GPS-App\gps_client.py", line 39, in receive
     self.second.receive(message)
   File "C:\Users\dmd__\Documents\Programmierung\PyCharm\GPS-App\gps_client.py", line 87, in receive
     self.label1.text = "Hello world"  # Hier funktioniert das nicht
 AttributeError: 'NoneType' object has no attribute 'text'
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Weil das aus einem Thread heraus nicht aufgerufen werden darf. Was ja schon durchaus mehrfach erwaehnt wurde. Wahrscheinlich eine Race-Condition, und wenn es die nicht waere, dann eben ein Programmierfehler.

Gbit's nen tieferen Grund, warum du das nicht mit Clock machst, wie von Dennis vorgeschlagen?
DMD-OL
User
Beiträge: 327
Registriert: Samstag 26. Dezember 2015, 16:21

Ne, aber so deutlich wurde das hier noch nicht vermittelt.
Benutzeravatar
sparrow
User
Beiträge: 4512
Registriert: Freitag 17. April 2009, 10:28

Die Baustelle ist übrigens schon ganz schön lange offen.
DMD-OL
User
Beiträge: 327
Registriert: Samstag 26. Dezember 2015, 16:21

Ich habe da noch ein paar Fragen zum grundsätzlichen Plan:
1. Muss ich den Server auch mit Clock.schedule_interval(partial(handle, client), 0.5) laufen lassen oder kann ich den auch mit threading starten? Sprich: Verstehen sich Clock.shedule und Threading?
2. Für den Client stelle ich erst eine Verbindung ohne Clock und Threading her (direkt die Funktion connect ansprechen), und starte dann jedesmal wenn ich etwas senden will, mit Clock.shedule_once einen Datenstrom?
3. Client-Receive muss dann wohl mit Clock.schedule_interval gemacht werden?
Bin mir da noch nicht ganz im klaren drüber.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Beim senden gibt es keinen Grund für einen Timer, einfach sendall aufrufen. Im Timer callback kann man prüfen, ob Daten angekommen sind, und die dann verarbeiten. Das ist auch gleich für Server und Client. Threading und timer zu mischen ist technisch natürlich möglich, praktisch sehe ich nicht, warum.
Antworten