mirror of
https://github.com/python/cpython.git
synced 2025-07-18 00:35:17 +00:00

Using grid methods on ScrolledText widgets does not work as expected. It either fails to pack a widget, or can even cause Tk to lock up. The problem is that the .grid method is being called on the text widget, not the frame widget. This can lead to the well-known lockup in Tk when a frame's children are managed by both the pack and grid managers. Even if it doesn't lock up, the frame is never placed within the intended widget. Program fragment: >>> import ScrolledText >>> s = ScrolledText.ScrolledText() >>> s.grid(row=0, column=0, rowspan=2) The following patch uses the same hack to copy the 'grid' and 'place' geometry manager methods to the ScrolledText instance as is already used for the 'pack' manager.
43 lines
1.6 KiB
Python
43 lines
1.6 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 methods
|
|
# are redirected to the Frame widget however.
|
|
|
|
from Tkinter import *
|
|
from Tkinter import _cnfmerge
|
|
|
|
class ScrolledText(Text):
|
|
def __init__(self, master=None, cnf=None, **kw):
|
|
if cnf is None:
|
|
cnf = {}
|
|
if kw:
|
|
cnf = _cnfmerge((cnf, kw))
|
|
fcnf = {}
|
|
for k in cnf.keys():
|
|
if type(k) == ClassType or k == 'name':
|
|
fcnf[k] = cnf[k]
|
|
del cnf[k]
|
|
self.frame = apply(Frame, (master,), fcnf)
|
|
self.vbar = Scrollbar(self.frame, name='vbar')
|
|
self.vbar.pack(side=RIGHT, fill=Y)
|
|
cnf['name'] = 'text'
|
|
apply(Text.__init__, (self, self.frame), cnf)
|
|
self.pack(side=LEFT, fill=BOTH, expand=1)
|
|
self['yscrollcommand'] = self.vbar.set
|
|
self.vbar['command'] = self.yview
|
|
|
|
# Copy geometry methods of self.frame -- hack!
|
|
methods = Pack.__dict__.keys()
|
|
methods = methods + Grid.__dict__.keys()
|
|
methods = methods + Place.__dict__.keys()
|
|
|
|
for m in methods:
|
|
if m[0] != '_' and m != 'config' and m != 'configure':
|
|
setattr(self, m, getattr(self.frame, m))
|