Ok, hier mein erster Stand, vieleicht reicht dir das schon, aber heute muss ich noch was anderes machen.
Geht mit 70x70 noch Flüssig danach fängt es an zu ruckeln,
prüf mal ob der Fehler immer noch kommt.
Code: Alles auswählen
from Tkconstants import *
import Tkinter as tkinter
class AutoScrollbar(tkinter.Scrollbar):
# a scrollbar that hides itself if it's not needed. only
# works if you use the grid geometry manager.
def set(self, lo, hi):
if float(lo) <= 0.0 and float(hi) >= 1.0:
# grid_remove is currently missing from Tkinter!
self.tk.call("grid", "remove", self)
else:
self.grid()
tkinter.Scrollbar.set(self, lo, hi)
def pack(self, **kw):
raise TclError, "cannot use pack with this widget"
def place(self, **kw):
raise TclError, "cannot use place with this widget"
class TableWidget(tkinter.LabelFrame):
"""Eine Tabelle."""
def __init__(self, master, text, rows, columns, cnf={}):
"""Initialisiert eine neue Instanz von TableWidget
@type master: tkinter.Widget
@param master: Das Master Widget.
@type text: str
@param text: Der Text auf dem LabelFrame.
@type rows: int
@param rows: Die Anzahl der Zeilen.
@type columns: int
@param columns: Die Anzahl der Spalten.
@type cnf: dict
@param cnf: Optionen f\xfcr den Canvas.
"""
tkinter.LabelFrame.__init__(self, master, text=text)
vscrollbar = AutoScrollbar(self)
vscrollbar.grid(row=0, column=1, sticky=N+S)
hscrollbar = AutoScrollbar(self, orient=HORIZONTAL)
hscrollbar.grid(row=1, column=0, sticky=E+W)
self.canvas = tkinter.Canvas(self, cnf)
self.canvas.config(yscrollcommand = vscrollbar.set)
self.canvas.config(xscrollcommand = hscrollbar.set)
self.canvas.grid(row=0, column=0)
vscrollbar.config(command=self.canvas.yview)
hscrollbar.config(command=self.canvas.xview)
self.cells = {}
self.rows = rows
self.columns = columns
def show_table(self, widget, options={}):
"""Legt fest aus welchen Widgets die Tabelle besteht.
@type widget: classobj
@param widget: Ein tkinter.Widget aus dem jedes Feld der Tabelle
bestehen soll.
@type options: dict
@param options: Die Optionen f\xfcr das \xdcbergebene KlassenObjekt.
"""
frame = tkinter.Frame(self.canvas)
for row in xrange(self.rows):
for column in xrange(self.columns):
lb = widget(frame, options)
lb.grid(row=row, column=column)
self.cells[(row, column)] = lb
self.canvas.create_window(0, 0, window=frame)
self.update_idletasks()
self.canvas.config(scrollregion=self.canvas.bbox("all"))
def set_(self, xy, text=""):
"""Setzt einen Text auf eine Zelle der Tabelle.
@type xy: tuple(x,y)
@param xy: Die Koordinaten der Zelle.
@type text: str
@param text: Der Text, welcher der Zelle \xfcbergeben werden soll.
@warning: Nur m\xf6glich wenn das Zellen Widget eine Textoption hat.
"""
cell = self.cells[xy]
cell.config(text=text)
if __name__ == "__main__":
root = tkinter.Tk()
root.title("Tabellen Test")
options = dict(width=600, height=600)
tw = TableWidget(root, "Tabelle 1", 50, 50, options)
tw.grid(row=0, column=0)
options = dict(bd=3, relief=RIDGE, width=3)
tw.show_table(tkinter.Label, options)
tw.set_((0,0), "100")
tw.set_((1,1), "99")
root.mainloop()