22

下面的代码生成了一个在文本小部件中使用滚动条的丑陋但实用的示例,并导致了几个问题。注意:这是在 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)
4

2 回答 2

31

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

你去吧:

在此处输入图像描述

于 2013-07-15T15:31:27.220 回答
14

虽然使用 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()

就我个人而言,我不建议进行全局导入,也不建议使用 place,但我想尽可能地接近你的原件。

于 2013-07-15T15:41:17.523 回答