2016-04-02 5 views
1

einstelle Ich schreibe ein Skript, um Dinge in ein Fenster auszugeben, das ein Tkhtml-Widget und ein Text-Widget enthält, die übereinander in einem ttk :: panedwindow angezeigt werden. Beide Widgets können vertikal und horizontal gescrollt werden. Es gibt auch eine Schaltfläche, mit der der Benutzer das Text-Widget löschen kann.Wann und wie man die Fenstergröße mit Tk

Ich mache einige der Entwicklung auf einem Laptop mit Ubuntu. Der Fenstermanager erlaubt vier Desktop-Arbeitsbereiche in einem 2x2-Array, und wenn die GUI zum ersten Mal angezeigt wird, blutet der untere fünfte von dem Arbeitsbereich, den ich benutze, in den unteren. Es ist ärgerlich, wenn ich die Größe des Fensters verkleinern muss, um es so kurz zu machen, dass es auf den Bildschirm passt, damit ich die Größe ändern kann.

(glaube ich) Ich weiß ungefähr, wie dies zu tun, d. H. An ein entsprechendes Ereignis binden, so dass ich ein Skript ausführen kann, wenn das Fenster zum ersten Mal angezeigt wird. (Setzen Sie die Bindung innerhalb des Skripts zurück, so dass sie nur einmal ausgelöst wird.) Ich glaubte, dass das "passende Ereignis" <Map> war, aber als das Fenster zum ersten Mal zugeordnet wurde, hatten die beiden Widgets keine Höhe (wie von [winfo height] gemeldet). Ich versuchte, an <Expose> zu binden, und das scheint zu funktionieren, ([winfo height] gibt vernünftige Zahlen zurück,) also:

Frage 1: Welches Ereignis sollte ich binden?

Wenn die Bindung Feuer, berichtet [wm geometry] die Geometrie als 815x1029 + 49 + 24, [winfo height] berichtet, die beiden Höhen der beiden Widgets wie 600 und 366, und [wm screenheight] gibt eine Höhe von 800. Ich weiß, gibt es verschiedene andere Bits und Stücke in der GUI, so bin ich nicht überrascht, dass 63 Pixel im ursprünglichen Layout nicht berücksichtigt werden. Ich nehme an, dass ich nach der Größenanpassung die gleiche Menge an Platz benötige, also sollte ich eine Geometrie von 815x737 + 49 + 24 anfordern, aber wenn ich das tue, blutet ein Band (ungefähr die untere horizontale Bildlaufleiste) immer noch auf den nächsten Arbeitsbereich.

Indem ich manuell mucke, weiß ich, dass, wenn alles gut auf dem Bildschirm passt, die Geometrie 815x717 + 49 + 24 sein sollte, also habe ich einen Fudge-Faktor von 20 zu dem Raum hinzugefügt, den ich für den "anderen" erlaube Bits und Stücke der GUI ". Dies funktioniert gut, aber scheint ein wenig unelegant (massive britische Untertreibung :-)), also:

Frage 2: Was habe ich verpasst, die Verwendung eines Fudge-Faktor?

Ich benutze Tk 8.6.1 auf Ubuntu 12.04.5 LTS. Ich verwende die Version 0.9.7.12 des Compiz-Fenstermanagers.

aktualisieren

Es fiel mir auf, dass ich sollte die Höhe der verschiedenen Scheiben, anstatt die Tkhtml und Text-Widgets wie das würde erklären die Bildlaufleisten und die Schaltfläche „Löschen“ finden. Die Fensterhöhen sind anfänglich 615 und 409, aber das bedeutet nur, dass ich meinen Fudge-Faktor von 20 auf 78 erhöhen muss, um die Anforderungshöhe auf den gewünschten Wert von 717 zu bringen. Gibt es eine Möglichkeit, vorherzusagen, welche Höhe für den Toplevel erforderlich ist enthält mein Fenster, um das Toplevel auf den Bildschirm zu bringen?

+0

'winfo Höhe' wird keine sinnvollen Zahlen zurückgeben, bis das Fenster vollständig angezeigt wird. Sie können 'winfo reqheight' verwenden, um die angeforderte Höhe des Fensters zu erhalten, bevor das Fenster angezeigt wird. –

+0

@BradLanam Ich erwartete, dass das '' -Ereignis nur ausgelöst wurde, wenn das Fenster vollständig angezeigt wurde, und war überrascht, dass' [winfo height] 'zu diesem Zeitpunkt keine sinnvollen Zahlen zurückgab. Das "" -Ereignis scheint spät genug zu brennen, dass es vernünftige Daten gibt, die wiederhergestellt werden können, aber ich bin überrascht, dass ich es verwenden muss, insbesondere angesichts dieser Aussage in der [Tk-Dokumentation] (http://www.tcl.org). tk/man/tcl8.6/TkCmd/bind.htm # M13): "Es ist normalerweise nicht notwendig, dass Client-Anwendungen Expose-Ereignisse behandeln, da Tk sie intern behandelt". – nurdglaw

+0

@BradLanam '[winfo reqheight]' gibt nichts hilfreiches zurück, da ich keine bestimmten Höhen anfordere. – nurdglaw

Antwort

0

Ich empfehle Bindung an <Map>. Ich würde auf alles warten: das Fenster, das Hauptfenster, das Textfenster und die Bildlaufleisten, die gemappt werden sollen, bevor ich versuche, die Höhe anzupassen.

Bei Linux weiß die [winfo screenheight .] nichts über konfigurierte Panels, daher müssen Sie diese subtrahieren. Sie können die tatsächliche Bildschirmhöhe verfügbar machen, indem Sie ein Fenster erstellen, indem Sie eine wm attributes . -zoomed 1 machen und dann die Geometrie des Fensters abrufen.

Die Titelleiste und die Rahmen des Fensters belegen Platz.Der dafür benötigte Platz kann durch Vergleichen der Ausgabe von [winfo geometry .] und [wm geometry .] berechnet werden.

Es gibt auch die Fensterrahmenhöhe und mögliche Ränder und Abstände. Sie können die Summe dieser Werte berechnen, indem Sie die Höhe des Fensterfensters von [winfo height .] abziehen.

Hier ist eine Methode, die immer funktionieren würde, aber es ist nicht sehr attraktiv, da der Benutzer die Fenster blinken sehen würde, wenn sie Größe ändern.

  • Maximieren Sie das Fenster (wm attributes . -zoomed 1)
  • die Fenstergeometrie Holen und das screen parsen.
  • De-maximieren das Fenster (wm attributes . -zoomed 0)
  • die Fenstergeometrie Holen und das screen mit dem maximierten screen ersetzen.
  • Legen Sie die Fenstergeometrie fest.
+0

Vielen Dank für die Vorschläge, @BradLanam. Ich denke, das Flackern Ihres Vorschlags würde es als eine Lösung ausschließen. Ich habe meine Herangehensweise geändert, um an das ''-Ereignis im Paned-Fenster zu binden und die Höhe auf die Bildschirmhöhe abzüglich eines Fudge-Faktors von 83 einzustellen. Dies funktioniert sowohl unter Ubuntu Linux als auch unter Windows gut. Es scheint keinen Bedarf zu geben, an ' 'an den untergeordneten Elementen des Fensterfensters zu binden. – nurdglaw

Verwandte Themen