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()