Как сделать прокручиваемую рамку с холстом в Ruby TK? - PullRequest
0 голосов
/ 18 января 2019

Мне нужно прокрутить фрейм, содержащий несколько меток.

Так как фреймы не прокручиваются, я решил использовать холст, который содержитрамка с этими ярлыками.

Но это будет первый раз, когда я использую холст, поэтому я действительно не знаю, с чего начать, в итоге я получил следующий код:

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 голосов
/ 19 января 2019

Я не знаком с Tk в Ruby или 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.

...