2013-07-11 6 views
0

List 객체에 Button 객체를 삽입하는 문제가 발생했습니다.
Python-Tkinter, 버튼 목록

샘플 작업 .. 내가 달성하기 위해 노력하고있어하는 것은 실제로 달성 할 수 있을지는 모르겠지만 여기있다 : 당신이 눈치

from tkinter import * 

class Main(Frame): 
    def __init__(self, master = None): 
     Frame.__init__(self, master) 
     self.pack(fill = 'both', expand = True) 

     # General purpose variables  ---------- 
     self.isButtonSelected = False 

     self.isButton_A_Selected = False # controll boolean 
     self.isButton_B_Selected = False 
     self.isButton_C_Selected = False 
     self.isButton_D_Selected = False 

     # Layers      ---------- 
     self.background = Frame(self) 

     # Buttons      ---------- 
     self.button_A = Button(self.background, text = "A", bg = 'white', command = self.selectButton_A) 
     self.button_B = Button(self.background, text = "B", bg = 'white', command = self.selectButton_B) 
     self.button_C = Button(self.background, text = "C", bg = 'white', command = self.selectButton_C) 
     self.button_D = Button(self.background, text = "D", bg = 'white', command = self.selectButton_D) 

     # Packs       ---------- 
     #layers 
     self.background.pack(fill = 'both', expand = True) 
     #buttons 
     btnPackPrefix = {'side' : 'left', 'fill' : 'both', 'expand' : 'True'} 
     self.button_A.pack(btnPackPrefix) 
     self.button_B.pack(btnPackPrefix) 
     self.button_C.pack(btnPackPrefix) 
     self.button_D.pack(btnPackPrefix) 

    def selectButton_A(self): 
     '''The idea here is similar to radiobuttons. 
      Click to select. Click same to deselect. 
      Click other to deselect old and select new. 
      Only one button can be selected at a time. 
       -repeated for all similar methods.''' 

     if self.isButtonSelected == False:   # click-select 
      self.button_A.config(bg = 'green') 
      self.isButtonSelected = True 
      self.isButton_A_Selected = True 
     else:          
      if self.isButton_A_Selected:    # click-deselect 
       self.resetButtons() 
       self.isButtonSelected = False 
      else:          # deselect other and select this 
       self.resetButtons() 
       self.button_A.config(bg = 'green') 
       self.isButtonSelected = True 
       self.isButton_A_Selected = True 

    def selectButton_B(self): 
     if self.isButtonSelected == False: 
      self.button_B.config(bg = 'green') 
      self.isButtonSelected = True 
      self.isButton_B_Selected = True 
     else: 
      if self.isButton_B_Selected: 
       self.resetButtons() 
       self.isButtonSelected = False 
      else: 
       self.resetButtons() 
       self.button_B.config(bg = 'green') 
       self.isButtonSelected = True 
       self.isButton_B_Selected = True 

    def selectButton_C(self): 
     if self.isButtonSelected == False: 
      self.button_C.config(bg = 'green') 
      self.isButtonSelected = True 
      self.isButton_C_Selected = True 
     else: 
      if self.isButton_C_Selected: 
       self.resetButtons() 
       self.isButtonSelected = False 
      else: 
       self.resetButtons() 
       self.button_C.config(bg = 'green') 
       self.isButtonSelected = True 
       self.isButton_C_Selected = True 

    def selectButton_D(self): 
     if self.isButtonSelected == False: 
      self.button_D.config(bg = 'green') 
      self.isButtonSelected = True 
      self.isButton_D_Selected = True 
     else: 
      if self.isButton_D_Selected: 
       self.resetButtons() 
       self.isButtonSelected = False 
      else: 
       self.resetButtons() 
       self.button_D.config(bg = 'green') 
       self.isButtonSelected = True 
       self.isButton_D_Selected = True 

    def resetButtons(self): 
     '''this pretty much resets all buttons and controll booleans 
      to their default state''' 
     #A 
     self.button_A.config(bg = 'white') # paint button white 
     self.isButton_A_Selected = False # controll boolean reset 
     #B 
     self.button_B.config(bg = 'white') 
     self.isButton_B_Selected = False 
     #C 
     self.button_C.config(bg = 'white') 
     self.isButton_C_Selected = False 
     #D 
     self.button_D.config(bg = 'white') 
     self.isButton_D_Selected = False 


def run_Application(): 
    app = Main() 
    app.master.geometry('200x50') 
    app.mainloop() 

run_Application() 

내 코드는 저작권법과 많이있다 각 내용이 변경된 붙여 넣은 스 니펫
그래서 어떻게 든 더 짧게 만들 필요가 있습니다.이 모든 동작을 제어하는 ​​1 개의 함수가 필요합니다.
이 둘은 비슷하기 때문에 마찬가지입니다.

나는 이것을 생각해 냈습니다.

작동하지 샘플 :

from tkinter import * 

