Vertikale Scrollbar hinzufügen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
WvonRiedi
User
Beiträge: 36
Registriert: Mittwoch 20. Januar 2021, 20:46

Ich stehe schon wieder an.
Ich lese aus einer Datei und füge diese Daten in eine Tabelle ein. Leider zeigt es mir nur die Daten die auf dem Bildschirm platz haben.

Code: Alles auswählen

from tkinter import Entry, Tk, END, CENTER
import csv 

class Table: 
      
    def __init__(self,fenster): 
        
        for i in range(total_rows): 
            for j in range(total_columns): 
                  
                self.e = Entry(fenster, width=15, fg='black', 
                               font=('Arial',8),justify = CENTER) 
                  
                self.e.grid(row=i, column=j) 
                self.e.insert(END, daten[i][j]) 

with open('Daten.csv', newline='') as f:
    reader = csv.reader(f)   
    daten = [tuple(row) for row in reader]

total_rows = len(daten) 
total_columns = len(daten[0])

fenster = Tk()
fenster.title('Alle Daten anzeigen')
t = Table(fenster) 
fenster.mainloop()
Wie bekomme ich eine Scrollbar hinzugefügt. Hab Ihr mir einen Tipp?
Danke
Werner
Benutzeravatar
__blackjack__
User
Beiträge: 14065
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@WvonRiedi: Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Dann kann die `__init__()`-Methode nicht mehr so einfach auf die Anzahl der Spalten und Zeilen und die Daten zugreifen → Alles was Funktionen und Methoden ausser Konstanten benötigen wird als Argument(e) übergeben. Wobei die Anzahl der Spalten und Zeilen sowieso nicht übergeben werden sollten, denn wenn man die Daten übergibt, dann kann man diese Werte ja aus den Daten *dort* ermitteln, wo sie gebraucht werden.

Wenn sie denn gebraucht würden, denn Schleifen über Indexwerte um damit dann auf Sequenzen zuzugreifen sind in Python ein „anti-pattern“. Man kann direkt über die Elemente von Sequenzen iterieren, ohne den Umweg über einen Laufindex. Sollte man *zusätzlich* zu den Elementen eine laufende, ganze Zahl benötigen, gibt es die `enumerate()`-Funktion.

Gibt es einen Grund warum die Datensätze von Listen in Tupel umgepackt werden?

Die Klasse `Table` macht so keinen Sinn, weil sie nur aus der `__init__()`-Methode besteht und keinem sinnvollen Zustand. Wenn man in einer Schleife etwas immer an den gleichen Attributnamen bindet, dann ist das in aller Regel falsch, weil das keinen Sinn macht immer wieder die Werte zu überschreiben und nur den letzten zu behalten. Zudem gibt es dann den Randfall, dass die Schleife bei einer leeren Datei gar nicht durchlaufen wird, und damit dieses Attribut gar nicht definiert wird.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
import csv
from tkinter import CENTER, END, Entry, Tk


def main():
    with open("Daten.csv", newline="", encoding="utf-8") as file:
        daten = list(csv.reader(file))

    fenster = Tk()
    fenster.title("Alle Daten anzeigen")
    for row_index, row in enumerate(daten):
        for column_index, value in enumerate(row):
            entry = Entry(
                fenster,
                width=15,
                fg="black",
                font=("Arial", 8),
                justify=CENTER,
            )
            entry.grid(row=row_index, column=column_index)
            entry.insert(END, value)

    fenster.mainloop()
Scrollbars lassen sich auf `Canvas`-Widgets anzeigen. Da muss man dann einen `Frame` in ein `Canvas` packen, in dem dann die Elemente platziert werden. Da gibt's im Netz Rezepte wie man das macht.

Allerdings könntest Du Dir auch erst einmal ein `ttk.Treeview` anschauen. Oder ein anderes GUI-Rahmenwerk. :-)
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
WvonRiedi
User
Beiträge: 36
Registriert: Mittwoch 20. Januar 2021, 20:46

Herzlichen Dank für die rasche und ausführliche Antwort.
Werde mich schlau machen über 'ttk.Treeview'
Gruss Werner
Antworten