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.
Kivy: String von .py an Label .kv übergeben
Wieso?
Wieso ist in der Funktion "write" alles ok und in "receive" nicht?
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
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'
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?
Gbit's nen tieferen Grund, warum du das nicht mit Clock machst, wie von Dennis vorgeschlagen?
Die Baustelle ist übrigens schon ganz schön lange offen.
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.
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.
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.