質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Q&A

解決済

1回答

1668閲覧

Ruby/Tk スクロールバーがうまく機能しない

qiyuren

総合スコア29

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

0グッド

0クリップ

投稿2021/01/23 14:47

編集2021/01/23 15:12

前提・実現したいこと

下記はサンプルなのですが、CSVのような表をTKに表示させたく、行数が多いとスクロールしないといけないので、
スクロールバーを設置できるTkCanvasを敷いて、その上にTkcWindowを行の数だけ配置しようと考えております。

行数が多い場合、TkCanvasをスクロールできるようにしたいのですが、3点の不具合が出てしまいます。

・スクロールバーはでるが、スクロールバーのスライダーが出現しない。
・Canvasウィンドウ上でスクロールしても、画面が上下しない。
・スクロールバー上でスクロールすると画面が上下するが、無限に上下できてしまう。(Canvasで定義したheightを超えてスクロールできてしまう)

この3点の不具合の原因と対応策をご教授いただけないでしょうか。

該当のソースコード

ruby

1require 'tk' 2 3root = TkRoot.new 4root.geometry('1280x800') 5 6root_frame = TkFrame.new(root, background: "blue", height: 800, width: 1280).pack 7yscrollbar = TkScrollbar.new(root_frame, orient: 'vertical', width:20).pack(side: 'right', fill: 'y') 8canvas = TkCanvas.new(root_frame, background: "red", height: 800, width: 1260, yscrollcommand: proc{|*idx| yscrollbar.set(*idx)}).pack(side: 'right') 9 10yscrollbar.command(proc{|*idx| canvas.yview(*idx)}) 11 12(0..10).each do |x| 13 frame = TkFrame.new(background: "yellow", height: 100, width: 1260) 14 TkcWindow.new(canvas, 630, 50+100*x, window: frame, height: 100, width: 1260) 15 TkLabel.new( 16 frame, 17 text: 'hoge', 18 ).pack 19end 20 21 22 23Tk.mainloop 24

試したこと

ruby

1yscrollbar = TkYScrollbar.new(root_frame, width:20).pack(side: 'right', fill: 'y') 2canvas = TkCanvas.new(root_frame, background: "red", height: 800, width: 1260).pack(side: 'right') 3 4yscrollbar.assign(canvas)

を試しましたが、同じ挙動でした。

補足情報(FW/ツールのバージョンなど)

macOS Catalina 10.15.7
ruby 2.6.5
tk 0.3.0

###その後

ruby

1canvas = TkCanvas.new(root_frame, background: "red", height: 800, width: 1260, scrollregion:[0,0,0,100*ary.size], yscrollcommand: proc{|*idx| yscrollbar.set(*idx)})

scrollregionを加えたところ、
・スクロールバーはでるが、スクロールバーのスライダーが出現しない。
・スクロールバー上でスクロールすると画面が上下するが、無限に上下できてしまう。(Canvasで定義したheightを超えてスクロールできてしまう)
上記2点は解決しました。

・Canvasウィンドウ上でスクロールしても、画面が上下しない。
が解決されず、こちらに関してご意見いただけますと幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Canvasウィンドウ上でスクロールしても、画面が上下しない。

どのような操作でスクロールをされてますか?

マウスホィールでのスクロールであれば、
canvas に対して MouseWheel イベントの設定が必要です。
参考: https://teratail.com/questions/315269

マウスのドラッグ操作によりスクロールしたい場合は、
コード例はPythonですが以下を参考にして見て下さい。
https://teratail.com/questions/54103

キーボードの PageUp/Down キーでスクロールしたい場合についても同様に、
それぞれ個別にイベントの設定が必要です。

投稿2021/01/23 19:35

teamikl

総合スコア8760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

qiyuren

2021/01/24 08:03

ありがとうございます! >マウスホィールでのスクロールであれば、 >canvas に対して MouseWheel イベントの設定が必要です。 >参考: https://teratail.com/questions/315269 まさに、本問題を解決する参考でした。 root.bind_all('MouseWheel', proc { |e| canvas.yview(:scroll, -e.delta, :units)}) 上記を追加して、希望通り動作しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問