2017-09-08 13 views
0

tcl \ tk에서 새로 왔으며이를 사용하는 UI를 개발 중입니다. UI 창에는 테이블의 열 수에 따라 동적 위젯 수와 텍스트 위젯이 채워진 프레임이 있습니다. 각 컬럼에 대한 입력 위젯이 있으며, 사용자가 입력 한 데이터는 테이블의 각 컬럼을 채 웁니다.tcl tk에서 창의 크기 조정을 사용하여 창 안의 프레임, 레이블, 텍스트와 같은 위젯의 크기를 조정하는 방법 GUI

그러나 내가 직면 한 문제는 창 프레임의 위젯 크기와 위치를 창 크기에 따라 조정할 수있는 방법을 찾을 수 없다는 것입니다. 즉, 사용자가 창 크기를 끌어서 크게 확대하면 창 내부의 위젯도 크기가 커지고 창 크기에 따라 위치가 조정됩니다. 창 크기가 줄어든 경우 ID가 감소합니다. HTML, CSS의 부트 스트랩과 같은 것. 누구든지 내게 어떤 아이디어를 주시겠습니까 ?? 도움을 주시면 대단히 감사하겠습니다. 감사!

답변

0

gridpack 명령에 대한 설명서를 읽어야합니다. pack

-fill-expand 옵션을 사용하여 위젯 크기 조정에 반응하는 방식을 조정하는 데 도움이됩니다.

예 :

pack .widget -fill both -expand true 
pack .widget -fill x -expand true -anchor s 
grid으로

-sticky 옵션 columnconfigurerowconfigure 하위 명령은 당신에게 도움이 될 것입니다.

예 : 어떤 경우에는

grid .widget -sticky ew 
grid columnconfigure . 0 -weight 1 

는 크기 조정에 응시해야합니다 특별한 조치가있을 수 있습니다. 이 경우 bind 명령이 유용합니다. <Configure> 이벤트에 바인딩하고 위젯 크기를 조정하거나 필요에 따라 다른 작업을 수행 할 수 있습니다.

편집 : grid columnconfigure가 포함 된 프레임의 열에 적용

. 따라서 각 위젯에 대해 실행할 필요가 없습니다. 위의 예에서는 . 프레임에 .widget이 포함되어 있고 . 프레임의 열이 구성되어 있습니다. 이 예제는 bind..의 모든 자식에 적용

# in this example, the entry fields will adjust their width when 
# the window is resized. 
package require Tk 
grid columnconfigure . 1 -weight 1 
foreach {val} {1 2 3 4 5 6 7} { 
    ttk::label .lab$val -text "Label $val:" 
    ttk::entry .entry$val -textvariable mydata($val) 
    grid .lab$val .entry$val -in . -sticky w 
    # change the configuration for .entry$val only... 
    grid configure .entry$val -sticky ew 
} 

proc doresize { win } { 
    puts "Win $win now has width: [winfo width $win]" 
} 

bind . <Configure> [list ::doresize %W] 

주 톱 레벨 윈도우입니다. 당신이 . 변경에만 관심이 있다면, 당신은 크기 조정 절차를 변경할 수 있습니다 다음 bind 최상위 윈도우가 아닌 프레임 또는 위젯에 적용하면

proc doresize { win } { 
    if { $win eq "." } { 
     puts "Win $win now has width: [winfo width $win]" 
    } 
} 

을, 이벤트는 해당 수신된다 프레임 또는 위젯.

모두 이벤트가 전송됩니다.또한 변화 폭에 대한 변경 사항을 확인 할 수 있습니다

set vars(last.width) 0 

proc doresize { win } { 
    variable vars 

    if { $win eq "." } { 
     set newwidth [winfo width $win] 
     if { $newwidth != $vars(last.width) } { 
     puts "Win $win now has width: [winfo width $win]" 
     if { $vars(last.width) != 0 } { 
      # this is not the first time, as last.width is not zero 
      # do something due to window resize. 
     } 
     set vars(last.width) $newwidth 
     } 
    } 
} 

참고 : grid, pack, bind

+0

안녕 감사합니다! 위젯은 동적으로 구성되므로 위젯 각각에 대해 각 루프마다 구성 단계를 수행 할 수 있습니까? 또한 위젯에 크기 조정을 바인딩 할 수있는 방법을 보여줄 수 있습니까? 엄청 고마워! – UBan

+0

당신은'-sticky'와'columnconfigure'가 어떻게 작동 하는지를 배우기 위해 이것과 같은 간단한 예제를 가지고 다양한 옵션을 가지고 놀 수 있습니다. 또한'pack'을 사용하여 예제를 다시 작성하십시오. 'pack'과'grid'는 그들 만의 강점과 약점이 있습니다. 어떤 사람들은 하나를 좋아하고 어떤 사람들은 다른 사람을 좋아하고 어떤 사람들은 두 사람을 사용합니다. –

+0

고마워요! 그것은 작동합니다. – UBan