2012-06-29 4 views
0

처음에는 코드 길이에 대해 사과하지만 나는 모두 보여주고 싶었습니다. 'n'엔트리 위젯에 변수 저장 Tkinter 인터페이스

Table interface

나는 "목록"나는 옵션에 추가합니다 세 번째 옵션 메뉴를 변경

가 'N'값 (도시하지 않음) 가지고 :

나는이처럼 보이는 인터페이스를 가지고있다. 그런 다음 사용자가 값을 입력 할 수있는 곳에 'n'열이 필요합니다.

또한 인터페이스에 의해 열린 텍스트 파일에 따라 'n'개의 행이있을 수있는 문제가 있습니다.

따라서 가능한 경우 (상자에서 동일한 값을 반복하지 않고 'n'열이 필요함) 궁극적으로 '행'및 '열'을 추가하는 것이 궁금합니다. 4 개의 열을 추가합니다. 행의 양을 읽을 수는 있지만 행의 수에 따라이 값을 모두 반환하는 데 문제가 있습니다. 지금까지 한 행을 할 수 있습니다 ..

고마워요!

def numberwritten(number): 
    fg = number.get() 
    print fg 

numbers = [StringVar() for i in xrange(4) ] #Name available in global scope. Need to add other rows? 
for i in numbers: 
    i.trace('w',lambda a,b,c,n=i: numberwritten(n)) 


def ChoiceBox(choice): 


    co_ord = str(frame_table.grid_size()) 
    col, rows = map(float, co_ord.strip('()').split(',')) 
    rows = int(rows) 
    if choice == "Fixed": 
     empty1.destroy() 
     #choice_frame.grid_forget()  
     tkMessageBox.showinfo("Message", "No optimisation, value fixed.") 
    elif choice == "List": 
     column = 7 
     for i in xrange(4): 
     choice_title = Label(frame_table, text='Value %g'% float(i+1), bg='white', borderwidth=0, width=10) 
      choice_title.grid(row=1, column=column+i, sticky="nsew", padx=1, pady=1) 
      boxes=[] 

     for i in xrange(4): 
      for j in range(2, rows): 
       box=Entry(frame_table,bg='white',borderwidth=0,textvariable=numbers[i], width=10, justify="center") # Here I'm having problems with rows 
       box.grid(row=j,column=column+i, sticky='nsew', padx=1, pady=1) 
     boxes.append(box) 
     box1,box2,box3,box4=boxes 


    elif choice == "Interval" or "Optimisation": 
     for i in xrange(2): 
      choice_title1 = Label(frame_table, text='Min Value', bg='white', borderwidth=0) 
      choice_title1.grid(row=0, column=column, sticky="nsew", padx=1, pady=1) 
      choice_title2 = Label(frame_table, text='Max Value', bg='white', borderwidth=0) 
      choice_title2.grid(row=0, column=column+1, sticky="nsew", padx=1, pady=1) 

      boxes=[] 

     for i in xrange(2): 
      box=Entry(frame_table,bg='white',borderwidth=0,textvariable=numbers[i]) 
      box.grid(row=rows+1,column=i, sticky='ew', padx=1, pady=1) 
      boxes.append(box) 
      box1,box2,box3,box4=boxes 

업데이트 : 나는 약간 전진 한 및 클래스 창에서 지금] 선택의 섹션 :] 선택 (자동, 선택), 내가 동의하는 주석 라인을 변경할 필요로하는 곳에 나는 다음과 같은 섹션이 'n'개의 상자.

column = 7 
     for i in xrange(self.number_boxes): 
      choice_title = Label(self.frame_table, text='Value %g'% float(i+1), bg='white', borderwidth=0, width=10) 
      choice_title.grid(row=1, column=column+i, sticky="nsew", padx=1, pady=1) 
     boxes=[] 

     for i in xrange(self.number_boxes): 
      for j in range(2, rows): 
       box=Entry(self.frame_table,bg='white',borderwidth=0,textvariable=numbers[i], width=10, justify="center") 
       box.grid(row=j,column=column+i, sticky='nsew', padx=1, pady=1) 
      boxes.append(box) 
     #box1,box2,box3,box4=boxes 

I 계속하지만 다음 완전히 바람직 각 행에 대해, 값들의 목록을 추출하는 예를 원래의 코드의 처음 몇 줄 포함 numberwritten를 사용하는 문제가있다.

+0

'두 번째 옵션 메뉴를'목록 '으로 변경하면 실제로 세 번째 옵션 메뉴 ("선택 항목"열에 있음)를 의미합니까? 또한 몇 개의 열을 추가 할 수 있습니까? 당신은 "n"이라고 말합니다. "n"을 100으로 할 수 있습니까? "n"이 단지 몇 가지 이상일 수 있다면이 솔루션은 유용성 관점에서 잘 확장되지 않습니다. –

+0

죄송합니다. 세 번째로 질문을 편집했습니다. n은 엄청나게 많지 않을 것입니다. 어쩌면 최대 20 대 정도입니다. – user2063

+0

열 (column) 당 매우 보수적 인 100 픽셀을 사용하면 폼 너비에 2000 픽셀을 추가하는 것에 대해 알 수 있습니다. 이 길로 가고 싶습니까? –

답변

1

아직 인터페이스를 표현하는 가장 쉬운 방법을 찾았다 고 확신하지는 않지만 원하는 것을 수행하는 것은 비교적 간단합니다.

개념적으로 값 편집을위한 항목을 추가하려면 값의 모델 역할을하는 개체를 정의하고 참조를 저장해야합니다. 그런 다음 해당 값을 조작 할 위젯 (또는 위젯)을 정의합니다. 그런 다음 필요에 따라 이러한 키 바인딩을 추가합니다 (종종 없음, 기본값은 꽤 좋습니다). 마지막으로 위젯을 전체 사용자 인터페이스에 추가합니다 (예 : grid 메소드 사용). 그러나 이는 크기가 고정되어 있지 않은 모델을 처리하기위한 전체 코드를 설계하기 위해 이 있음을 의미합니다. 물론 항목을 제거하는 것은 그 반대의 과정입니다.

코드를 코드를 리팩토링하여이 전체 작업을 더 작은 조각으로 리팩터링하는 것이 좋습니다. 예를 들어, 모델을 작성하고 항목 위젯을 작성하여 해당 위젯을 GUI에 추가하고 모델 오브젝트를 리턴하십시오. 그런 결합 된 항목을 만드는 데 필요한 다른 모든 곳에서이 전문가 기능에 대해 작업을 수행하도록 요청할 수 있으므로 번만 수행하면이됩니다. 매우 명확하게 정의 된 작업을 통해 더 작은 조각으로 작업을 나누면 위젯 관리에 대한 (길고 지루한) 세부 사항으로 인해 점점 더 복잡한 로직 측면에 집중하는 것이 훨씬 쉬워집니다.