Python Tkinter Tix: How to use ScrolledWindow with grid in Tix NoteBook

Sano98 picture Sano98 · Apr 4, 2010 · Viewed 7.6k times · Source

I'm adding several widgets to a Frame which is located in a tix.NoteBook. When there are too much widgets to fit in the window, I want to use a scrollbar, so I put tix.ScrolledWindow inside that Frame and add my widgets to this ScrolledWindow instead.

The problem is that when using the grid() geometry manager, the scrollbar appears, but it is not working (The drag bar occupies the whole scroll bar).

from Tkinter import *
import Tix

class Window:

    def __init__(self, root):

        self.labelList = []
        self.notebook = Tix.NoteBook(root, ipadx=3, ipady=3) 
        self.notebook.add('sheet_1', label="Sheet 1", underline=0) 
        self.notebook.add('sheet_2', label="Sheet 2", underline=0)
        self.notebook.add('sheet_3', label="Sheet 3", underline=0)
        self.notebook.pack()
        #self.notebook.grid(row=0, column=0)

        tab1=self.notebook.sheet_1
        tab2=self.notebook.sheet_2
        tab3=self.notebook.sheet_3



        self.myMainContainer = Frame(tab1)
        self.myMainContainer.pack()
        #self.myMainContainer.grid(row=0, column=0)

        scrwin = Tix.ScrolledWindow(self.myMainContainer, scrollbar='y') 
        scrwin.pack()
        #scrwin.grid(row=0, column=0) 
        self.win = scrwin.window


        for i in range (100):
            self.labelList.append((Label(self.win)))
            self.labelList[-1].config(text= "Bla", relief = SUNKEN)
            self.labelList[-1].grid(row=i, column=0, sticky=W+E)

root = Tix.Tk()
myWindow = Window(root)

root.mainloop()

Whenever I change at least one of the geometry managers from pack() to grid(), the problem occurs. (Actually, I'd prefer using grid() for all containers.)

When I don't use the NoteBook widget, the problem does not occur either. The other examples here all seem to rely on pack(). Any ideas?
Many thanks,
Sano

Answer

Sano98 picture Sano98 · Apr 8, 2010

I solved it without using ´tix.scrolledWindow´. Instead, I went for the autoscrollbar suggested by Fred Lundh here. The main problem was the adaption to the NoteBook widget. First, I tried to put the scrollbar to the root, so that they would surround the whole window. Now, I wanted to change the hook for the scrollbar whenever I changed a tab, but the ´raisecmd´ of the Notebook did not work. Next, I thought of using the configure event on each tab - whenever a new tab is raised, its size changes and configure is called.
Well, after much trying without ever being satisfied I changed my approach and put the scrollbars inside of the tabs. The tabs and all subcontainers must get the ´grid_columnconfigure(0, weight=1)´ and ´grid_rowconfigure(0, weight=1)´ settings, or else they will not grow with the tabs.