Files
cpython/Lib/tkinter/scrolledtext.py
T
fbce45b587 gh-59396: Add use_ttk parameter to tkinter ScrolledText (GH-153119)
ScrolledText gained a keyword-only use_ttk parameter to build the
surrounding frame and the vertical scroll bar from the themed
tkinter.ttk widgets instead of the classic tkinter widgets.  The
classic widgets remain the default.

Co-authored-by: Claude Opus 4.8 <[email protected]>
2026-07-10 17:16:53 +00:00

64 lines
2.0 KiB
Python

"""A ScrolledText widget feels like a text widget but also has a
vertical scroll bar on its right. (Later, options may be added to
add a horizontal bar as well, to make the bars disappear
automatically when not needed, to move them to the other side of the
window, etc.)
Configuration options are passed to the Text widget.
A Frame widget is inserted between the master and the text, to hold
the Scrollbar widget.
Most methods calls are inherited from the Text widget; Pack, Grid and
Place methods are redirected to the Frame widget however.
Pass use_ttk=True for the themed tkinter.ttk frame and scroll bar
instead of the classic tkinter widgets.
"""
from tkinter import Frame, Text, Scrollbar, Pack, Grid, Place, ttk
from tkinter.constants import RIGHT, LEFT, Y, BOTH
__all__ = ['ScrolledText']
class ScrolledText(Text):
def __init__(self, master=None, *, use_ttk=False, **kw):
if use_ttk:
self.frame = ttk.Frame(master)
self.vbar = ttk.Scrollbar(self.frame)
else:
self.frame = Frame(master)
self.vbar = Scrollbar(self.frame)
self.vbar.pack(side=RIGHT, fill=Y)
kw['yscrollcommand'] = self.vbar.set
Text.__init__(self, self.frame, **kw)
self.pack(side=LEFT, fill=BOTH, expand=True)
self.vbar['command'] = self.yview
# Copy geometry methods of self.frame without overriding Text
# methods -- hack!
text_meths = vars(Text).keys()
methods = vars(Pack).keys() | vars(Grid).keys() | vars(Place).keys()
methods = methods.difference(text_meths)
for m in methods:
if m[0] != '_' and m != 'config' and m != 'configure':
setattr(self, m, getattr(self.frame, m))
def __str__(self):
return str(self.frame)
def example():
from tkinter.constants import END
stext = ScrolledText(bg='white', height=10)
stext.insert(END, __doc__)
stext.pack(fill=BOTH, side=LEFT, expand=True)
stext.focus_set()
stext.mainloop()
if __name__ == "__main__":
example()