こんにちは。
RubyでGUIのプログラムを組んでいて、この件についてググっても情報が少なくなかなか良い答えが見つけられなくてわからなかったので、こちらに質問させていただきました。
開発環境
- macOS 11.1 Big Sur
- ruby2.7.2
- tk_version 8.6
問題の前提
RubyでGUI上で動くプログラムを、Ruby/tkを使って組もうとしています。
次は、ネットの情報を拝借してきて文字列だけをScrollboxに追加して、単にスクロールの動作ができることを確認したものです。
ruby
1require 'tk' 2 3parent = TkRoot.new 4 5list = TkScrollbox.new(parent).pack(side: 'top', fill: 'both') 6('A'..'Z').each_with_index{|c, i| list.insert(:end, c * (i + 1))} 7 8Tk.mainloop
期待する結果
これを文字列ではなく、ウィジェットやウィジェットをいくつか含めてTkFrameなどで行ごとにしたものを、リストさせたいです。
具体的には、TkScrollboxに挿入される行ごとに、TkLabelやTkImageを含むTkFrameを表示させたいです。
つまり一行に文字列画像を混在させて、それを複数行にしたときにスクロールして上から下まで見られるようにしたいです。
伝わりにくいかもしれないので、もう一度言い換えると、TkLabelやTkButton、TkPhotoImageといったいくつかの要素を横並びにまとめたTkFrameを、一行一行縦に並べて画面を縦にスクロールして、アイテムをまとめて目で見て確認できるように扱いたいと考えています。
試したこと
試したコードがこちらです。
ruby
1require 'tk' 2 3parent = TkRoot.new 4 5list = TkScrollbox.new(parent).pack(side: 'top', fill: 'both') 6label = TkLabel.new(parent, text: 'SAMPLE') 726.times{ list.insert(:end, label)} 8 9p label 10 11Tk.mainloop
この結果、ウィンドウ画面は表示されました。相変わらずスクロールも、期待通りに動いてくれます。
しかし表示されているものが、望む結果ではありません。
立ち上がったウィンドウでは、次のように表示されました。(これらはスクロールはできますし、項目も追加されています。)
.w00003 .w00003 .w00003 .w00003 .w00003 (中略) .w00003
そして、ターミナルにはこう表示されます。
#<Tk::Label:0x00007fd88c91e788 @path=".w00003">
おそらく、@pathの値が何らかの形で文字列に変換され、Scrollboxに代入されているのだと思います。
しかし、これでは意味がありません。
私が表示させたいのは、期待する文字列を含むラベルや画像です。
その他
調べてみたところTkFrameにはスクロールバーを設定できないようなのでTkCanvasにTkFrameを配置してみてTkCanvasにスクロールさせるのが良いと言っているところもありました。
ただ、これもわかる限り試してみましたが、プログラムが良くないのか、思うようにならず困っています。
もしかして、TkCanvasのやり方なら、可能なのでしょうか。
それとも、そもそもこういったことは実現ができないのでしょうか?
さいごに
どうか、お詳しい方、ご教示いただけませんでしょうか。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/29 13:18
2020/12/29 13:52
2020/12/30 02:03
2020/12/30 02:44 編集
2020/12/30 03:57