Umrechnung von Größenangaben

Fragen zu Tkinter.
Antworten
Nobuddy
User
Beiträge: 997
Registriert: Montag 30. Januar 2012, 16:38

Hallo zusammen

Für mich stellt sich die Frage, wie ich die Angabe

Code: Alles auswählen

self.root.winfo_screenwidth()
umrechnen kann, so daß der Wert mit 'width' gleich ist?

Beispiel:
Bei mir erhalte ich als Wert von

Code: Alles auswählen

self.root.winfo_screenwidth()
1680.
Das Fenster teile ich in einen linken und rechten Frame, mit jeweils 'width="18"' und einem Frame in der Mitte mit 'width="200"' auf. Der Rest wird dann durch 'fill="both"' erledigt.

Code: Alles auswählen

#!/usr/bin/python3

import tkinter as tk


class View(object):

    def __init__(self, controller):
 
        self.root = tk.Tk()
        self.root.title('Titel')
        self.controller = controller
        xpos = 0
        ypos = 0
        screenx = self.root.winfo_screenwidth()
        print(screenx)
        screeny =  self.root.winfo_screenheight()
        self.root.geometry("%dx%d+%d+%d" % (screenx, screeny, xpos, ypos))

        self.frame = tk.Frame(self.root)
        self.frame.pack(side='top', fill='both', expand=True)

        # Frame links
        button_frame_left = tk.Label(self.frame, width=18, height=screeny,
            bg='green')
        button_frame_left.pack(side='left', fill='both')

        # Frame rechts
        button_frame_right = tk.Label(self.frame, width=18, height=screeny,
            bg='darkgreen')
        button_frame_right.pack(side='right', fill='both')

        # Frame für Textfenster
        self.winLabel = tk.Label(self.frame, width=200,
            bg='yellow', fg='brown', text='Text',
            font=('NimbusSansL', 14))
        self.winLabel.pack(anchor='n', expand='YES', fill='both')  

        # Frame unten
        label_down = tk.Label(self.frame, heigh=8, width=200,
            bg='blue')
        label_down.pack(anchor='s', fill='x')


    def run(self):
        self.frame.mainloop()


class Controller(object):
    def __init__(self):
        self.view = View(self)

    def process_select_data(self):
        pass

    def run(self):
        self.view.run()


def main():
    Controller().run()

if __name__ == '__main__':
    main()
Wie kann ich nun eine genaue Umrechnung bekommen, bzw. gibt es da von Python schon eine Möglichgkeit?

Grüße Nobuddy
Nobuddy
User
Beiträge: 997
Registriert: Montag 30. Januar 2012, 16:38

Bisher habe ich folgendes gefunden, was mir aber nicht viel weiter hilft.
width
Die Breite des Widgets in Zeicheneinheiten. Eine passende Breite basierend auf dem eingestellten Abbildungsverhältnis (siehe aspect) wird automatisch eingestellt, falls diese Option nicht eingestellt wird.
aspect
Abbildungsverhältnis (Aspect ratio). Es wird als Breiten-Höhenverhältnis in Prozent angegeben. Voreingestellt ist der Wert 150, d.h. das Fenster wird 50 % breiter als hoch sein. Falls die Breite explizit gesetzt wird, wird dieser Wert ignoriert.
Vielleicht kann mir doch von Euch jemand auf die Sprünge helfen, wie der Ausgabewert von

Code: Alles auswählen

self.root.winfo_screenwidth()
mit dem Wert von 'width' gleich zusetzen ist?

Grüße Nobuddy
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Mit diesem Problem habe ich mich auch noch nicht befasst, weshalb s. u.. Kurz mal guugeln:
http://stackoverflow.com/questions/2922 ... ith-python
http://www.tcl.tk/man/tcl8.4/TkCmd/font.htm

Ausprobieren:

Code: Alles auswählen

In [22]: import Tkinter as tk

In [23]: import tkFont

In [24]: font = tkFont.Font(family="Arial", size=10)

In [25]: font.measure('O O')
Out[25]: 24

In [26]: font.measure('O 1')
Out[26]: 21

In [27]: font.measure('0 0')
Out[27]: 18

In [28]: font.measure('0 1')
Out[28]: 18

In [29]: font.metrics('linespace')
Out[29]: 16

Aha, funktioniert. :-)
Das Hauptproblem bleibt natuerlich: It's english! Auch wenn du diese Baustelle noch nicht aufmachen willst, da wirst du nicht herumkommen, wenn du weiterkommen willst.

Die eigentlich Loesung:
Vergiss die Fummelei mit (Font/System/etc.)-abhaengigen Pixelwerten. Bau dir ein Layout mit grid und pack und organisiere das hierarchisch. Mit den ganzen Optionen wie fill, expand, sticky usw. sollte das ausreichen.

:wink:
yipyip
Nobuddy
User
Beiträge: 997
Registriert: Montag 30. Januar 2012, 16:38

Hallo yipyip

Keine Angst, möchte da keine Fummelei machen. :wink:
Habe mir ein Layout mit pack organisiert und verwende fill und expand.
Dazu habe ich aber teilweise Werte an width oder height übergeben, deshalb auch das grundsätzliche Interesse.

Wenn man über diese Thema nachdenkt und versucht eine Lösung zu finden, kann man echt irre werden. :lol:

Daher lasse ich das jetzt lieber und befolge Deinen Rat! :wink:

Grüße Nobuddy
Antworten