Python 如何对tkinter进行编码;“滚动文本”;模块
下面的代码生成了一个在文本小部件中使用滚动条的丑陋但实用的示例,并导致了几个问题。注意:这是在windows框上使用Python 3完成的Python 如何对tkinter进行编码;“滚动文本”;模块,python,tkinter,scrollbar,Python,Tkinter,Scrollbar,下面的代码生成了一个在文本小部件中使用滚动条的丑陋但实用的示例,并导致了几个问题。注意:这是在windows框上使用Python 3完成的 显示的滚动条附加到框架上,虽然它滚动文本框内容,但我更希望它附加到文本小部件本身。我一直无法实现这一点 有很多关于Tkinter模块“scrolledtext”的引用,该模块被认为是向文本框添加滚动条的更好机制,但是,我没有找到任何关于如何导入它并调用它的示例,我可以开始工作(可能需要一个示例) 您是对的,您可以使用tkinter.ScrolledText
您是对的,您可以使用
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()
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)
你看:
虽然使用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()
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设置为零,并将包含帧的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()
就我个人而言,我不建议进行全球导入,也不建议使用place,但我想让它尽可能接近您的原始版本 与其他答案相比,另一个优点是使用
import tkinter.scrolledtext作为tkst
保存。我有15分钟的cp
和touch
命令填充我的文本小部件。它会自动滚动还是像tk.Treeview那样需要某种.see()
方法?当我们以后更改editArea时,如何更新它的文本?