Wie aktualisiere ich Kivy-Elemente aus einem Thread?

9

Ich habe einen Socket-Client, der bei jedem Empfang einer Nachricht eine View() -Klasse aufruft. Ich habe meinen Code so aufgeteilt, dass diese Klasse einfach print() oder eine andere Anzeige-Methode verwenden kann, wie ich es mag. Es scheint jedoch, dass Kivy diese Methode nicht mag. Ich habe Kivys BoxLayout -Klasse für meine Sicht erweitert und kann die Funktion message() aufrufen. Die Klasse sieht ungefähr so ​​aus:

%Vor%

Die Nachrichtenfunktion wird tatsächlich aufgerufen und es wird gedruckt, aber die Schnittstelle wird nicht aktualisiert. Wenn ich den Knopf jedoch drücke, aktualisiert es die Schnittstelle sowie Druck.

Ich habe nach einem StringProperty gesucht, um den Schaltflächentext zu ändern, aber das ist auch fehlgeschlagen. Nur als Hinweis, falls das, was ich mache, völlig unmöglich ist, versuche ich später eine ganze Schnittstelle, bestehend aus width * height Buttons, in Form einer Tafel zu zeichnen.

Jede Eingabe ist sehr geschätzt, es hat mich verrückt gemacht.

EDIT 1 * Ich habe ein paar Kommentare verfolgt und einige Dinge ausprobiert. Ich habe eine Clock -Klasse hinzugefügt und eine update() -Methode von View einplanen lassen. Die Aktualisierungsmethode ändert einfach den Text einiger Elemente. Ich habe festgestellt, dass es funktioniert, wenn ich es wie folgt einplane: %Vor%

Der Thread weist nun einfach die text-Eigenschaft zu, wie sie in message() zu sehen ist. Die periodisch ausgelösten Methoden update() funktionieren ebenfalls und weisen zufälligen Text zu. Jetzt das Problem jedoch, dass es den Text nicht einstellen kann. Dies funktioniert nicht:

%Vor%

Ich muss anderswo falsch machen, irgendwelche Vorschläge?

EDIT 2 * Der Fehler, den ich versuche zu debuggen, ist hier .     
timur 19.11.2015, 16:22
quelle

1 Antwort

3

Da Sie kein vollständiges Arbeitsbeispiel veröffentlichen, kann ich nur raten, was Sie tun. Anscheinend haben Sie ein Ereignis (eingehende Nachricht) in einem Thread und möchten in diesem Fall etwas Text anzeigen. Sie müssen UI-Updates an den Hauptthread "pushen", aber Sie müssen nicht periodische Updates mit Clock durchführen, Sie können nur einmalige Aufrufe mit Clock.schedule_once einplanen.

%Vor%

Wie schon erwähnt, können Sie dies mit dem automatisch zum Hauptthread machen @mainthread Dekorateur:

%Vor%

Auf diese Weise wird jedes Mal, wenn Sie update aufrufen, diese im Hauptthread ausgeführt.

    
bj0 20.11.2015 18:07
quelle