如何编写tkinter“scrolledtext”模块的代码

时间:2013-07-15 14:53:09

标签: python tkinter scrollbar

下面的代码会产生一个丑陋但功能性的示例,即在文本小部件中使用滚动条并导致一些问题。注意:这是在Windows框中使用Python 3完成的。

  1. 出现的滚动条附加到框架上,虽然它滚动文本框内容,但我希望它附加到文本小部件本身。我一直无法做到这一点。

  2. 有一些名为“scrolledtext”的Tkinter模块的引用应该是一个更好的机制,用于将滚动条添加到文本框但是,我还没有找到任何有关如何导入它和调用的示例我能够开始工作(可能需要一个例子)。


  3. 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)
    

2 个答案:

答案 0 :(得分:22)

你是对的,你可以使用ScrolledText模块中的tkinter.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

答案 1 :(得分:10)

虽然使用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时。

请注意,您也可以在此处使用网格。如果您只有垂直滚动条,则打包更容易。如果您同时拥有水平和垂直滚动条,则网格更有意义。

要完成幻觉,您可以将文本窗口小部件的边框宽度设置为零,并将包含框架的边框宽度设置为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()

就我个人而言,我不建议进行全球导入,我不建议使用地方,但我希望尽可能接近原始版本。