.grid_bbox()

Fragen zu Tkinter.
Antworten
Benutzeravatar
Perlchamp
User
Beiträge: 151
Registriert: Samstag 15. April 2017, 17:58

Donnerstag 14. März 2019, 20:08

moinsen,

Code: Alles auswählen

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

__author__ = 'Perlchamp'
__date__ = '14.03.2019'

import tkinter as tk

ROOT_TITLE = ' Schriftarten'
FAVICON = 'image/perlchamp_20x16.ico'
ROOT_WIDTH = 350
ROOT_HEIGHT = 300
ROOT_X_POSITION = '+20'
ROOT_Y_POSITION = '+20'
ROOT_BGCOLOR = '#999999'


class Application(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self, master, bg=ROOT_BGCOLOR)
        self.__create_widgets()

    def __create_widgets(self):
        top = self.winfo_toplevel()
        top.columnconfigure(0, weight=1)
        top.rowconfigure(0, weight=1)
        self.columnconfigure(0, weight=1)
        self.rowconfigure(0, weight=1)
        self.quit_button = tk.Button(self, text='Beenden', command=self.quit)
        self.quit_button.grid(row=0, column=0)
        self.bbox_label = tk.Label(self, text=self.quit_button.grid_bbox())
        self.bbox_label.grid(row=1, column=0)        


def main():
    root = tk.Tk()
    root.iconbitmap(FAVICON)
    root.title(ROOT_TITLE)
    root.geometry(f'{ROOT_WIDTH}x{ROOT_HEIGHT}{ROOT_X_POSITION}{ROOT_Y_POSITION}')
    app = Application(root)
    app.grid(row=0, column=0, sticky=tk.N +tk.E +tk.S +tk.W)
    root.mainloop()


##HAUPTPROGRAMM
if __name__ == '__main__' :
    main()
warum bekomme ich im Label *(0, 0, 0, 0)* angezeigt ?
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
Benutzeravatar
__blackjack__
User
Beiträge: 3357
Registriert: Samstag 2. Juni 2018, 10:21

Donnerstag 14. März 2019, 22:09

@Perlchamp: `grid_bbox()` liefert die „bounding box“ der Widgets die *in* dem Widget angeordnet sind und ein Button enthält keine anderen Widgets. Das heisst Du müsstest das auf dem `Application`-Objekt aufrufen. Allerdings wird das zu dem Zeitpunkt wo Du das im Moment machst, auch 0, 0, 0, 0 ergeben, weil das Anordnen erst passiert wenn die Hauptschleife läuft.

Und danach ist das nicht so wirklich spannend, weil durch die `sticky`-Option das gesamte Fenster ausgefüllt wird. Der Wert dafür lässt sich übrigens einfacher und kürzer als `tk.NSEW` schreiben.

Die beiden führenden Unterstriche bei `__create_widgets()` sind mindestens einer zu viel. Ich würde gleich die ganze Methode weglassen und das in die `__init__()` schreiben.

Die Sachen mit dem `top` gehören da nicht rein. Das geht fest davon aus, dass das Fenster das direkte Elternelement von `Application` ist, sagt das aber so nicht. Wenn man da etwas zwischen bastelt, dann geht das schief.

Die Fensterposition würde ich nicht vorgeben. Das kann die Fensterverwaltung des Systems eigentlich immer besser entscheiden als der Programmierer, insbesondere weil er ja gar nicht weiss wie auf beliebigen Systemen zum Beispiel die Monitore angeordnet sind, und was der Benutzer dort für Vorlieben eingestellt hat was das öffnen von neuen Fenstern angeht.
“I am Dyslexic of Borg, Your Ass will be Laminated” -- unknown
Benutzeravatar
Perlchamp
User
Beiträge: 151
Registriert: Samstag 15. April 2017, 17:58

Donnerstag 14. März 2019, 23:41

@ _blackjack_:
zuerst vielen Dank für deine Antwort.
1.
Ich bin gerade dabei, für mich kleine Beispielprogramme zu schreiben, um zu zeigen, wie manche Methoden eingesetzt werden, und was sie bewirken ...
Deswegen ist der Titel des root-Fensters auch falsch, sollte eigentlich 'andere Raster-Management-Methoden' heißen ;-)
Da wäre es schön gewesen, wenn *.grid_bbox* 'ohne großen Aufwand funktioniert' hätte. (.grid_forget()) und entsprechende Methoden werden auch noch ins Skript implementiert (*b*box ist im Alphabet nun mal fast ganz weit vorne) ...
Verstehe aber, dass *bbox()* erst funktioniert, NACHDEM das Fenster *gerendert* worden ist ...
2.
Ich dachte, wenn so viele Widgets (kommen, wie gesagt, noch einige dazu) erzeugt und sichtbar gemacht werden, würde *def create_widgets(self)* schon etwas (mehr) Sinn [Thema: 'Programmierstil, Verfeinerung, etc.'] machen (hatte ich in meinem anderen Thread bereits eingesehen, dass es eigentlich nicht schön und zudem sinnlos ist). Aber um so besser, wenn man alles ins __init__() schreiben darf/muß/soll ...
3.
ja, ich weiß, dass es eigentlich in Python 'verpönt' ist, etwas ganz privat zu machen, hatte dies aber im Tutorial der MexicanTech gesehen. Mir soll's recht sein, wenn die beiden Unterstriche weg sollen. Wird nun sowieso alles in das __init__ () geschrieben ;-)
4.
Dein Tipp mit *tk.NSEW* ist auf jeden Fall für mich der 'Burner' ! (hatte ich bisher so noch nicht gesehen).
5.
Wie ich das mit dem *top* anders machen kann, da lasse ich mir noch etwas einfallen ...
6.
Die Fensterposition wegen 1. Und auch hier vielen lieben Dank für die wertvolle Info !
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
Benutzeravatar
__blackjack__
User
Beiträge: 3357
Registriert: Samstag 2. Juni 2018, 10:21

Donnerstag 14. März 2019, 23:50

Ad 3: Es ist nicht verpönt sondern das ist eben nicht ganz privat. Also weder ist das technisch privat im Sinne von man kann da von aussen nicht mehr zugreifen, noch bedeuten die beiden Unterstriche „private“.
“I am Dyslexic of Borg, Your Ass will be Laminated” -- unknown
Benutzeravatar
Perlchamp
User
Beiträge: 151
Registriert: Samstag 15. April 2017, 17:58

Freitag 15. März 2019, 01:31

"nicht ganz privat" ... damit meinst du jetzt mit einem Unterstrich ?
klar, sollte man bei ganz privaten (2 Unterstriche) von außen nicht zugreifen (ich nenne es Etikette), aber natürlich kann man dies ...
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
Benutzeravatar
__blackjack__
User
Beiträge: 3357
Registriert: Samstag 2. Juni 2018, 10:21

Freitag 15. März 2019, 02:08

@Perlchamp: Nein, mit „nicht ganz privat“ meine ich die zwei Unterstriche. Da kann man ja trotzdem noch von aussen drauf zugreifen, weil der Mechanismus wie der Name dann verändert wird, dokumentiert ist.

Bei einem Unterstrich sollte man von aussen nicht zugreifen, aus Höflichkeit. Bei Zweien auch nicht, aber die haben halt einen anderen Zweck als etwas als „private“ oder nicht öffentliche API zu kennzeichnen. Das Problem das die Lösen kommt in normalem Python-Code allerdings auch sehr, sehr selten auf, denn weder tiefe Vererbungshierarchien noch Mehrfachvererbung sind in Python die Regel.
“I am Dyslexic of Borg, Your Ass will be Laminated” -- unknown
Antworten