2011-07-29 3 views
2

이의 나는 다음과 같은 코드가 있다고 가정하자 Tkinter의 루트에 추가 :액세스 개체는

root = Tk() 
open = Button(self.root, text='Open', command=self.open, state='disabled') 
open.pack() 
close = Button(self.root, text='Close', command=self.close, state='disabled') 
close.pack() 

나는 단지 어떤 행동이 수행되는 버튼을 사용하려면, 그래서 편집 나중에 다시 버튼을 액세스 할 필요가 상태 변수 단추를 별도의 목록에 추가하고 저장하는 대신 단추에 액세스하는 방법 또는 루트 (메뉴, 드롭 다운 목록 등)에 첨부 한 모든 개체 집합을 사용할 수 있습니다. 루트에 메서드를 호출하여?

답변

1

과 같은 작업을 수행 할 수 있습니다. pack_slaves 또는 grid_slaves을 사용하여 특정 컨테이너에서 관리하는 위젯 목록을 얻을 수 있지만 앱을 작성하는 방법에 따라 모든 위젯을 얻을 수 있다고 보장 할 수는 없습니다.

winfo_children을 사용하여 위젯의 모든 직계 하위 목록을 얻을 수도 있습니다. 중첩 된 위젯 계층 (예 : 프레임을 조직 목적의 중간 컨테이너로 사용하는 경우)을 사용하면 특정 위젯을 찾기 위해 일종의 루핑을해야 할 수 있습니다.

가장 쉽고 간단한 방법은 응용 프로그램을 클래스의 인스턴스로 만드는 것입니다. 그런 다음 위젯에 대한 참조를 클래스의 속성으로 저장할 수 있습니다. 나는이 접근법을 강력히 추천한다. 다른 방법으로는 할 수 없다. 예를 들어

:

class MyApp(Tk): 
    def __init__(self, *args, **kwargs): 
     ... 
     self.open_button = Button(...) 
     self.close_button = Button(...) 
     ... 
    def OnSomeEvent(self, event): 
     if ...: 
      self.open_button.configure(state="disabled") 
     else: 
      self.open_button.configure(state="normal") 
+0

내 응용 프로그램에서 클래스 기반 구조를 사용하고 있지만, 내가 필요한 것보다 객체에의 참조를 가지고 그냥 조심 해요. 이 반응과 다른 반응들로부터, 내가 이상적으로 좋아할만한 것 (self.root.getbuttons()와 같은 것)이 존재하지 않는 것처럼 보이기 때문에 클래스의 객체에 대한 참조를 저장하는 것이 가장 일반적인 방법 인 경우 일을하면, 나는 그 방법을 고수 할 것입니다. – heuristicus

+0

@heuristicus : 참조를 저장하는 것이 가장 일반적인 방법입니다. 그러나 _all_ widget에 대한 참조를 저장할 필요는 없으며 초기화 후에 액세스하려는 계획 만 저장할 수 있습니다. –

0

이들은 루트의 하위 사전에 있지만 키가 긴 int (C 계층의 포인터 값)를 키로 사용합니다. (가독성을 위해 DICT 값에 추가 된 줄 바꿈 포함)

> >>> from Tkinter import Tk, Button 
> >>> root=Tk() 
> >>> open=Button(root, text='Open') 
> >>> root.__dict__ 
> {'_tclCommands': ['tkerror', 'exit', '3077241668Ldestroy'], 
>  'master': None, 
>  'children': {'3077328108L': <Tkinter.Button instance at 0xb76c4cec\>}, 
>  '_tkloaded': 1, 
>  'tk': <tkapp object at 0xb76bd560\>} 
1

당신이 팩 방법을 사용하여 항목을 추가 찾기 위해 pack_slaves 방법을 사용할 수 있습니다 사용하고 있기 때문에. 그래서 그들을 반복하는 당신은 모든 위젯의 목록에 대한 루트 창을 요청하는 명확한 방법이 없습니다,

for item in root.pack_slaves(): 
    item.do_stuff() 
관련 문제