如何通过调整 tcl tk GUI 中 window 的大小来调整 window 内的框架、标签、文本等小部件的大小

How to adjust size of widgets like frame,label,text inside a window with resizing of the window in tcl tk GUI

我是 tcl\tk 的新手,我正在使用它开发 UI。 UI window 有一个框架,其中根据 table 中的列数填充了动态数量的标签和文本小部件。每列都有一个条目小部件,用户在其中键入的数据填充 table.

中的每一列

但是我面临的问题是,我无法找到一种方法让 window 中框架内的小部件的大小和位置根据 window 的大小自行调整].也就是说,如果用户通过拖动和放大 window 的大小来放大 window,window 内的小部件也应该增加大小并根据 window 大小调整它们的位置。如果 window 尺码 ID 减少,反之亦然。类似于 HTML、CSS 中的 bootstrap。 任何人都可以给我任何想法吗? 任何帮助是极大的赞赏。谢谢!

您需要阅读有关 grid and pack 命令的文档。

对于 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 包含在 . 框架中,并且配置了 . 框架的列。

# 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 也适用于 . 的所有子级,因为 . 是顶级 window。如果您只对 . 的更改感兴趣,您可以更改调整大小的过程:

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

如果 bind 应用于非顶级框架或小部件 window,则仅接收该框架或小部件的事件。

另请注意,您将收到所有 事件。可以进行进一步的更改以检查宽度的变化:

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