如何在Ruby TK中使用画布制作可滚动框架?

时间:2019-01-17 23:14:28

标签: ruby tcl tk

我需要滚动一个包含多个标签的框架。

由于框架不可滚动,因此我选择使用包含其中带有这些标签的框架的画布。

但这是我第一次使用画布,所以我真的不知道从哪里开始,我最终得到了以下代码:

canvas=TkCanvas.new(root) {grid :row =>0, :column =>0}
frame=TkLabelframe.new(canvas) {grid :row =>0, :column =>0}

scroll=Tk::Tile::Scrollbar.new(root) {orient 'vertical'; grid :row =>0, :column =>1, :sticky =>"wns"}
canvas.yscrollcommand proc {|*args| scroll.set(*args)}
scroll.command proc {|*args| canvas.yview(*args)}


x=0
5.times {
  lab=TkLabel.new(frame) {grid :row =>x, :column =>0, :sticky =>"w"}
  lab.text "Aaa..."
  x+=1
}

但是我得到要为每个标签添加尺寸的框架,因此画布将永远无法滚动。

如何设置框架以使其不调整尺寸?使用canvas.grid_propagate(false)吗? 我如何使画布可滚动?

我正在使用ruby 2.3.3p222 (2016-11-21 revision 56859) [x64-mingw32]

使画布可滚动的工作代码为:

canvas=TkCanvas.new(root) {grid :row =>0, :column =>0}
frame=TkLabelframe.new(canvas) {grid :row =>0, :column =>0}
scroll=Tk::Tile::Scrollbar.new(root) {orient 'vertical'; grid :row =>0, :column =>1}
TkcWindow.new(canvas, 1, 1, :window=>frame, :anchor=>'nw')

canvas.configure(:scrollregion => "0 0 400 400")
canvas.grid_propagate(false)
canvas.yscrollcommand proc {|*args| scroll.set(*args)}
scroll.command proc {|*args| canvas.yview(*args)}

1 个答案:

答案 0 :(得分:1)

我不熟悉Ruby中的Tk或Ruby。但是您似乎只是通过网格几何管理器将框架放在画布上。在Tcl / Tk中,您需要将框架作为窗口项放在画布中。快速浏览互联网似乎表明您需要使用TkcWindow类在Ruby中执行相同的操作。

同样,我不了解Ruby,但我想代码应该像这样:

canvas=TkCanvas.new(root) {grid :row =>0, :column =>0}
frame=TkLabelframe.new(canvas)
TkcWindow.new(canvas, [0, 0], :window => frame)

无论如何,请查看TkcWindow类以了解如何进行。