Widget für die Ausgabe von SQLite Inhalt gesucht

Fragen zu Tkinter.
Antworten
Reg
User
Beiträge: 10
Registriert: Samstag 9. Januar 2010, 15:25

Hallo,

ich habe eine kurze Frage an Euch.
Welche Widget benutzt Ihr für die Ausgabe von Datenbanken? ((tkinter)
Die Inhalte sollen lediglich angezeigt werden und müssen zunächst nicht verändert werden.
Ich beschäftige mich erst seit einigen Wochen mit Python, bin also nicht wirklich erfahren...

Vielen Dank vorab!

Reg
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Nun, die Anzahl der Tkinter-Widgets hält sich in Grenzen. Eine vollständige Übersicht findest du hier: http://effbot.org/tkinterbook/tkinter-index.htm.
Welche Widgets die passenden sind, hängt ja auch von der Art der Daten ab.
Reg
User
Beiträge: 10
Registriert: Samstag 9. Januar 2010, 15:25

Hi numerix,

danke für Deine rasche Antwort. Ich habe im Momentan leider keine richtige Vorstellung welches Widget man überhaupt nehmen kann.
Es gibt wohl zusätzliche Module mit erweiterten Textboxen. Allerdings fand ich da nur Erweiterungen welche noch für Python 2.x waren. Pmw.
Korrigiert wenn dem nicht so ist.
Da ich gerade erst anfange, dachte ich gleich mit Python3 einzusteigen...

Ich will voraussichtlich eine Tabelle mit 5 Spalten und weniger als 50 Zeilen ausgeben.

Gruß
Reg
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Reg hat geschrieben:Da ich gerade erst anfange, dachte ich gleich mit Python3 einzusteigen...

Hinsichtlich Tkinter ist das eine gute Entscheidung, dann solltest du aber auf jeden Fall Python 3.1 nehmen aufgrund der Erweiterungen von Tkinter gegenüber Python 3.0: http://docs.python.org/3.1/library/tk.html
Reg hat geschrieben:Ich will voraussichtlich eine Tabelle mit 5 Spalten und weniger als 50 Zeilen ausgeben.
Leider enthält Tkinter kein Tabellen-Widget. Du müsstest also entweder auf ein externes Modul zurückgreifen (falls es eins gibt; das wirst du gewiss selbst herausfinden) oder dir selbst was basteln. Je nachdem, ob du nur Anzeigen oder auch Änderungen in der Tabelle zulassen willst, kämen dafür das Label- oder das Entry-Widget in Betracht.
Reg
User
Beiträge: 10
Registriert: Samstag 9. Januar 2010, 15:25

Hi numerix,

ich bin leider nicht fündig geworden. Es gibt ein externes Modul Names "Tktables".
Allerdings scheint es bislang nur mit den 2.x Versionen zu arbeiten.
Also werde ich mir selbst was überlegen.
Danke nochmals an Dich!

Grüße
Reg
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Eventuell könnte ein Grundgerüst so aussehen. Ob das brauchbar ist, hängt allerdings von den konkreten Bedürfnissen/Inhalten ab (z.B. Spaltenbreite; ob nur angezeigt werden soll, ob Zeilenweise ausgewählt werden soll etc.).

Code: Alles auswählen

# Tkinter Table-Widget (Python 3.1)
# Ansatz mit Grundfunktionalitaet

import tkinter as tk

class Table(tk.Frame):
    """Tkinter Table Widget - Grundgerüst"""

    class Cell(dict):
        """Erlaubt den komfortablen Zugriff auf die Zellinhalte
        von außen über Indexpaare [zeile,spalte]. Links oben = [1,1]."""

        def __init__(self, entry):
            dict.__init__(self)
            self.entry = entry

        def __getitem__(self,key):
            row, column = key
            return self.entry[row][column].get()

        def __setitem__(self,key,value):
            row, column = key
            self.entry[row][column].delete("0","end")
            self.entry[row][column].insert("0",str(value))

    def __init__(self, master, rows, columns):
        tk.Frame.__init__(self,master)
        self.wcell = [0] # erhält die Entry-Widgets für die Zellen
        for row in range(1,rows+1):
            rowframe = tk.Frame(self)
            self.wcell.append([0])
            for column in range(1,columns+1):
                wc = tk.Entry(rowframe,justify="right",relief="flat",width=8)                              
                wc.pos = row, column
                wc.bind("<Button-1>",self.oncellclick)
                wc.pack(side="left")
                self.wcell[-1].append(wc)            
            rowframe.pack()        
        self.cell = Table.Cell(self.wcell) # für den Zugriff auf die Zellen von außen

    def oncellclick(self,event):
        """Exemplarischer Eventhandler - wird bei Klick auf eine Zelle ausgeführt."""
        row, column = event.widget.pos        
        print("Zelle [%i,%i] = %s" %(row,column,self.cell[row,column]))


# --------- Test --------------

from random import randrange    
        
def main():
    root = tk.Tk()
    root.title("Table Widget")
    rows, columns = 20, 5
    table = Table(root,rows,columns)
    table.pack()
    for row in range(1,rows+1):
        for column in range(1,columns+1):                        
            table.cell[row,column] = randrange(1000)   
    root.mainloop()

main()
Reg
User
Beiträge: 10
Registriert: Samstag 9. Januar 2010, 15:25

Hi numerix,

das sieht Klasse aus! Werde mich die kommenden Tage damit beschäftigen.
Habe eine stark vereinfachte Variante bereits eingebaut. Ich lese die Datenbank spaltenweise und gebe die einzelnen Tulpeln dann als Entry's in Schleifen aus.
Allerdings sieht es bei Dir deutlich besser aus. Muss mir unbedingt die Schreibweise anschauen. Da scheint einiges deutlich abgekürzt zu sein. :)

Gruß
Marcus
Antworten