Buttongrössen verschieden

Fragen zu Tkinter.
Antworten
MikeR
User
Beiträge: 8
Registriert: Montag 8. Oktober 2012, 07:33

Hallo zusammen. Ich bin neu hier und grüsse erstmal alle.
Ich habe vor kurzem mit Python 3.2 angefangen. Früher mal ein bischen C und Assembler auf dem 68000er gemacht.

Ich habe nun ein Problem mit den Buttons von Tkinter.
Programm ist ein UPN-Rechner. Viele Buttons auf Stoss ohne Abstand.
Diese habe ich mit .place positioniert.
Leider sind auf einem anderen Rechner Abstände zwischen den Buttons.
Schriftgrössen und Schriftart sind gleich. Fenstergrössen sind alle gleich, es hat sich also nichts verschoben,
sondern die Buttons mussen um 2-3 Pixel kleiner geworden sein.
Das betrifft nur die Button, die Labels und Entrys verändern sich nicht.
Systemschriftart ist Ubuntu Light 8.

Hat jemand eine Idee woran das liegen kann?
Vielen Dank.

Gruss Mike
BlackJack

@MikeR: Kann an einem anderen Monitor liegen. Woran das jetzt genau liegt ist aber eigentlich egal: Man verwendet genau deswegen kein `place()`.
MikeR
User
Beiträge: 8
Registriert: Montag 8. Oktober 2012, 07:33

BlackJack hat geschrieben:@MikeR: Kann an einem anderen Monitor liegen. Woran das jetzt genau liegt ist aber eigentlich egal: Man verwendet genau deswegen kein `place()`.
Ok. Was würdest du anstatt .place nehmen? Mit .pack bekomme ich die Buttons überhaupt nicht auf Stoss.
Ich hatte gerade deswegen .place genommen damit ich die Buttons pixelgenau setzen kann.

LG Mike
BlackJack

@MikeR: Je nach gewünschtem Ergebnis eine Mischung aus `Frame`\s, `pack()`, und `grid()`. Und vergiss am besten etwas pixelgenau machen zu wollen. Das macht sowieso nur Sinn wenn man eine niedrige und vor allem (so gut wie) feste Auflösung und Grösse bei allen Zielplattformen hat.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi MikeR

Kannst du uns einmal den Code bzw. Codeabschnitt zeigen mit welchem du die Buttons platzierst?

Gruß wuf :wink:
Take it easy Mates!
MikeR
User
Beiträge: 8
Registriert: Montag 8. Oktober 2012, 07:33

BlackJack hat geschrieben:@MikeR: Je nach gewünschtem Ergebnis eine Mischung aus `Frame`\s, `pack()`, und `grid()`. Und vergiss am besten etwas pixelgenau machen zu wollen. Das macht sowieso nur Sinn wenn man eine niedrige und vor allem (so gut wie) feste Auflösung und Grösse bei allen Zielplattformen hat.
Das verstehe ich nicht ganz. Pixel sind doch Pixel. Wenn ich die Koordinaten angebe sind die doch überall gleich, oder?
Es kann doch nicht sein das ein z.B. Grafikprogramm auf einem anderen Rechner die Grafik an anderer Stelle positioniert.
Bei einem anderen (Fremd)Programm das ich habe, funktioniert die Buttonanordnung auf jedem Rechner gleich.

Die Button muss ich "händisch" mit Angabe der Koordinaten setzen. (button254.place(x=132, y=150)). Der Punkt ist der,
dass die Buttons nach einer bestimmten Reihenfolge gezeichnet werden müssen, da sonst helle Randlinien der Buttons
nicht von dunklen Linien überzeichnet werden und somit die Buttons optisch nicht auf Stoss liegen würden.

Wenn ich die Reihenfolge .pack oder .grid überlasse habe ich den Effekt nicht.

Um das zu verdeutlichen hier mal 2 Screenshots von verschiedenen Rechnern.

Bild
Bild

LG Mike
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Natürlich ist auf allen Systemen ein Pixel immer ein Pixel, daneben gibt es aber noch andere Randbedingungen. In deinem Fall sieht es für mich so aus, dass du die Breite der Buttons nicht angegeben hast, die kann sich ja durchaus ändern. Abhängig von den Systemeinstellungen wie dicke der Ränder, Größe des Schattens, Schriftgröße etc. Daher solltest du deinen Ansatz mit place sofort vergessen, da die GUI nur auf deinem System gut aussehen wird, so lange du nichts an den Einstellungen änderst. Je nach Größe und Auflösung des Monitors ist zum Beispiel häufig die Schriftgröße eine andere. Bei dir wird das dazu führen, dass Beschriftungen abgeschnitten sind oder in andere Widgets hineinragen. Bei vielen Benutzern wird deine Anwendung am Ende daher wahrscheinlich ganz schön billig aussehen und unbenutzbar werden.

