2017-07-29 53 views
0

我想從一個按鈕按下打開一個頂層部件,並從我發現的例子中在該框架內生成一個列表。然而,當我嘗試把所產生的幀中的小部件,我得到以下錯誤:不能把tkinter部件放在Toplevel框架中

_tkinter.TclError: can't put .!treeview inside .!errorexample.!toplevel.!mclistdemo.!frame.!frame 

我已經縮小的問題

self.tree.grid(IN_ = F, row = 0,column = 0,sticky = NSEW)

在_create_treeview方法中。當in_命令被移除時,在父窗口中正確地生成小部件。我懷疑這個問題與我的父母/自我命名約定有關,但我仍然在努力抓住這個問題。

我跑過的大部分問題都有類似的描述,似乎是試圖在生成它的同時放置小部件,但在這段代碼中似乎並不是這種情況。

from tkinter import * 
from tkinter import ttk 
from tkinter.font import Font 

class ErrorExample(Frame): 

    def __init__(self, parent): 
     Frame.__init__(self,parent) 
     self.grid() 
     self.parent=parent 

     self.b4=Button(
      self, 
      text="Load", 
      command=lambda: self.createWindow()) 
     self.b4.grid() 

    def createWindow(self): 
     self.t = Toplevel(self) 
     MCListDemo(self) 

class MCListDemo(ttk.Frame): 

    def __init__(self, parent, isapp=True): 
     ttk.Frame.__init__(self, parent.t) 
     self.grid() 
     self.isapp = isapp 
     self._create_widgets() 

    def _create_widgets(self): 
     if self.isapp: 
      self._create_demo_panel() 

    def _create_demo_panel(self): 
     demoPanel = Frame(self) 
     demoPanel.grid() 
     self._create_treeview(demoPanel) 
     self._load_data() 

    def _create_treeview(self, parent): 
     f = ttk.Frame(parent) 
     f.grid() 
     self.dataCols = ('country', 'capital', 'currency')   
     self.tree = ttk.Treeview(columns=self.dataCols, 
           show = 'headings') 
     self.tree.grid(in_=f, row=0, column=0, sticky=NSEW) 

start=Tk() 
ErrorExample(start) 
if __name__=="__main__": 
    main() 

回答

1

您不給樹視圖一個父項,所以它具有作爲父項的根窗口。小部件生活在一個層次結構中,而小部件不能放置在層次結構的不同部分。

的官方文檔描述了這樣的:

The master for each slave must either be the slave's parent (the default) or a descendant of the slave's parent. This restriction is necessary to guarantee that the slave can be placed over any part of its master that is visible without danger of the slave being clipped by its parent.

如果你想在樹形視圖是f,最簡單的方法就是讓f是父:

self.tree = ttk.Treeview(f, ...) 
self.tree.grid(row=0, column=0, sticky=NSEW)