[Python-bugs-list] [comp.lang.python] Bug in Tkinter.ScrolledText (and fix). (PR#82)

guido@cnri.reston.va.us guido@cnri.reston.va.us
Thu, 16 Sep 1999 00:13:26 -0400 (EDT)


(From the newsgroup:)

Message-ID: <199909151925.MAA02285@wartch.sapros.com>
To: python-list@python.org
Subject: Bug in Tkinter.ScrolledText (and fix).
Date: Wed, 15 Sep 1999 12:25:01 -0700
From: Peter Haight <peterh@sapros.com>
Newsgroups: comp.lang.python


If you create multiple ScrolledText widgets it uses the same name for all
of them. This is because the line cnf['name'] = 'text' clobbers the default
value for cnf which was created inside class scope. This means the next time
__init__ is called with no cnf argument, cnf now has the default value of {
'name' : 'text' } instead of {}.

I'm including some sample code and a patch.

----------- PATCH ----------------
--- ScrolledText.py.orig	Wed Sep 15 12:09:54 1999
+++ ScrolledText.py	Wed Sep 15 12:15:22 1999
@@ -14,7 +14,9 @@
 from Tkinter import _cnfmerge
 
 class ScrolledText(Text):
-	def __init__(self, master=None, cnf={}, **kw):
+	def __init__(self, master=None, cnf=None, **kw):
+		if cnf is None:
+			cnf = {}
 		if kw:
 			cnf = _cnfmerge((cnf, kw))
 		fcnf = {}
-----------------------------------

-------- SAMPLE CODE --------------

#!/usr/bin/env python

from Tkinter import *
import ScrolledText

class App(Frame):
	def __init__(self, master=None):
		Frame.__init__(self, master)
		self.pack(expand=1, fill=BOTH)
		self.texts = []
		self._create_widgets()

	def _create_widgets(self):
		self.entry = Entry(self)
		self.entry.pack(side=TOP, expand=0, fill=X)
		self.entry.bind('<Return>', self.change)
		self.entry.focus_set()

		self.pane = Frame(self)
		self.pane.pack(side=TOP)
		for i in range(6):
			t = ScrolledText.ScrolledText(self)
			#t = Text(self)
			print 'Created text:', t
			t.insert('end', 'Screen %i' % i)
			self.texts.append(t)

		self.curscreen = 0
		self.texts[0].pack(side=TOP, expand=1, fill=BOTH)
	
	def change(self, event):
		try:
			num = int(self.entry.get())
		except ValueError:
			return
		if num == self.curscreen: return
		if num >= 6: return
		self.texts[self.curscreen].forget()
		self.texts[num].pack(side=TOP, expand=1, fill=BOTH)
		self.curscreen = num

def main():
	a = App()
	a.mainloop()

if __name__ == '__main__':
	main()
-----------------------------------