Python Tkinter scrollbar in multiple tabs

独自空忆成欢 提交于 2019-12-13 22:23:31

问题


I learned how to make a scrollable frame by embedding the frame in a canvas and then adding a scrollbar to it like this:

def __add_widget_features(self, feat_tab):
    table_frame = ttk.Frame(feat_tab)
    table_frame.pack(fill=BOTH, expand=True)
    self.__make_grid(table_frame)

    ####subframe####              
    self.canvas = Canvas(table_frame, borderwidth=0, background="#ffffff")
    self.frame = LabelFrame(self.canvas, background="#ffffff", text="Timetable")
    self.vsb = ttk.Scrollbar(table_frame, orient="vertical", command=self.canvas.yview)
    self.canvas.configure(yscrollcommand=self.vsb.set)

    self.vsb.pack(side="right", fill="y")
    self.canvas.pack(side="right", fill="both", expand=True)
    self.canvas.create_window((4,4), window=self.frame, anchor="nw", 
                              tags="self.frame")

    self.frame.bind("<Configure>", self.OnFrameConfigure)

My program has a gui that creates multiple tabs. The scrollable canvas works great in one tab, but when I try to add the same code to a second a tab, the scrollbar doesn't work on that tab. If I comment out the code block on the first tab, it works fine on the other one. I've already tried naming all of the elements of the second tab something different (in case that was the problem) and I've tried taking out the "self." part of the names but none of that helped. I'm quite new to Python so I'm sure I'm missing something simple. I tried posting a picture of the problem but my rep isn't high enough yet. Any help would be great.

UPDATE: per Brionius's suggestion, here's the function for creating the notebook:

def __add_widget_datawindow(self):
    '''(FordTIPGui) -> NoneType
    Populate the data_window with widgets.
    '''

    # add data_window frame
    data_frame = ttk.Frame(self.data_window)
    data_frame.pack(fill=BOTH, expand=True)
    self.__make_grid(data_frame)
    self.add_menubar(self.data_window, "other") # add menubar

    # add subframes and make them into a grid
    button_frame = ttk.Frame(data_frame)
    button_frame.grid(row=9, column=0, rowspan=1, columnspan=10,sticky=W+E+N+S)
    self.__make_grid(button_frame)
    nb_frame = ttk.Frame(data_frame)
    nb_frame.grid(row=0, column=0, rowspan=9, columnspan=10, sticky=W+E+N+S)

    ## add widgets to subframes ##

    # button_frame
    disc_button = ttk.Button(button_frame, text="Disconnect", command=lambda:self.disconnect())
    disc_button.grid(row=10, column=0, columnspan=1, sticky=W+E+N+S)

    # nb_frame
    nb = ttk.Notebook(nb_frame) # create notebook
    nb.pack(fill=BOTH, expand=True)

    # create frames for tabs
    tab_frame1 = ttk.Frame(nb)
    tab_frame2 = ttk.Frame(nb)
    tab_frame3 = ttk.Frame(nb)
    tab_frame4 = ttk.Frame(nb)
    tab_frame5 = ttk.Frame(nb)
    self.__make_grid(tab_frame1)
    self.__make_grid(tab_frame2)
    self.__make_grid(tab_frame3)
    self.__make_grid(tab_frame4)
    self.__make_grid(tab_frame5)

    # add tabs
    nb.add(tab_frame1, text='Confidential1 View')
    nb.add(tab_frame2, text='Confidential2 View')
    nb.add(tab_frame3, text='Confidential3 View')
    nb.add(tab_frame4, text='Confidential4 View')
    nb.add(tab_frame5, text='Confidential5 View')

    # add widgets
    self.__add_widget_group(tab_frame1)
    self.__add_widget_feature(tab_frame2)
    self.__add_widget_signal(tab_frame3)
    self.__add_widget_features(tab_frame4)
    self.__add_widget_timetable(tab_frame5)

pic of the problem: http://www.use.com/supersize.pl?set=3059c6e412c1416578a7


回答1:


You are probably doing something wrong with the parent/child relationships. Look at this code:

def __add_widget_timetable(self, timetable_tab):
    table_frame = ttk.Frame(feat_tab)
    table_frame.pack(fill=BOTH, expand=True)
    self.__make_grid(table_frame)

Notice how you're passing in a frame (timetable_tab), creating another tab (table_frame), and putting that created frame in some other frame (feat_tab).

Something seems rather wrong. My guess is that table_frame should be a child of timetable_tab.



来源:https://stackoverflow.com/questions/18254813/python-tkinter-scrollbar-in-multiple-tabs

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!