我是tcl \ tk的新手,我正在使用它开发UI。 UI窗口具有一个框架,该框架具有动态数量的标签和文本小部件,这些小部件根据表中的列数填充。每列都有一个条目小部件,用户在其中输入的数据会填充表中的每一列。
然而,我面临的问题是,我找不到一种方法来使窗口框架内的窗口小部件的大小和位置根据窗口的大小自行调整。也就是说,如果用户通过拖动和放大其大小来放大窗口,则窗口内的小部件也应该增大并根据窗口大小调整它们的位置。反之亦然,如果窗口大小id减小。像HTML,CSS中的bootstrap之类的东西。 任何人都可以给我任何想法? 任何帮助是极大的赞赏。谢谢!
答案 0 :(得分:0)
使用pack
,-fill
和-expand
选项可帮助您调整。{1}}和pack .widget -fill both -expand true
pack .widget -fill x -expand true -anchor s
选项
小部件对调整大小做出反应。
示例:
grid
使用-sticky
,columnconfigure
选项以及rowconfigure
和grid .widget -sticky ew
grid columnconfigure . 0 -weight 1
子命令对您有用。
示例:
<Configure>
在某些情况下,您可能需要采取特殊措施来调整大小。在这种情况下,bind命令将很有用。您可以绑定到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
请注意,在此示例中,.
也适用于.
的所有子项,因为.
是顶级窗口。如果您只对proc doresize { win } {
if { $win eq "." } {
puts "Win $win now has width: [winfo width $win]"
}
}
的更改感兴趣,可以更改调整大小过程:
bind
如果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
}
}
}
应用于不是顶级窗口的框架或窗口小部件,则仅接收该框架或窗口小部件的事件。
另请注意,您将收到所有事件。可以进一步更改以检查宽度的变化:
ORDERS(idOrder, idProduct, Qty, OrderDate)