【问题标题】:Python Tkinter scrollbar in multiple tabs多个选项卡中的 Python Tkinter 滚动条
【发布时间】:2013-08-17 18:25:54
【问题描述】:

我学会了如何通过将框架嵌入到画布中来制作可滚动的框架,然后像这样向其中添加滚动条:

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)

我的程序有一个创建多个选项卡的 gui。可滚动画布在一个选项卡中效果很好,但是当我尝试将相同的代码添加到第二个选项卡时,滚动条在该选项卡上不起作用。如果我在第一个选项卡上注释掉代码块,它在另一个选项卡上工作正常。我已经尝试将第二个选项卡的所有元素命名为不同的名称(以防出现问题),并且尝试取出“自我”。部分名称,但没有任何帮助。我对 Python 很陌生,所以我确定我缺少一些简单的东西。我尝试发布问题的图片,但我的代表还不够高。任何帮助都会很棒。

更新:根据 Brionius 的建议,创建笔记本的功能如下:

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)

问题图片:http://www.use.com/supersize.pl?set=3059c6e412c1416578a7

【问题讨论】:

  • 既然您说问题与(我假设是)ttk Notebook 中的多个选项卡有关,您可能必须向我们展示涉及多个选项卡的代码;我没有看到这里的代码有任何明显错误。另外,回复:发布图片,您也可以使用tinypic 之类的内容并发布链接。
  • 好的,从图片上看,我猜你指的问题是第二帧上的滚动条看起来不活动/变灰了?第二批代码中调用的第一批代码在哪里?函数__make_grid中的第一组代码是什么?根据您发布的 sn-ps,仍然很难将发生的事情放在一起。
  • 对不起,第一个代码块在 self.__add_widget_features(tab_frame4) 和 self.__add_widget_timetable(tab_frame5) 中调用。它在 frame_5 中有效,但在 frame_4 中无效。如果我注释掉frame_5中的第一个代码块,那么frame_4中的滚动条是活动的
  • __make_grid 是做什么的?
  • 它默认配置一个 10x10 的网格。我从同事以前的项目中获得了这段代码,并开始修改它以满足我的需求,所以我只是按照她创建网格的方式。我最初虽然 __make_grid 是一个 tk 函数,所以我不确定为什么网格会以这种方式实例化,但它似乎工作正常。我在网格中添加小部件以使其大于 10x10(尝试 39x203) 没有问题

标签: python canvas tkinter scrollbar tk


【解决方案1】:

您可能在父/子关系方面做错了什么。看这段代码:

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)

注意您是如何传入一个框架 (timetable_tab)、创建另一个选项卡 (table_frame) 并将创建的框架放入其他框架 (feat_tab) 的。

似乎有些不对劲。我的猜测是table_frame 应该是timetable_tab 的孩子。

【讨论】:

  • 这是一个粘贴错误。我确实在功能选项卡中将 table_frame 作为 feat_tab 的子项,然后在我的时间表函数中将另一个 table_frame 作为 timetable_tab 的子项
  • @user979489:如果您希望我们帮助解决问题,您需要发布解决问题的实际代码。我们如何知道哪些错误是复制/粘贴错误,哪些是真正的问题?
  • 很抱歉。我复制了我的代码并粘贴了它,但错过了第一行,然后从我的代码的错误部分复制了它。只是一个错误......我在问题中纠正了它。问题中的代码是我遇到问题的实际代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-23
  • 2020-11-09
  • 2020-07-05
相关资源
最近更新 更多