2013-10-23 3 views
1

Tk()로 만든 루트 창의 자식으로 작동하는 코드 예제를 웹에서 가져 왔습니다. 내가 Toplevel()의 자식으로 내 목적을 위해 일반화하려고하면 스크롤바를 Toplevel(). Frame()에 넣을 수 없다는 오류가 발생합니다. 나는 왜 Tk()와 Toplevel()이 비슷한 결과를 산출했는지에 대한 이유를 알 수 없다.Python ttk Toplevel()의 자식으로 스크롤 막대 오류가 발생했지만 Tk()의 ​​자식으로 작동합니다.

정확한 오류 메시지는 다음과 같습니다

_tkinter.TclError: can't put .19084144 inside .18651952.19084112 or... can't put scrollbar inside Toplevel().Frame()

from tkinter import * 
from tkinter.ttk import * 

class columnList(object): 
    def __init__(self,parent,header,dataList): 
     self.tree = None 
     self._setup_widgets(parent,header) 
     self._build_tree(header,dataList) 

    def _setup_widgets(self,parent,header): 
     treeFrame = Frame(parent) 
     treeFrame.pack(fill='both', expand=True) 
     # create a treeview with a vertical scrollbar 
     self.tree = Treeview(treeFrame, columns=header, show="headings") 
     vsb = Scrollbar(orient="vertical",command=self.tree.yview) 
     self.tree.configure(yscrollcommand=vsb.set) 
     self.tree.grid(column=0, row=0, sticky='nsew', in_=treeFrame) 
     vsb.grid(column=1, row=0, sticky='ns', in_=treeFrame) 
     treeFrame.grid_columnconfigure(0, weight=1) 
     treeFrame.grid_rowconfigure(0, weight=1) 

    def _build_tree(self,header,dataList): 
     for col in header: 
      self.tree.heading(col, text=col.title()) 
     for item in dataList: 
      self.tree.insert('', 'end', values=item) 
# the test data ... 
oil_header = ['oil', 'filter', 'cost'] 
oil_list = [ 
('synthetic', 'paper', '63.38') , 
('natural', 'reusable', '47.59') ] 
car_header = ['car', 'repair', 'cost', 'code'] 
car_list = [ 
('Hyundai', 'brakes', '273.80', '34') , 
('Honda', 'light', '85.70', '78')] 

root = Tk() 
top = Toplevel() 

# this succeeds 
invoiceMenu = columnList(root,car_header,car_list) 
# this fails as 
# _tkinter.TclError: can't put .19084144 inside .18651952.19084112 
# or... can't put scrollbar inside Toplevel().Frame() 
oilChangeMenu = columnList(top,oil_header,oil_list) 
root.mainloop() 

나는 광범위하게 많은 것을 배울 유래를 사용하고 아주 많이는 여기에 전문 지식의 놀라운 재산을 주셔서 감사합니다. 솔직히, 나는 이걸 알아낼 수 없다는 것을 당황스럽게 생각합니다. 귀하가 제공 할 수있는 도움을 미리 기대해 주셔서 감사합니다.

+0

신고하는 정확한 오류를 나타내는 코드 줄을 표시 할 수 있습니까? 나는 그 오류를 줄 수있는 코드를 보지 못했습니다. 또한 코드 줄은 하나의 오류 만 표시하므로 두 가지 오류 중 하나를 제공 할 때 어떤 의미인지 명확하지 않습니다. 정확한 스택 추적을 표시하는 것이 도움이 될 수 있습니다. –

+1

정확히 @BryanOakley입니다. 수정 된 코드 행은 입니다. vsb = Scrollbar (parent, orient = "vertical", command = self.tree.yview) 나는 겸손하고 (어리석은) 느낌이 들었다. 나는이 기회에 브라이언 (Bryan)에 대해, 당신의 반응이 나를 (그리고 다른 사람들을) 돕기 위해 더 많은 일을했다는 점을 충분히 강조 할 것입니다. 고마워, 크리스. – Kristo

답변

1

질문에 세부 사항이 충분하지 않지만 스크롤바를 만들 때 parent 인수를 제공하지 않는 것이 원인 일 수 있습니다. 즉, 스크롤바는 항상 루트 창에 생성됩니다. 그런 다음 다른 최상위 레벨에 배치하려고하면보고 한 것과 유사한 오류가 발생합니다.