Tcl Windows中的网格几何体不';不要限制大小调整

Tcl Windows中的网格几何体不';不要限制大小调整,tcl,tk,Tcl,Tk,windows XP中的网格化顶级窗口似乎没有限制用户以数字的倍数调整大小。它在X中工作,但在Windows中不工作。我可以调整到任何像素大小 Windows管理器不支持它吗?我可以手动执行吗?也许可以将一些命令绑定到顶级的resize事件?您可以说它在Windows上不起作用(对于Mac OS X/Aqua也是如此),这是因为窗口管理器本身不支持该功能。你必须用一些脚本来合成它。然而真正复杂的是一个典型的网格窗口不仅仅是一个网格窗口;它周围有一些额外的空间,可以使更新后的大小进入下一个网格大小

windows XP中的网格化顶级窗口似乎没有限制用户以数字的倍数调整大小。它在X中工作,但在Windows中不工作。我可以调整到任何像素大小


Windows管理器不支持它吗?我可以手动执行吗?也许可以将一些命令绑定到顶级的resize事件?

您可以说它在Windows上不起作用(对于Mac OS X/Aqua也是如此),这是因为窗口管理器本身不支持该功能。你必须用一些脚本来合成它。然而真正复杂的是一个典型的网格窗口不仅仅是一个网格窗口;它周围有一些额外的空间,可以使更新后的大小进入下一个网格大小,这使窗口扩大一点,并再次调整大小…一次又一次

因此,我们需要两个阶段的初始化,首先测量我们必须允许的额外空间的实际大小,然后应用强制代码

package require Tk

proc initGrid {window w h} {
    # Do nothing for subwindows
    if {$window ne [winfo toplevel $window]} return

    lassign [wm grid $window] xcount ycount xstep ystep
    set wExtra [expr {$w - $xcount*$xstep}]
    set hExtra [expr {$h - $ycount*$ystep}]
    bind $window <Configure> [list resizeGrid $wExtra $hExtra %W %w %h]
}
proc resizeGrid {wExtra hExtra window w h} {
    # Do nothing for subwindows
    if {$window ne [winfo toplevel $window]} return

    lassign [wm grid $window] xcount ycount xstep ystep
    if {$w-$wExtra != $xcount*$xstep || $h-$hExtra != $ycount*$ystep} {
        set w [expr {($w - $wExtra)/$xstep}]
        set h [expr {($h - $hExtra)/$ystep}]
        wm grid $window $w $h $xstep $ystep
    }
}

pack [text .t -setgrid 1] -fill both -expand 1
bind . <Configure> {initGrid %W %w %h}
包需要Tk
proc initGrid{window w h}{
#不为子窗口执行任何操作
如果{$windowne[winfo顶级$window]}返回
lassign[wm grid$WINDOWN]xcount ycount xstep ystep
set wExtra[expr{$w-$xcount*$xstep}]
set hExtra[expr{$h-$ycount*$ystep}]
绑定$window[列表大小调整网格$wExtra$hExtra%W%W%h]
}
proc resizeGrid{wExtra hExtra窗口w h}{
#不为子窗口执行任何操作
如果{$windowne[winfo顶级$window]}返回
lassign[wm grid$WINDOWN]xcount ycount xstep ystep
如果{$w-$wExtra!=$xcount*$xstep | |$h-$hExtra!=$ycount*$ystep}{
集合w[expr{($w-$wExtra)/$xstep}]
集合h[expr{($h-$hExtra)/$ystep}]
wm grid$window$h$xstep$ystep
}
}
pack[text.t-setgrid 1]-填充两个-扩展1
绑定{initGrid%W%W%h}

正如你所看到的,这并不是很容易做到的

你是对的,它在Windows上不起作用(Mac OS X/Aqua也是如此),这是因为窗口管理器本身不支持该功能。你必须用一些脚本来合成它。然而真正复杂的是一个典型的网格窗口不仅仅是一个网格窗口;它周围有一些额外的空间,可以使更新后的大小进入下一个网格大小,这使窗口扩大一点,并再次调整大小…一次又一次

因此,我们需要两个阶段的初始化,首先测量我们必须允许的额外空间的实际大小,然后应用强制代码

package require Tk

proc initGrid {window w h} {
    # Do nothing for subwindows
    if {$window ne [winfo toplevel $window]} return

    lassign [wm grid $window] xcount ycount xstep ystep
    set wExtra [expr {$w - $xcount*$xstep}]
    set hExtra [expr {$h - $ycount*$ystep}]
    bind $window <Configure> [list resizeGrid $wExtra $hExtra %W %w %h]
}
proc resizeGrid {wExtra hExtra window w h} {
    # Do nothing for subwindows
    if {$window ne [winfo toplevel $window]} return

    lassign [wm grid $window] xcount ycount xstep ystep
    if {$w-$wExtra != $xcount*$xstep || $h-$hExtra != $ycount*$ystep} {
        set w [expr {($w - $wExtra)/$xstep}]
        set h [expr {($h - $hExtra)/$ystep}]
        wm grid $window $w $h $xstep $ystep
    }
}

pack [text .t -setgrid 1] -fill both -expand 1
bind . <Configure> {initGrid %W %w %h}
包需要Tk
proc initGrid{window w h}{
#不为子窗口执行任何操作
如果{$windowne[winfo顶级$window]}返回
lassign[wm grid$WINDOWN]xcount ycount xstep ystep
set wExtra[expr{$w-$xcount*$xstep}]
set hExtra[expr{$h-$ycount*$ystep}]
绑定$window[列表大小调整网格$wExtra$hExtra%W%W%h]
}
proc resizeGrid{wExtra hExtra窗口w h}{
#不为子窗口执行任何操作
如果{$windowne[winfo顶级$window]}返回
lassign[wm grid$WINDOWN]xcount ycount xstep ystep
如果{$w-$wExtra!=$xcount*$xstep | |$h-$hExtra!=$ycount*$ystep}{
集合w[expr{($w-$wExtra)/$xstep}]
集合h[expr{($h-$hExtra)/$ystep}]
wm grid$window$h$xstep$ystep
}
}
pack[text.t-setgrid 1]-填充两个-扩展1
绑定{initGrid%W%W%h}

正如你所看到的,这并不是很容易做到的

健康警告:我还没有在Windows上尝试过这个,但它在OSX上确实对我有效,所以它也很有可能对你有效……它可以工作,但在调整大小时会闪烁。使窗口不可调整大小和使用4个按钮的小部件来调整大小可能更稳定。或2个文本字段,或。。。不管怎样,现在我知道我没有错过任何东西或做错任何事,我可以继续我的工作了。谢谢。我认为如果没有大量深入的建筑工作,就不可能对闪烁做太多的事情;
事件是您如何及时获得尺码信息的。(事实上,我建议不要使用
-setgrid
,只处理你得到的东西。)健康警告:我没有在Windows上尝试过这个,但它在OSX上确实对我有效,所以它也有合理的机会对你有效……它有效,但在调整大小时会闪烁。使窗口不可调整大小和使用4个按钮的小部件来调整大小可能更稳定。或2个文本字段,或。。。不管怎样,现在我知道我没有错过任何东西或做错任何事,我可以继续我的工作了。谢谢。我认为如果没有大量深入的建筑工作,就不可能对闪烁做太多的事情;
事件是您如何及时获得尺码信息的。(实际上,我建议根本不要使用
-setgrid
,只处理您得到的东西。)