【问题标题】:Why does my tkinter thinks I have both grid and pack as layout managers?为什么我的 tkinter 认为我同时拥有 grid 和 pack 作为布局管理器?
【发布时间】:2021-01-15 12:10:11
【问题描述】:

这是主框架的当前布局:frame -- sub_frame2 -- Notebook --(2 个标签作为框架,一个称为 markit_tab,另一个称为 param_tab)。

问题:

即使我只对 param_tab(第二个选项卡)使用包布局管理器,我也会收到此错误 _tkinter.TclError: cannot use geometry manager pack inside .!frame.!frame2.!notebook.!frame2 which already has slaves managed by grid 用于行 self.scrollbar_par.pack(side="right",fill="y") 这没有意义,因为我将 pack 用于 markit_tab 以及上一行我将 pack 用于同一帧并且它没有给我错误。

我将该行更改为 grid(row,column),然后出现此错误:_tkinter.TclError: cannot use geometry manager grid inside .!frame.!frame2.!notebook.!frame2 which already has slaves managed by pack

这对我来说真的没有意义。我怎么可能使用 2 个不同的几何管理器,所以都不让我创建新的东西?

然后

       self.sub_frame2 = tk.Frame(self.frame)
       
       nb = ttk.Notebook(self.sub_frame2)
       
       #Middle Frame including first and second tabs.
       
       # first tab
       self.markit_tab = ttk.Frame(nb)
        
       self.canvas = Canvas(self.markit_tab, bg="white")
       self.table_frame=Frame(self.canvas)
       self.scrollbar=Scrollbar(self.markit_tab ,orient="vertical",command=self.canvas.yview)
       self.canvas.configure(yscrollcommand=self.scrollbar.set)

       
       self.table_frame.pack(side="left", fill ='both')
       self.scrollbar.pack(side="right",fill="y")
       self.canvas.pack(fill='both')
       self.canvas.create_window((0,0),window=self.table_frame,anchor='nw')
       self.table_frame.bind("<Configure>", self.canvas_configure)
       

       # second tab
       self.param_tab = ttk.Frame(nb)

       self.canvas_par = Canvas(self.param_tab, bg="white")
       self.table_frame_par =Frame(self.canvas_par)
       self.scrollbar_par =Scrollbar(self.param_tab ,orient="vertical",command=self.canvas_par.yview)
       self.canvas_par.configure(yscrollcommand=self.scrollbar_par.set)
    

       self.table_frame_par.pack(side="left", fill ='both')
       #self.scrollbar.grid(row=0,column=1)
       self.scrollbar_par.pack(side="right",fill="y")
       self.canvas_par.pack(fill='both')
       self.canvas_par.create_window((0,0),window=self.table_frame_par,anchor='nw')
       self.table_frame_par.bind("<Configure>", self.canvas_configure)
   
       nb.add( self.markit_tab, text='Markit')
       nb.add(self.param_tab, text='Param')
       nb.grid(rows=1)

完全错误:

 File ".\single_stocks_project.py", line 520, in <module>
   app = MainApplication(root)
 File ".\single_stocks_project.py", line 142, in __init__
   self.scrollbar.grid(row=0,column=1)
 File "C:\Anaconda3\lib\tkinter\__init__.py", line 2226, in grid_configure
   + self._options(cnf, kw))
_tkinter.TclError: cannot use geometry manager grid inside .!frame.!frame2.!notebook.!frame which already has slaves managed by pack ```

【问题讨论】:

  • 在任何地方都试过单独使用pack()
  • 删除self.scrollbar.grid(row=0,column=1)这一行
  • 这实际上在原始代码中被注释掉了。我编辑了上面的代码。
  • @CoolCloud 我使用网格,但对于其他框架,它们不应该对此有任何影响。您还可以看到 markit_tab 不受影响,而 param_tab 即使它们实际上是相同的代码。
  • 请发布整个错误代码。

标签: python tkinter


【解决方案1】:

self.canvasself.scrollbar 都使用 self.markit_tab 作为它们的主人。你打电话给self.canvas.pack(fill='both'),这意味着self.markit_tab正在使用pack来管理它的slave。

【讨论】:

  • 但是 self.markit_tab 没有给出任何错误并且可以正常工作。这是另一个名为 self.param_tab 的选项卡,这对我来说没有意义,因为 self.markit_tab 具有与 self.param_tab 相同的代码结构。如果其中一个出错,另一个也应该出错
  • @lalalal:您询问了为什么会出现错误。这解释了错误。我不知道如何更简单地解释它。具有共同主控的两个小部件不能同时使用packgrid。您将pack 与画布一起使用,因此您不能将grid 与滚动条一起使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-27
  • 2011-04-11
  • 1970-01-01
  • 2017-07-15
  • 1970-01-01
相关资源
最近更新 更多