Scrollbar in Canvas

Fragen zu Tkinter.
Antworten
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

Hallo

Mein Problem ist, dass die die Scrollbar nicht richtig funktioniert.

Code: Alles auswählen

import Tkinter as tk

class TkTabelle:

    def __init__(self, frame, zeilen, spalten):

        self.frame = frame

        self.frame2 = tk.Frame(self.frame)
        self.frame2.grid(row=0, column=0, sticky='nswe')
        self.frame2.grid_rowconfigure(0, weight=1)
        self.frame2.grid_columnconfigure(0, weight=1)

        
        

        self.zeilen = zeilen
        self.spalten = spalten
        self.tabelle = []

        ## scrollbar erstellen

        yscrollbar = tk.Scrollbar(self.frame2)
        yscrollbar.grid(row=0, column=1, sticky='ns')


        self.canvas = tk.Canvas(self.frame2, bd=0, scrollregion=(0, 0, 1000, 1000), 
                        yscrollcommand=yscrollbar.set)

        self.canvas.grid(row=0, column=0, sticky='nswe')
        
        for z in range(zeilen):

            self.tabelle.append([])

            for s in range(spalten):

                entry = tk.Entry(self.canvas)
                entry.grid(row=z, column=s)
                self.tabelle[-1].append(entry)

        self.canvas.config(\
            scrollregion=(0, 0, self.canvas.cget('width'), self.canvas.cget('height')))
        
        yscrollbar.config(command=self.canvas.yview)
##        


## ... weitere methoden...


if __name__ == '__main__':

    win = tk.Tk()

    test = TkTabelle(win, 10, 4)

    win.mainloop()
Wie man sieht funktioniert die Scrollbar, allerdings wird das Canvas nicht gescrollt.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo Pascal

Habe dein Skript ein wenig durchenandergemischt. Bereinigen musst du es selber: Lösungsansätze gibt es einige. Wichtig ist, dass die Entry-Widgets in Canvas-Window-Objekte eingebettet sind damit die Canvas sie als grafische Objekte identifiziert:

Code: Alles auswählen

import Tkinter as tk

class TkTabelle:

    def __init__(self, frame, zeilen, spalten, listbox_height):

        self.frame = frame

        self.frame2 = tk.Frame(self.frame)
        self.frame2.grid(row=0, column=0, sticky='nswe')
        self.frame2.grid_rowconfigure(0, weight=1)
        self.frame2.grid_columnconfigure(0, weight=1)

       
       

        self.zeilen = zeilen
        self.spalten = spalten
        self.tabelle = []

        ## scrollbar erstellen

        #yscrollbar = tk.Scrollbar(self.frame2)
        #yscrollbar.grid(row=0, column=1, sticky='ns')


        self.canvas = tk.Canvas(self.frame2, bd=0, height=listbox_height) # , scrollregion=(0, 0, 1000, 1000),
#                        yscrollcommand=yscrollbar.set)

        self.canvas.grid(row=0, column=0) #, sticky='nswe')

        xpos = 0
        ypos = 0
        for z in range(zeilen):

            self.tabelle.append([])

            for s in range(spalten):

                entry = tk.Entry(self.canvas)
                entry.grid(row=z, column=s)
                self.canvas.create_window(xpos, ypos, window=entry,
                    anchor='nw')
                xpos += entry.winfo_reqwidth()
                self.tabelle[-1].append(entry)
            xpos = 0
            ypos += entry.winfo_reqheight()

        #self.canvas.config(\
            #scrollregion=(0, 0, self.canvas.cget('width'), self.canvas.cget('height')))
        yscrollbar = tk.Scrollbar(self.frame2)
        yscrollbar.grid(row=0, column=1, sticky='ns')
        yscrollbar.config(command=self.canvas.yview)
        xpos, ypos, width, height = self.canvas.bbox('all')
        self.canvas.config(width=width, yscrollcommand=yscrollbar.set)
        self.canvas.config(scrollregion=(xpos, ypos, width, height))
##       


## ... weitere methoden...


if __name__ == '__main__':

    win = tk.Tk()

    test = TkTabelle(win, 20, 4, 200)

    win.mainloop()  
Gruss wuf :wink:
Take it easy Mates!
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

Danke.

Funktioniert prima. Aber dennoch entstehen Probleme bei mir... Die werd aber sicher noch lösen...
Antworten