On 7/8/2012 5:19 PM, Frederic Rentsch wrote:
Hi widget wizards,
The manual describes the "event" attribute "widget" as "The widget
which generated this event. This is a valid Tkinter widget instance, not
a name. This attribute is set for all events."
Same in 3.3, with nice example of using it.
def turnRed(self, event):
event.widget["activeforeground"] = "red"
self.button.bind("<Enter>", self.turnRed)
Ans so it is--has been until on the latest occasion "event.widget" was
not the widget, but its name, crashing the handler.
Has event.widget been the widget only in other programs or previously
with the same program?
# Here I build a list of selectable records having each four fields.
# The fields are labels. The selectable line is a frame containing the
# labels side by side. The line frames go into self, which is a Frame.
for n in range (len (records)):
for n, record in enumerate(records):
record = records [n]
line_frame = Frame (self, name = '-%d-' % n, relief = RAISED,
**BUTTON_FRAME_)
line_frame.bind ('<Enter>', self.enter)
line_frame.bind ('<Leave>', self.leave)
line_frame.bind ('<ButtonRelease-1>', self.pick_record)
line_frame.bind ('<ButtonRelease-3>', self.info_profile)
line_frame.grid (row = n+2, column = 1)
for i in self.range_n_fields: # (0, 1, 2, 3)
field = Label (line_frame, text = record [self.INDICES [i]],
anchor = W, width = self.COLUMN_WIDTHS [i], **DB_LIST_LABEL_)
field.grid (row = 0, column = i, sticky = NW)
When posting problem code, you should post a minimal, self-contained
example that people can try on other systems and versions. Can you
create the problem with one record, which you could give, and one
binding? Do you need 4 fields, or would 1 'work'?
# Here is the <Enter> handler:
def enter (self, event):
w = event.widget
print 'hit list.enter (). Event, widget', event, w, w.__class__ #
Tracing line
w.config (bg = SELECTED_BG_COLOR)
# And here is what comes out. The first line is my tracing line. The name is
correct in that it
# names the entered line_frame, but is wrong because it should be the
line_frame, not its name.
# The rest is the red exception message:
hit list.enter (). Event, widget <Tkinter.Event instance at 0x9115dcc>
.main-frame.data-frame.title-hit-list.-10- <type 'str'>
Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib/python2.6/lib-tk/Tkinter.py", line 1413, in __call__
return self.func(*args)
File "/home/fr/python/finance/piam/hit_list.py", line 83, in enter
w.config (bg = SELECTABLE_BG_COLOR)
AttributeError: 'str' object has no attribute 'config'
# The same thing happens with <Leave>. The other handlers I haven't done yet.
The same bindings work well in
# a Menu class with the difference that the bindings are on the Labels, not a
containing Frame.
# Dell E6500, Ubuntu 10.04, Python 2.6
You might try a current Python release, and the latest tcl/tk 8.5.11
released last March (comes with 3.3.0 Windows release, don't know how on
Ubuntu). There might be (have been?) a bug with events on Frames, or on
Frames within Frames treated as widgets.
--
Terry Jan Reedy
--
http://mail.python.org/mailman/listinfo/python-list