2012-07-23 4 views
1

파이썬 2.6 및 표준 Tkinter를 사용하여 인터페이스의 레이아웃을 다시 디자인했습니다. 문제는 내가 이상한 행동을하고 있다는 것이고, 나는 Tkinter를 처음 사용하기 때문에 이것은 경험이 없기 때문에 간과 할 수있는 간단한 것일 수 있습니다. 내가 엔트리 위젯의 기본 값을 삽입 할 때Tkinter Grid Manager 문제가있는 중첩 프레임 문제

import Tkinter as tk 

root = tk.Tk() 

master = tk.Frame(root) 

frame = tk.Frame(master).grid(sticky = tk.W) 

item1 = "Label One" 
L1 = tk.Label(frame, text = item1).grid(sticky = tk.W) 

b1 = tk.Button(frame, text = "Button 1").grid(sticky = tk.W) 

find = tk.Label(frame, text = "Find").grid(sticky = tk.W) 

item = tk.Entry(frame, width = 50).grid(sticky = tk.W) 
##item.insert(0,"Enter Item to Search For") 

L2 = tk.Label(frame, text = "Label Two").grid(sticky = tk.W) 

search = tk.Button(frame, text = "Search").grid(row = 3, column = 0) 

frame2 = tk.Frame(master).grid(sticky = tk.W) 

list1 = tk.Listbox(frame2, width = 100).grid(sticky = tk.W) 

##yscroll = tk.Scrollbar(frame2,orient = tk.VERTICAL,command = list1.yview).grid(row = 5, column = 1, sticky = tk.N + tk.S + tk.W) 
yscroll = tk.Scrollbar(frame2, orient = tk.VERTICAL).grid(row = 5, column = 1, sticky = tk.N + tk.S + tk.W) 
##list1.configure(yscrollcommand = yscroll.set) 

##xscroll = tk.Scrollbar(frame2, orient = tk.HORIZONTAL, command = list1.xview).grid(sticky = tk.W + tk.E) 
xscroll = tk.Scrollbar(frame2, orient = tk.HORIZONTAL).grid(sticky = tk.W + tk.E) 
##list1.configure(xscrollcommand = xscroll.set) 

root.mainloop() 

이 다음과 같은 오류가 발생 : 여기

원하는 레이아웃을 얻기 위해 마스터 프레임 안에 어떻게 중첩하고 프레임의 몇 가지 예제 코드입니다

Traceback (most recent call last): 
    File "H:\Tkinter\Grid.py", line 17, in <module> 
    item.insert(0,"Enter Item to Search For") 
AttributeError: 'NoneType' object has no attribute 'insert' 

비슷한 오류가 예를 들어 code.These의 모든 주석 라인에서 발생하는 행동이 나는 현재 스크롤바가 내가 할 수 있기 때문에 작동하지 않을 수 있습니다 때문에 perfrom 할 필요가 있습니다 : 나는 중첩 프레임을 시작하기 전에, 그것은 일 그들에게리스트 w를 바꾸라고 말한다. 암탉 스크롤.

1. 프레임을 이와 같이 중첩하면 다른 방식으로 위젯의 변수에 액세스해야합니까?

2. 중첩 프레임을 사용하고 있고 자식과 부모가 모두 눈금을 사용하고있을 때 내 위젯 배치가 주 (master) 행과 열 수에 해당하는 이유는 무엇입니까? Y 축 스크롤 막대의 행을 보면 행 = 5, col = 1 인 마스터를 수행해야합니다. 위젯에 frame2로 설정된 부모가 있고 frame2에 그리드를 사용하기를 원하기 때문에 행 0, 열 1의 frame2 여야한다고 생각합니다. 그러나 마스터 프레임 격자를 사용하는 것 같습니다.

3. 다른 프레임에 눈금 선을 표시 할 수 있습니까?

답변

2

Tkinter을 사용하는 경우 객체를 생성하지 말고 동시에 grid을 생성해야합니다.

bad = tk.Button(frame).grid() #"bad" is None since .grid returns None 

good = tk.Button(frame) 
good.grid() 

은 특정 그리드 화 위젯에 대한 정보 (예를 들어, 셀)에서 얻을, 당신은 아마 grid_info 방법을 사용하고 싶습니다.

+0

코드를 변경하여 오류의 원인이 된 행의 주석 처리를 제거하고 이제는 오류가 발생하지 않지만 emtpy 회색 GUI가 표시됩니다. 내가 보여 주거나 보여줄 전화가 없어 졌습니까? – Brandon

+0

@ user1546099 - 결코 마스터가 아니야. 주목할 것은 위젯이 그리드의 어디에 있는지 알 수 있도록'row ='와'column ='을 여러 그리드 호출에 전달해야 할 것입니다. 각 프레임은 본질적으로 자체 그리드를 정의합니다. – mgilson

+0

그래서 나는 올바른 이름에 "master"라는 단어를 사용해서는 안된다. 그러나 루트에 그리드 관리자 레이아웃을 사용하는 것이 좋습니다. (기술적으로 마스터입니다) 원한다면 맞습니까? – Brandon