Setze dein Vorhaben also mit grid um, dann skaliert deine Anwendung auch vernünftig und jeder Benutzer kann sie mit seinen bevorzugten Einstellungen verwenden. Natürlich wir es dich einiges an Einarbeitungszeit und Umbauzeit kosten, aber die ist gut inverstiert. Mit place wirst du dich nur herumärgern, da es unerwartete Ergebnisse liefert oder du bei kleinsten Änderungen einen riesen Aufwand betreiben musst.
Das Leben ist wie ein Tennisball.
MikeR
User
Beiträge: 8
Registriert: Montag 8. Oktober 2012, 07:33

EyDu hat geschrieben:In deinem Fall sieht es für mich so aus, dass du die Breite der Buttons nicht angegeben hast, die kann sich ja durchaus ändern.
Doch hab ich, die Buttongrösse lässt sich ja leider nur in Zeilen angeben nicht in Pixel.

Aber ich glaube du hast Recht und das Problem liegt bei den Systemeinstellungen (Schatten, Ränder etc.)
In ein zwei Tagen ist das Programm fertig, dann werde ich mich nochmals den Buttons widmen.
Mal sehen ob ich das hinbekomme.

LG Mike
MikeR
User
Beiträge: 8
Registriert: Montag 8. Oktober 2012, 07:33

Hallo,

ich hab mir die Sache jetzt nochmals angeschaut und sehe da keine Möglichkeit die Buttons mit .grid ohne Abstand darzustellen.
Ich werde die Buttons wohl gegen Labels austauschen und mit .bind steuern müssen wenn ich von .place weg will.
Bevor ich mir aber die Arbeit mache wollte ich nochmal höflichst nachfragen ob es nicht doch eine Möglichkeit gibt die Buttons
mit .grid ohne Abstand darzustellen?
Und was ganz wichtig wäre, ob bei der Verwendung von .grid die Scalierung dann auf jedem Rechner stimmt oder kann es trotzdem
zu Darstellungsabweichungen kommen?

LG Mike
BlackJack

@MikeR: Also erst mal: Die Schaltflächen *werden* von `grid()` ohne Abstand positioniert. Das was Du da als Abstand wahrnimmst gehört zur Schaltfläche selbst und wird als Platz benötigt um einen Rahmen um die Schaltfläche mit dem Tastaturfokus zeichnen zu können ohne die Schaltfläche selbst zu übermalen. Benutz mal die Tabulatortaste in Deiner GUI um per Tastatur durch die Schaltflächen zu wechseln, dann siehst Du was ich meine.

Die Rahmenstärke kann man über das Argument `highlightthickness` bei der Schaltfläche auch auf 0 setzen. Der „Abstand” der dann noch da ist, wird für die gedrückte Darstellung der Schaltfläche benötigt. Dann versetzt sich die Schaltfläche nämlich ein Pixel nach rechts und unten um einen entsprechenden visuellen Effekt zu erreichen. Jedenfalls ist das bei mir unter Linux so. Keine Ahnung wie das unter anderen Betriebssystemen aussieht.

IMHO willst Du mehr Kontrolle als man von einem plattformübergreifenden GUI-Toolkit für normale Schaltflächen erwarten kann. Die Schaltflächen werden im Normalfall schon mit dem minimalen Abstand dargestellt der gerade noch eine sinnvolle Darstellung für die Funktionalität erlaubt.

Wenn Du da mehr Kontrolle willst und Schaltflächen mit Labels nach implementierst, kommt das zu dem Preis das Rad neu zu erfinden. Es ist ja nicht mit einem `Label` und einem `bind()` getan wenn man etwas haben möchte was sich aus Benutzersicht wie eine Schaltfläche verhält. Die Aktion wird bei Schaltflächen erst ausgelöst, wenn man die Maustaste wieder loslässt. Und das auch nur wenn sich der Mauszeiger zu dem Zeitpunkt innerhalb der Schaltfläche befindet. Ausserdem müsste man sich um das Zeichnen der (nicht) gedrückten Taste kümmern wenn der Mauszeiger die Schaltfläche verlässt und betritt während die Maustaste gedrückt ist. Ob der Aufwand wirklich diesen einen Pixel rechtfertigt? Oder ob man wegen dieses einen Pixels dem Benutzer etwas anbietet das von seinen Erfahrungen mit Schaltflächen abweicht?
Antworten