# Class to display messages in an information line.
class MessageBar(Pmw
.MegaWidget
):
def __init__(self
, parent
= None, **kw
):
# Define the megawidget options.
# (priority, showtime, bells, logmessage)
'systemerror' : (5, 10, 2, 1),
'usererror' : (4, 5, 1, 0),
'systemevent' : (2, 5, 0, 0),
'userevent' : (2, 5, 0, 0),
('labelmargin', 0, INITOPT
),
('labelpos', None, INITOPT
),
('messagetypes', defaultMessageTypes
, INITOPT
),
('sticky', 'ew', INITOPT
),
self
.defineoptions(kw
, optiondefs
)
# Initialise the base class (after defining the options).
Pmw
.MegaWidget
.__init
__(self
, parent
)
interior
= self
.interior()
self
._messageBarEntry
= self
.createcomponent('entry',
Tkinter
.Entry
, (interior
,))
# Can't always use 'disabled', since this greys out text in Tk 8.4.2
self
._messageBarEntry
.configure(state
= 'readonly')
self
._messageBarEntry
.configure(state
= 'disabled')
self
._messageBarEntry
.grid(column
=2, row
=2, sticky
=self
['sticky'])
interior
.grid_columnconfigure(2, weight
=1)
interior
.grid_rowconfigure(2, weight
=1)
self
.createlabel(interior
)
# Initialise instance variables.
for info
in self
['messagetypes'].values():
if self
._numPriorities
< info
[0]:
self
._numPriorities
= info
[0]
self
._numPriorities
= self
._numPriorities
+ 1
self
._timer
= [None] * self
._numPriorities
self
._messagetext
= [''] * self
._numPriorities
self
._activemessage
= [0] * self
._numPriorities
# Check keywords and initialise options.
for timerId
in self
._timer
:
self
.after_cancel(timerId
)
self
._timer
= [None] * self
._numPriorities
Pmw
.MegaWidget
.destroy(self
)
def message(self
, type, text
):
# Display a message in the message bar.
(priority
, showtime
, bells
, logmessage
) = self
['messagetypes'][type]
self
._activemessage
[priority
] = 1
self
._messagetext
[priority
] = string
.replace(text
, '\n', ' ')
self
._redisplayInfoMessage
()
# Should log this text to a text widget.
if self
._timer
[priority
] is not None:
self
.after_cancel(self
._timer
[priority
])
# Define a callback to clear this message after a time.
def _clearmessage(self
=self
, priority
=priority
):
self
._clearActivemessage
(priority
)
mseconds
= int(showtime
* 1000)
self
._timer
[priority
] = self
.after(mseconds
, _clearmessage
)
def helpmessage(self
, text
):
self
.resetmessages('help')
self
.message('help', text
)
def resetmessages(self
, type):
priority
= self
['messagetypes'][type][0]
self
._clearActivemessage
(priority
)
for messagetype
, info
in self
['messagetypes'].items():
if thisPriority
< priority
and showtime
!= 0:
self
._clearActivemessage
(thisPriority
)
def _clearActivemessage(self
, priority
):
self
._activemessage
[priority
] = 0
if self
._timer
[priority
] is not None:
self
.after_cancel(self
._timer
[priority
])
self
._timer
[priority
] = None
self
._redisplayInfoMessage
()
def _redisplayInfoMessage(self
):
for priority
in range(self
._numPriorities
- 1, -1, -1):
if self
._activemessage
[priority
]:
text
= self
._messagetext
[priority
]
self
._messageBarEntry
.configure(state
= 'normal')
self
._messageBarEntry
.delete(0, 'end')
self
._messageBarEntry
.insert('end', text
)
# Can't always use 'disabled', since this greys out text in Tk 8.4.2
self
._messageBarEntry
.configure(state
= 'readonly')
self
._messageBarEntry
.configure(state
= 'disabled')
Pmw
.forwardmethods(MessageBar
, Tkinter
.Entry
, '_messageBarEntry')