Seite 2 von 2

Re: Maximale Anzahl an Elementen in einem Grid?

Verfasst: Freitag 12. November 2010, 16:30
von Xynon1
Piotr hat geschrieben:Wenn du schon dabei bist dir mein Script anzusehen, hätte ich noch eine weitere Frage.
Ich möchte dass sich die Canvas größe automatisch an den Inhalt anpasst (max. Bildschirmauflösung) und erst ab da an die Scrollbars eingeblendet werden. Hast du eine Idee wie man das relativ einfach realisieren könnte?
Sry, fällt mir auf anhieb nichst ein, da ich das noch nie brauchte, aber ich kann mal nachsehen.
Bei meinem OS geht das automatisch :D.

Bin gerade am umschreiben deines Scripts, irgendwie habe ich gerade Probleme mit den Scrollbars.
Aber egal wollte mir sowieso schon immer mal eine Tabelle bauen :mrgreen:

Aber egal wie es nachher aussieht, die Peformance wird sich nicht Grundlegend ändern.

Re: Maximale Anzahl an Elementen in einem Grid?

Verfasst: Freitag 12. November 2010, 17:47
von Xynon1
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()

Re: Maximale Anzahl an Elementen in einem Grid?

Verfasst: Montag 15. November 2010, 12:42
von Xynon1
Ah, hier --> http://sourceforge.net/projects/tktable ... z/download

Bei dem ist die Performance um einiges höher, da hier die Tabelle direkt in tcl erstellt wird.

Re: Maximale Anzahl an Elementen in einem Grid?

Verfasst: Montag 22. November 2010, 15:50
von Piotr
Sorry, dass ich erst jetzt antworte. War eine Woche krank...

Ich werde deinen Code mal ausprobieren.
Aufjedenfall danke ich dir erstmal!

bye