如何在ScrolledWindow中定义ScrollableFrame的高度?

时间:2015-03-29 17:34:51

标签: ruby frame tk scrolledwindow bwidget

我想将一些(~30)CheckButton放在位于BWidget::ScrollableFrame内的BWidget::ScrolledWindow内。出于测试目的,我想将ScrollableFrame的大小限制为100px 100px。我预计ScrollableFrame,大小为100x100,可以滚动浏览所有网格CheckButton,但窗口会自动延长,以便所有CheckButton都适合TkRoot

以下是我的尝试:

#!/usr/bin/env ruby

require 'tk'
require 'tkextlib/bwidget'

class TestClass < TkRoot

    attr_reader :checkbutton

    def initialize(*args)
    minsize(800, 400)

    @checkbutton = []
    for i in 0..29
        @checkbutton.push({:name => "checkbutton #{i}"})
    end
    createGUI()
end

def createGUI       
    TkLabel.new(self, :text => 'first label').grid({:column => 0, :row => 0, :sticky => 'w'})

    scrolledwindow = Tk::BWidget::ScrolledWindow.new(self).grid({:column => 0, :row => 1, :sticky => 'w'})
    scrolledwindow.auto('none') # want to see if scrollbars are attached correctly

    scrollframe = Tk::BWidget::ScrollableFrame.new(scrolledwindow).grid({:column => 0, :row => 0, :sticky => 'w'})
    scrollframe.height(100)
    scrollframe.width(100)

    # leads to error: /usr/lib/ruby/1.9.1/tk.rb:215:in `class_eval': window name "frame" already exists in parent (RuntimeError)
    #sftest = scrollframe.get_frame

    scrolledwindow.set_widget(scrollframe)

    @checkbutton.each_with_index { |cb, index|
        TkCheckButton.new(scrollframe, :text => cb[:name]).grid({:column => 0, :row => index, :sticky => 'w'})
    }

    TkLabel.new(self, :text => 'second label').grid({:column => 1, :row => 0, :sticky => 'w'})
end
end

那么......出了什么问题?从我看到的here开始,应该可以检索ScrollableFrame#get_frame的框架,如下所示:

set a [$f getframe]

在红宝石中,我会这样做:

sftest = scrollframe.get_frame

我的安装中不存在方法get_frame。但我上面的ruby变体会导致以下错误:

/usr/lib/ruby/1.9.1/tk.rb:215:in `class_eval': window name "frame" already exists in parent (RuntimeError)

我真的不知道为什么在这个小脚本中抛出这个错误所以我无法测试是否可以在这个小部件中配置高度和宽度。 如何为ScrollableFrame设置固定的高度和宽度?

更新:只要未添加CheckButton,就会正确设置尺寸。我第一次添加CheckButton时,ScrollableFrame设置为CheckButton所需的大小。我该如何防止调整大小?

1 个答案:

答案 0 :(得分:0)

好的......我的配置,安装或兼容性似乎存在问题。

我尝试了以下内容:

#!/usr/bin/env ruby1.8

然后没有抛出任何错误,并且后续行正常工作:

sftest = scrollframe.get_frame

现在可以将CheckButton添加到sftest,然后我可以滚动Checkbutton的列表...

greetz

GG