Как определить высоту ScrollableFrame внутри ScrolledWindow?

Я хочу поместить несколько (~30) CheckButton внутри BWidget::ScrollableFrame, которые находятся внутри BWidget::ScrolledWindow. В целях тестирования я хотел ограничить размер ScrollableFrame до 100 на 100 пикселей. Я ожидал 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

Итак... Что не так? Из того, что я видел здесь, должно быть возможно получить кадр с ScrollableFrame#get_frame, например:

set a [$f getframe]

В рубине я бы сделал так:

sftest = scrollframe.get_frame

Метод get_frame не существует в моей установке. Но мой вышеупомянутый рубиновый вариант приводит к следующей ошибке:

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

Я действительно понятия не имею, почему эта ошибка возникает в этом маленьком скрипте, поэтому я не могу проверить, можно ли настроить высоту и ширину этого виджета. Как установить фиксированную высоту и ширину для ScrollableFrame?

Обновление: размер установлен правильно, если не было добавлено CheckButton. В первый раз, когда я добавляю CheckButton, ScrollableFrame устанавливается на размер CheckButtonneeds. Как я могу предотвратить изменение размера?


person grandmasterg    schedule 29.03.2015    source источник


Ответы (1)


Хорошо... Похоже, проблема с моей используемой конфигурацией, установкой или совместимостью.

Я пробовал следующее:

#!/usr/bin/env ruby1.8

Тогда ошибка не выдается, и работает следующая строка:

sftest = scrollframe.get_frame

Теперь можно добавить CheckButtons к sftest, а затем я могу прокрутить список Checkbuttons...

приветствие

gg

person grandmasterg    schedule 01.04.2015