web-dev-qa-db-ja.com

tkinterの「scrolledtext」モジュールのコーディング方法

以下のコードは、テキストウィジェットでスクロールバーを使用する醜いが機能的な例を生成し、いくつかの質問をもたらします。注:これは、WindowsボックスでPython 3を使用して行われます。

  1. 表示されるスクロールバーはフレームにアタッチされており、テキストボックスの内容をスクロールしますが、テキストウィジェット自体にアタッチすることをお勧めします。これを実現させることができませんでした。

  2. 「scrolledtext」と呼ばれるTkinterモジュールへの参照がいくつかあります。これは、テキストボックスにスクロールバーを追加するためのはるかに優れたメカニズムであると思われますが、インポートして呼び出す方法の例はありません。仕事に取り掛かります(おそらく例が必要です)。


frame1 = tk.Frame(win,width=80, height=80,bg = '#808000')
frame1.pack(fill='both', expand='yes')
scrollbar = Scrollbar(frame1) 
scrollbar.pack(side=RIGHT, fill=Y)
editArea = Text(frame1, width=10, height=10, wrap=Word, yscrollcommand=scrollbar.set)
editArea.pack()    
scrollbar.config(command=editArea.yview)
editArea.place(x=10,y=30)
18
Bill Waters

正解です。次のように、tkinter.scrolledtextモジュールのScrolledTextウィジェットを使用できます。

import tkinter as tk
import tkinter.scrolledtext as tkst

win = tk.Tk()
frame1 = tk.Frame(
    master = win,
    bg = '#808000'
)
frame1.pack(fill='both', expand='yes')
editArea = tkst.ScrolledText(
    master = frame1,
    wrap   = tk.Word,
    width  = 20,
    height = 10
)
# Don't use widget.place(), use pack or grid instead, since
# They behave better on scaling the window -- and you don't
# have to calculate it manually!
editArea.pack(padx=10, pady=10, fill=tk.BOTH, expand=True)
# Adding some text, to see if scroll is working as we expect it
editArea.insert(tk.INSERT,
"""\
Integer posuere erat a ante venenatis dapibus.
Posuere velit aliquet.
Aenean eu leo quam. Pellentesque ornare sem.
Lacinia quam venenatis vestibulum.
Nulla vitae elit libero, a pharetra augue.
Cum sociis natoque penatibus et magnis dis.
Parturient montes, nascetur ridiculus mus.
""")
win.mainloop()

そして、あなたは行き​​ます:

enter image description here

23
Peter Varo

ScrolledTextウィジェットを使用すると、数行のコードを節約できる場合がありますが、自分で実行できないことは何もしていません。それを自分で行うと、謎のいくつかを取り除くのに役立ちます。

あなたは実際にほとんどすべてをほぼ正しくやっています。あなたがしている間違いは、あなたのテキストウィジェットがそれのほんの一部ではなく、完全にコンテナを満たすべきだということです。

これを行う標準的な方法は次のとおりです。

container = tk.Frame(...)
text = tk.Text(container, ...)
scrollbar = tk.Scrollbar(container, ...)
scrollbar.pack(side="right", fill="y")
text.pack(side="left", fill="both", expand=True)

これですべてです。これで、ウィンドウのサイズ変更などによりコンテナがどれだけ大きくなるかに関係なく、スクロールバーは常にテキストウィジェットにアタッチされて表示されます。次に、コンテナ、テキストウィジェット、およびスクロールバーのこのグループ全体を、GUI全体に追加するときに単一のウィジェットとして扱います。

ここでもグリッドを使用できることに注意してください。垂直スクロールバーしかない場合は、パックの方が簡単です。水平スクロールバーと垂直スクロールバーの両方がある場合、グリッドは少し意味があります。

錯覚を完成させるには、テキストウィジェットのborderwidthを0に設定し、含まれているフレームのborderwidthを1に設定して、浮き彫りのレリーフを作成すると、スクロールバーがテキストウィジェット内にあるように見えます。

以下は、あなたの例のように見える完全に機能する完全な例です:

import Tkinter as tk

win = tk.Tk()

win.configure(background="#808000")

frame1 = tk.Frame(win,width=80, height=80,bg = '#ffffff',
                  borderwidth=1, relief="sunken")
scrollbar = tk.Scrollbar(frame1) 
editArea = tk.Text(frame1, width=10, height=10, wrap="Word",
                   yscrollcommand=scrollbar.set,
                   borderwidth=0, highlightthickness=0)
scrollbar.config(command=editArea.yview)
scrollbar.pack(side="right", fill="y")
editArea.pack(side="left", fill="both", expand=True)
frame1.place(x=10,y=30)

win.mainloop()

個人的には、グローバルインポートを行うことはお勧めしません。また、場所を使用することもお勧めしませんが、できるだけ元の場所に近づけたいと考えていました。

11
Bryan Oakley