Unterschiedliches Verhalten unter Win und Linux

Fragen zu Tkinter.
Antworten
DRW
User
Beiträge: 10
Registriert: Freitag 5. März 2021, 04:46

Guten Morgen,
da hätte ich doch gerne gleich mein nächstes Problem, diesmal nicht den Code, sondern das allgemeine Verhalten betreffend.

Das Problem als Kernfrage vorneweg:
Über eine Schleife generierte Widgets werden unter Linux anstandslos angezeigt, bei Windows fehlen diese mitunter und sind erst nach "Maus-Hover" sichtbar. Warum?
Ist unter Windows noch ein zusätzlicher "Handgriff" vonnöten?

Details zum Aufbau:
Ein Fenster hat vier Labelframes zur Tabellenbearbeitung aus einer DB, die auf MS-SQL-Server oder lokal als SQLite vorhanden ist.
Gibt es beides, wird der MS-SQL-Server gewählt. Ist dieser nicht erreichbar, wird lokal zugegriffen.

Die aktuell anzuzeigende Tabelle wird mit einer ComboBox aus LabelFrame 1 ausgesucht und Informationen wie z.B. zum Typ bzw. der Verbindung angezeigt.

LabelFrame 2 zeigt die Tabelle im Treeview dynamisch entsprechend der Auswahl, LabelFrame 3 enthält Entrys und Buttons für die Suche / Filterung.

Im letzten LabelFrame 4 werden mittels .pack() Labels und Entrys platziert. Dies sind die Namen und dazugehöriger Felder einer Tabelle.
Auch das wird dynamisch entsprechend der gewählten Tabelle aktualisiert (for-Schleife über die Spaltennamen, anzuzeigende Label etc..)
Dazu gehören noch Buttons für Aktualisierung (SQL-UPDATE), Löschen (SQL-DELETE) und Neu (SQL INSERT-INTO).
Das funktioniert alles wunderbar und ohne jede Schwierigkeit unter Linux.
Unter Windows ist die Programmfunktionalität zwar ebenfalls voll gegeben, aber die Label und Felder werden teilweise nicht angezeigt - für jede Tabelle anders und nicht reproduzierbar.
Zumindest die Felder werden bei Maus-Hover oder Auswahl eines Datensatzes im Treeview aber plötzlich angezeigt (also "nachträglich" eingeblendet), die Label bleiben unsichhtbar.
Erst- oder Zweit- oder xxx-Aufruf spielen keine Rolle.

Was habe ich zur Lösung versucht:
In die for-Schleife eingebaute update() und update_idletask() ändern nichts an dem Verhalten, egal ob ich das "parent" den (das?) LabelFrame aktualisiere oder beides..
Sie funktionieren aber, da ich zum Beispiel die Größe / Umbruch ebenfalls dynamisch ausführe und dazu die Größe des nächsten Widgets hole, was nur nach update() sinnvolle Resultate ergibt. Hierfür reicht update() des LabelFrame. Passt es rechts nicht mehr, geht es links in neuer Zeile weiter. Das wäre mit "grid()" vielleicht einfacher, wegen des Gesamtkonzepts habe ich hier aber .pack() genommen / nehmen müssen.

Was ist das Problem bei der Anzeige unter Windows? Ein "strukturelles" Problem vermute ich eigentlich nicht, da keinerlei Schwierigkeiten unter Linux bestehen.

Wenn hierzu jemand eine Idee hätte, würde mich das sehr freuen :-) !

Gruß,
Dirk
DRW
User
Beiträge: 10
Registriert: Freitag 5. März 2021, 04:46

Nachtrag, weil ich doch noch einen möglichen Hinweis dazu fand:
Es ist egal, ob das Script aus Eclipse (meine normale Entwicklungsumgebung), Visual Studio Code, IDLE oder von der Komandozeile gestartet wird.
Linux ok, Windows nö...
Benutzeravatar
__blackjack__
User
Beiträge: 12984
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@DRW: Ohne Code kann man dazu nicht viel sagen. Es gibt doch relativ viel was man bei GUI-Programmierung falsch machen kann, was dann zu nicht deterministischen Verhalten führt. Klassiker bei `tkinter` sind mehr als ein `Tk`-Objekt oder Zugriff auf GUI (bzw. Tcl-Interpreter allgemein) aus anderen Threads als dem in der die GUI-Hauptschleife läuft.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
DRW
User
Beiträge: 10
Registriert: Freitag 5. März 2021, 04:46

Das Thema ist gelöst!

Der automatische Umbruch erfolgt dadurch, dass die Elemente Label / Entry in einen neuen LabelFrame im LabelFrame 4 gepackt werden.
Passt nichts mehr in die verbleibende Breite, wird ein weiterer LabelFrame unten eingefügt.
Während bei Linux ohne weiteres Zutun alles so funktionierte, war das wie beschrieben unter Win nicht so.

Die letzte "Verzweiflungstat" brachte die Lösung:

Windows möchte einfach noch einmal eine "neue Zeile"!
Einfach noch einmal einen LabelFrame unter dem letzten gefülten und alles läuft. CR / CR-LF Problem also auch bei Frames :-)

Gruß,
Dirk
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

Wieder ein Fall von "Mythos Programmierung". Man ändert hundert Dinge und zufällig funktioniert dann der Code nur hat das nichts mit der vermeintlichen Lösung zu tun.
DRW
User
Beiträge: 10
Registriert: Freitag 5. März 2021, 04:46

Sirius3, was genau möchtest Du mir sagen?
Du kennst die richtige Lösung und ich habe nur glücklich gestochert?
Lies mal noch mal, ich habe NICHT hundert Dinge geändert und dann ging es zufällig!
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

Ohne Code läßt sich natürlich nichts sagen, aber Deine Erklärung hört sich doch sehr abenteuerlich an.
DRW
User
Beiträge: 10
Registriert: Freitag 5. März 2021, 04:46

Also eadabw.
Ich habe nichts erklärt, sondern etwas zum Funktionieren gebracht.

Die *Ursache* kannst Du doch auch nicht nennen (jaja, ohne meinen Code...), dann lass auch die Sticheleien.
Antworten