31

テキストフィールドにスクロールバーをアタッチしようとしていますが、アタッチできませんでした。コードのセグメントは次のとおりです。

self.scroller = Scrollbar(self.root)
self.scroller.place(x=706, y=121)
self.outputArea = Text(self.root, height=26, width=100) 
self.outputArea.place(x=0, y=120)
self.scroller.config(command=self.outputArea.yview)
self.outputArea.config(state=DISABLED, yscrollcommand = self.scroller.set)

このコードは、テキストフィールドのすぐ隣に非常に小さなスクロールバーを配置しています(非常に小さいということは、上下の矢印は表示されますが、間には何も表示されないことを意味します)。テキストフィールドがいっぱいになったときにスクロールできますが、少なくともスクロールバーの高さをテキストフィールドと同じ高さに設定する方法はありますか?

4

4 に答える 4

60

Tkinterには、 packgridplaceの3つのジオメトリマネージャーがあります。 パックとグリッドは通常、場所よりも推奨されます。

グリッドマネージャーの のオプションを使用して、テキストウィジェット の横にスクロールバー
を配置できます。

スクロールバーウィジェットのコマンドオプションをテキストのyviewメソッド に設定します。

scrollb = tkinter.Scrollbar(..., command=txt.yview)

テキストウィジェットのyscrollcommandオプションをスクロールバーのsetメソッドに設定します。

txt['yscrollcommand'] = scrollb.set

これがttkを利用する実用的な例です:

import tkinter
import tkinter.ttk as ttk

class TextScrollCombo(ttk.Frame):

    def __init__(self, *args, **kwargs):

        super().__init__(*args, **kwargs)

    # ensure a consistent GUI size
        self.grid_propagate(False)
    # implement stretchability
        self.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(0, weight=1)

    # create a Text widget
        self.txt = tkinter.Text(self)
        self.txt.grid(row=0, column=0, sticky="nsew", padx=2, pady=2)

    # create a Scrollbar and associate it with txt
        scrollb = ttk.Scrollbar(self, command=self.txt.yview)
        scrollb.grid(row=0, column=1, sticky='nsew')
        self.txt['yscrollcommand'] = scrollb.set

main_window = tkinter.Tk()

combo = TextScrollCombo(main_window)
combo.pack(fill="both", expand=True)
combo.config(width=600, height=600)

combo.txt.config(font=("consolas", 12), undo=True, wrap='word')
combo.txt.config(borderwidth=3, relief="sunken")

style = ttk.Style()
style.theme_use('clam')

main_window.mainloop()

スクロールバーが小さいことに対処する部分はです。これについてはsticky='nsew'、 →ここで
読むことができます。

今すぐ学ぶのに役立つことは、異なるTkinterウィジェットは、同じ親を共有しない限り、同じプログラム内で異なるジオメトリマネージャーを使用できるということです。


tkinter.scrolledtextモジュールには、複合ウィジェット(Text&Scrollbar)であるScrolledTextと呼ばれるクラスが含まれています。

import tkinter
import tkinter.scrolledtext as scrolledtext

main_window = tkinter.Tk()

txt = scrolledtext.ScrolledText(main_window, undo=True)
txt['font'] = ('consolas', '12')
txt.pack(expand=True, fill='both')

main_window.mainloop()

これが実装される方法は一見の価値があります。

于 2012-12-12T05:24:46.227 に答える
12

scrolledtextINPUTボックスを使用している場合は、この関数を使用すると便利です。それを見つけるのに4時間以上かかりました。tkinterが好きじゃないの?

注意すべき2つのこと...追加のインポートにはtkinter.scrolledtextをtkscrolledとしてインポートする必要があり、を使用してデフォルト値を設定し、 (よりひどい命名)insertを使用して値を読み取りますget

このコードは、幅20文字×10行のテキスト入力ボックスを機能させるための中心的な役割を果たしました。

import tkinter.scrolledtext as tkscrolled
import tkinter as tk

default_text = '1234'
width, height = 20,10
TKScrollTXT = tkscrolled.ScrolledText(10, width=width, height=height, wrap='word')

# set default text if desired
TKScrollTXT.insert(1.0, default_text)
TKScrollTXT.pack(side=tk.LEFT)

スクロールバーは、呼び出しで定義された高さに達すると表示されます。それらはグレー表示され、背景にうまく溶け込みます。それは素晴らしい働きをします.....あなたが行うべき正しい呼び出しを理解したら。

これがあなたの質問に関連していることを願っています!

于 2017-12-29T22:47:33.563 に答える
3

あなたはそれにtkinterフレームを使うことができます、これは非常に簡単な方法です=>

import tkinter as tk
from tkinter import *
root = tk.Tk()

f = tk.Frame(root)
f.place(x=10, y=20)

scrollbar = Scrollbar(f)
t = tk.Text(f, height=10, width=10, yscrollcommand=scrollbar.set)
scrollbar.config(command=t.yview)
scrollbar.pack(side=RIGHT, fill=Y)
t.pack(side="left")

root.mainloop()
于 2020-10-13T05:21:41.217 に答える
0

これでうまくいくと思います。これは、私が使用したコードの一部です。削除できる他のオプションがいくつかあります。テーマが暗いので持っています。

from tkinter import *

window = Tk()
window.title("test for scrollbar")
window.config(pady=50, padx=50, bg="white")


text_box = Text(width=49, height=5, bg="white", highlightthickness=1, foreground="black",
                    insertbackground="black", wrap="word")
    tex_scroll = Scrollbar(orient=VERTICAL,)
    
    tex_scroll.config(command=text_box.yview, )
    text_box["yscrollcommand"] = tex_scroll.set
    
    text_box.grid(column=1, row=4, columnspan=2, sticky="w")
    tex_scroll.grid(column=2, row=4, sticky="nse")

window.mainloop()
于 2022-02-27T14:08:11.907 に答える