如何将滚动条附加到文本小部件?

时间:2012-12-12 04:20:29

标签: python tkinter

我可能过度思考了这一点,但由于某种原因,我似乎无法弄清楚这一点。我试图将滚动条附加到我的文本字段,但无法这样做。以下是代码段:

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)

此代码在我的文本字段旁边放置一个非常小的滚动条(非常小,我的意思是你可以看到向上和向下箭头,但两者之间没有任何内容)。当我的文本字段填满时,我可以用它滚动,但有没有办法至少设置滚动条的高度,使它看起来与文本字段的高度相同?

3 个答案:

答案 0 :(得分:37)

Tkinter有三个几何体管理器packgridplace
通常建议使用包装和网格。

您可以使用grid manager's 选项
滚动条定位在文本小部件旁边。

滚动条小部件的命令选项设置为文本的 yview 方法。

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

文本小部件的 yscrollcommand 选项设置为滚动条的 set 方法。

txt['yscrollcommand'] = scrollb.set

这是一个有效的例子:

import Tkinter as tki # Tkinter -> tkinter in Python3

class App(object):

    def __init__(self):
        self.root = tki.Tk()

    # create a Frame for the Text and Scrollbar
        txt_frm = tki.Frame(self.root, width=600, height=600)
        txt_frm.pack(fill="both", expand=True)
        # ensure a consistent GUI size
        txt_frm.grid_propagate(False)
        # implement stretchability
        txt_frm.grid_rowconfigure(0, weight=1)
        txt_frm.grid_columnconfigure(0, weight=1)

    # create a Text widget
        self.txt = tki.Text(txt_frm, borderwidth=3, relief="sunken")
        self.txt.config(font=("consolas", 12), undo=True, wrap='word')
        self.txt.grid(row=0, column=0, sticky="nsew", padx=2, pady=2)

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

app = App()
app.root.mainloop()

滚动条缩小的部分是sticky='nsew'
您可以阅读→herehere

现在有用的东西是,不同的 Tkinter 小部件可以在同一个程序中使用不同的几何管理器,只要他们这样做不共享同一个父母


还值得一提的是,ScrolledText模块(在Python3中重命名为tkinter.scrolledtext)。 它包含一个名为 ScrolledText 的类,它是一个复合小部件(Text& Scrollbar)。

# Python 2.7
import Tkinter as tki
from ScrolledText import ScrolledText

class App(object):

    def __init__(self):
        self.root = tki.Tk()

    # create a Text widget with a Scrollbar attached
        self.txt = ScrolledText(self.root, undo=True)
        self.txt['font'] = ('consolas', '12')
        self.txt.pack(expand=True, fill='both')

app = App()
app.root.mainloop()

答案 1 :(得分:1)

如果您正在使用INPUT框,那么可以使用scrolledtext功能轻松实现。我花了4个多小时找到它。不喜欢tkinter吗?

有两点需要注意...... 需要额外的导入 将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)

滚动条会在达到调用中定义的高度时显示。它们变灰并且很好地融入背景中。一旦你弄清楚要做出正确的调用,它的效果很好.....。

我希望这与您的问题相关!

答案 2 :(得分:1)

您可以使用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()