class Main(Frame): 
    def __init__(self, master = None): 
     Frame.__init__(self, master) 
     self.pack(fill = 'both', expand = True) 

     # General purpose variables  ---------- 
     self.isButtonSelected = False 

     self.isButton_A_Selected = False # controll boolean 
     self.isButton_B_Selected = False 
     self.isButton_C_Selected = False 
     self.isButton_D_Selected = False 

     # Layers      ---------- 
     self.background = Frame(self) 

     # Buttons      ---------- 
     self.button_A = Button(self.background, text = "A", bg = 'white', command = self.selectButton(0)) # apparently this doesn't work... 
     self.button_B = Button(self.background, text = "B", bg = 'white', command = self.selectButton(1)) 
     self.button_C = Button(self.background, text = "C", bg = 'white', command = self.selectButton(2)) 
     self.button_D = Button(self.background, text = "D", bg = 'white', command = self.selectButton(3)) 

     # Packs       ---------- 
     #layers 
     self.background.pack(fill = 'both', expand = True) 
     #buttons 
     btnPackPrefix = {'side' : 'left', 'fill' : 'both', 'expand' : 'True'} 
     self.button_A.pack(btnPackPrefix) 
     self.button_B.pack(btnPackPrefix) 
     self.button_C.pack(btnPackPrefix) 
     self.button_D.pack(btnPackPrefix) 

    def selectButton(self, i = None): 
     '''The idea here is similar to radiobuttons. 
      Click to select. Click same to deselect. 
      Click other to deselect old and select new. 
      Only one button can be selected at a time. 
       -do that only on objects 
       at [i]. 'i' is given from the button command''' 

     global buttons, btn_bools 

     buttons = [self.button_A, self.button_B, 
        self.button_C, self.button_D] # list buttons. # Raises error. It seems that Button objects cannot be listed 

     btn_bools = [self.isButton_A_Selected, self.isButton_B_Selected, 
        self.isButton_C_Selected, self.isButton_D_Selected] # list contoll booleans 

     if self.isButtonSelected == False:   # click-select 
      self.buttons[i].config(bg = 'green') 
      self.isButtonSelected = True 
      self.btn_bools[i] = True 
     else:          
      if self.isButton_A_Selected:    # click-deselect 
       self.resetButtons() 
       self.isButtonSelected = False 
      else:          # deselect other and select this 
       self.resetButtons() 
       self.buttons[i].config(bg = 'green') 
       self.isButtonSelected = True 
       self.btn_bools[i] = True 

    def resetButtons(self): 
     '''iterate through all buttons/controll booleans 
      and reset to their default state''' 

     for b in range(len(buttons)): 
      buttons[b].config(bg = 'white') 

     for bb in range(len(btn_bools)): 
      btn_bools[bb] = False 



def run_Application(): 
    app = Main() 
    app.master.geometry('200x50') 
    app.mainloop() 

run_Application() 

가 나는 Int 인 속성을 포함하고
그것을 완벽하게 일 '간단한'클래스와 유사한 방법을 테스트하기 위해 노력!

오류 보고서에서 불가능한 항목이 아니라면 그 목록 버튼은 좋은 생각이 아닙니다.

나는 어떤 예나 비슷한 문제에 대해서도 구글을 많이 찾았지만, 그렇지 않았다.
좋은 결과를 얻는다.

나는 파이썬에서 포인터 구현을 검색했고
도 혼란 스럽다.
단추를 가리키는 변수를 저장할 수 있는지 확인하려고했지만 그 결과가 같다고 생각합니다. List는 개체를 단추로 읽고
발생합니다. 오류가 발생합니다.

내 질문은 다음과 같습니다.
1. 어떻게해도 될 수 있습니까? (첫 번째 코드 샘플을 상당히 짧게합니다.)
2. 목록 정보 버튼 또는 위젯 일반 : 수행 할 수 있다면 어떻게? 그렇지 않다면 왜?
3. 두 번째 코드 샘플에서 내 함수에 필요한 'i'인수
을 포함하는 버튼 명령이 필요합니다. 어떻게 입력 할 수 있습니까? 그냥 (i)을 더하는 것이 효과가없는 것 같습니다.

미리 감사드립니다.

답변

1

코드 줄을 봐 : 무슨 일

self.button_A = Button(..., command = self.selectButton(0)) 

? self.selectButton(0)의 기능은 무엇입니까? 함수 인 self.selectButton(0)을 호출하면 해당 함수의 결과가 command 특성의 값으로 사용됩니다. 이것은 거의 당신이 의도 한 것이 아닙니다. 버튼을 실제로 클릭 할 때까지이 self.selectButton에 전화를 연기

self.button_A = Button(..., command = lambda: self.selectButton(0)) 

: 당신이 대신해야 할 일은

이의 라인을 따라 무언가이다.문제가있는 버튼이 정의 된 _before_ 파이썬이 기능을 실행하려고했던 것이 었습니다 그래서 ..

self.buttons = [self.button_A, self.button_B, self.button_C, self.button_D] 
+0

아 내가 볼이 이제 버튼이 생성 될 수 있습니다, 그리고 만약 당신이 좋아하면 당신은 목록에 할당 할 수 있습니다 . 나는 아직 _lambdas_를 사용하지 않았기 때문에 독서를 시작할 때가되었습니다! 고마워요! 지금 큰 일을하고 있습니다! –