Statusbar bei Fenstervergrößerung nicht am unteren Rand

Fragen zu Tkinter.
Antworten
sedi
User
Beiträge: 104
Registriert: Sonntag 9. Dezember 2007, 19:22

Hallo Leute,

habe mal wieder eine Frage/Aufgabe für Euch...

Ich habe ein Modul erstellt um den immer wiederkehrenden Statusbar in den Griff zu kriegen - leider vergeblich (noch?!?).

Wenn ich ein Fenster erstelle, so wie das in der Testfunktion test_statusbar() versucht wurde und das Fenster anschließend per Hand vergrößere, dann bleibt der Statusbar nicht am unteren Rand sondern wandert leicht nach oben :(

Hier mein Code:

Code: Alles auswählen

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

import logging
from collections import OrderedDict
import ttk

try:
    import Tkinter as tk
except ImportError:  # py3k
    import tkinter as tk


Logger = logging.getLogger("statusbar")


class StatusBarField(tk.Label):
    def __init__(self, master, name, **kwargs):
        Logger.debug("<StatusBarField> init startet [name=%s]", name)

        self.name = name

        kwargs["bd"] = 1
        kwargs["relief"] = tk.SUNKEN

        tk.Label.__init__(self, master, **kwargs)
        self.pack(fill=tk.BOTH, expand=1)

        Logger.debug("<StatusBarField> init fertig")

    def set(self, value):
        self.config(text=value)

    def get(self):
        return self.cget("text")


class StatusBar(tk.Frame):
    def __init__(self, master, **kwargs):
        Logger.debug("<StatusBar> init startet")

        tk.Frame.__init__(self, master, **kwargs)

        self.fields = OrderedDict()

        Logger.debug("<StatusBar> init fertig")

    def __setitem__(self, name, fieldtext):
        Logger.debug("<StatusBar> __setitem__ startet [name=%s, fieldtext=%s]",
                     name, fieldtext)

        self.fields[name].set(fieldtext)

    def __getitem__(self, item):
        if isinstance(item, (str, unicode)):
            ret = self.fields[item].get()
        elif isinstance(item, (int, long)):
            ret = self.fields[self.fields.keys()[item]].get()

        Logger.debug("<StatusBar> __getitem__ - Return: %s", ret)
        return ret

    # ui

    def add_field(self, field):
        """Fuegt ein StatusBarFieldobjekt an.

        :param field: {StatusBarField object}
        """
        Logger.debug("<StatusBar> add_field startet [field=%s]", field)

        if isinstance(field, StatusBarField):
            self.fields[field.name] = field
            field.pack(side=tk.LEFT, fill=tk.X, expand=1)

        Logger.debug("<StatusBar> add_field fertig")

    def create_field(self, name=None, **kwargs):
        """Erstellt ein StatusBarFieldobjekt und fuegt es an.
        """
        Logger.debug("<StatusBar> create_field startet [name=%s, %s]",
                     name, kwargs)

        if name is None:
            name = len(self.fields)

        self.add_field(StatusBarField(self, name, **kwargs))

        Logger.debug("<StatusBar> create_field fertig")

    def set(self, *values, **name_and_values):
        Logger.debug("<StatusBar> set startet [%s, %s]",
                     values, name_and_values)

        if values:
            fieldnames = self.fields.keys()
            for i, value in enumerate(values):
                self.fields[fieldnames[i]].set(value)

        if name_and_values:
            for feld, wert in name_and_values.items():
                self.fields[feld].set(wert)

        Logger.debug("<StatusBar> set fertig")

    def clear(self):
        """Loescht alle Eintraege im Statusbar
        """
        Logger.debug("<StatusBar> clear startet")

        for feld in self.fields:
            self.fields[feld] = ""
            self.fields[feld].update_idletasks()

    def pack(self, **kwargs):
        kwargs["side"] = tk.BOTTOM
        kwargs["fill"] = tk.BOTH
        kwargs["pady"] = 1
        kwargs["expand"] = 1
        tk.Frame.pack(self, **kwargs)


def test_statusbar():
    logging.basicConfig(level=10, name="statusbar")
    
    root = tk.Tk()
    root.title("Statusbartest")

    frm = tk.Frame(root, height=100, width=200, bg="red")
    frm.pack(side=tk.TOP, fill=tk.BOTH, expand=True)

    sbar = StatusBar(root)
    sbar.create_field(0)
    sbar.set("ich bleib leider nicht am Boden...")
    sbar.pack()

    def geklickt(*args):
        print "### Statusbarinhalt: %s ###" % sbar[0]
        sbar.set("ich wurde geklickt...")

    frm.bind("<1>", geklickt)
    root.mainloop()


if __name__ == '__main__':
    test_statusbar()
CU sedi
----------------------------------------------------------
Python 3.5; Python 3.6
LinuxMint18
sedi
User
Beiträge: 104
Registriert: Sonntag 9. Dezember 2007, 19:22

Hab die Lösung selbst gefunden - es liegt an dem Argument

Code: Alles auswählen

expand=1
, wird dies weggelassen, oder einfach auf 0 gesetzt, dann bleibt der Statusbar unten kleben - wie gewollt!
CU sedi
----------------------------------------------------------
Python 3.5; Python 3.6
LinuxMint18
Antworten