#Pmw copyright
#Copyright 1997-1999 Telstra Corporation Limited, Australia
#Copyright 2000-2002 Really Good Software Pty Ltd, Australia
#Permission is hereby granted, free of charge, to any person obtaining a copy
#of this software and associated documentation files (the "Software"), to deal
#in the Software without restriction, including without limitation the rights
#to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
#copies of the Software, and to permit persons to whom the Software is furnished
#to do so, subject to the following conditions:
#The above copyright notice and this permission notice shall be included in all
#copies or substantial portions of the Software.
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
#INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
#PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
#HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
#OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
#SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
title = 'Pmw.Balloon demonstration'
# Import Pmw from this directory tree.
import sys
sys.path[:0] = ['../../..']
import Tkinter
import Pmw
class Demo:
def __init__(self, parent):
# Create the Balloon.
self.balloon = Pmw.Balloon(parent)
# Create some widgets and megawidgets with balloon help.
frame = Tkinter.Frame(parent)
frame.pack(padx = 10, pady = 5)
field = Pmw.EntryField(frame,
labelpos = 'nw',
label_text = 'Command:')
field.setentry('mycommand -name foo')
field.pack(side = 'left', padx = 10)
self.balloon.bind(field, 'Command to\nstart/stop',
'Enter the shell command to control')
start = Tkinter.Button(frame, text='Start')
start.pack(side='left', padx = 10)
self.balloon.bind(start, 'Start the command')
stop = Tkinter.Button(frame, text='Stop')
stop.pack(side='left', padx = 10)
self.balloon.bind(stop, 'Stop the command')
self.suicide = Tkinter.Button(frame, text='Kill me soon!',
command = self.killButton)
self.suicide.pack(side='left', padx = 10)
self.balloon.bind(self.suicide, 'Watch this button disappear!')
scrolledCanvas = Pmw.ScrolledCanvas(parent,
canvas_width = 300,
canvas_height = 115,
)
scrolledCanvas.pack()
canvas = scrolledCanvas.component('canvas')
self.canvas = canvas
# Create some canvas items and individual help.
item = canvas.create_arc(5, 5, 35, 35, fill = 'red', extent = 315)
self.balloon.tagbind(canvas, item, 'This is help for\nan arc item')
item = canvas.create_bitmap(20, 150, bitmap = 'question')
self.balloon.tagbind(canvas, item, 'This is help for\na bitmap')
item = canvas.create_line(50, 60, 70, 80, 85, 20, width = 5)
self.balloon.tagbind(canvas, item, 'This is help for\na line item')
item = canvas.create_text(10, 90, text = 'Canvas items with balloons',
anchor = 'nw', font = field.cget('entry_font'))
self.balloon.tagbind(canvas, item, 'This is help for\na text item')
# Create two canvas items which have the same tag and which use
# the same help.
canvas.create_rectangle(100, 10, 170, 50, fill = 'aliceblue',
tags = 'TAG1')
self.bluecircle = canvas.create_oval(110, 30, 160, 80, fill = 'blue',
tags = 'TAG1')
self.balloon.tagbind(canvas, 'TAG1',
'This is help for the two blue items' + '\n' * 10 +
'It is very, very big.',
'This is help for the two blue items')
item = canvas.create_text(180, 10, text = 'Delete',
anchor = 'nw', font = field.cget('entry_font'))
self.balloon.tagbind(canvas, item,
'After 2 seconds,\ndelete the blue circle')
canvas.tag_bind(item, '', self._canvasButtonpress)
scrolledCanvas.resizescrollregion()
scrolledText = Pmw.ScrolledText(parent,
text_width = 32,
text_height = 4,
text_wrap = 'none',
)
scrolledText.pack(pady = 5)
text = scrolledText.component('text')
self.text = text
text.insert('end',
'This is a text widget with ', '',
' balloon', 'TAG1',
'\nhelp. Find the ', '',
' text ', 'TAG1',
' tagged with', '',
' help.', 'TAG2',
'\n', '',
'Remove tag 1.', 'TAG3',
'\nAnother line.\nAnd another', '',
)
text.tag_configure('TAG1', borderwidth = 2, relief = 'sunken')
text.tag_configure('TAG3', borderwidth = 2, relief = 'raised')
self.balloon.tagbind(text, 'TAG1',
'There is one secret\nballoon help.\nCan you find it?')
self.balloon.tagbind(text, 'TAG2',
'Well done!\nYou found it!')
self.balloon.tagbind(text, 'TAG3',
'After 2 seconds\ndelete the tag')
text.tag_bind('TAG3', '', self._textButtonpress)
frame = Tkinter.Frame(parent)
frame.pack(padx = 10)
self.toggleBalloonVar = Tkinter.IntVar()
self.toggleBalloonVar.set(1)
toggle = Tkinter.Checkbutton(frame,
variable = self.toggleBalloonVar,
text = 'Balloon help', command = self.toggle)
toggle.pack(side = 'left', padx = 10)
self.balloon.bind(toggle, 'Toggle balloon help\non and off')
self.toggleStatusVar = Tkinter.IntVar()
self.toggleStatusVar.set(1)
toggle = Tkinter.Checkbutton(frame,
variable = self.toggleStatusVar,
text = 'Status help', command = self.toggle)
toggle.pack(side = 'left', padx = 10)
self.balloon.bind(toggle,
'Toggle status help on and off, on and off' + '\n' * 10 +
'It is very, very big, too.',
'Toggle status help on and off')
# Create and pack the MessageBar.
messageBar = Pmw.MessageBar(parent,
entry_width = 40,
entry_relief='groove',
labelpos = 'w',
label_text = 'Status:')
messageBar.pack(fill = 'x', expand = 1, padx = 10, pady = 5)
# Configure the balloon to display its status messages in the
# message bar.
self.balloon.configure(statuscommand = messageBar.helpmessage)
def toggle(self):
if self.toggleBalloonVar.get():
if self.toggleStatusVar.get():
self.balloon.configure(state = 'both')
else:
self.balloon.configure(state = 'balloon')
else:
if self.toggleStatusVar.get():
self.balloon.configure(state = 'status')
else:
self.balloon.configure(state = 'none')
def killButton(self):
# Test for old bug when destroying widgets 1) while the
# balloon was up and 2) during the initwait period.
print 'Destroying button in 2 seconds'
self.suicide.after(2000, self.suicide.destroy)
def _canvasButtonpress(self, event):
print 'Destroying blue circle in 2 seconds'
self.canvas.after(2000, self.deleteBlueCircle)
def deleteBlueCircle(self):
self.balloon.tagunbind(self.canvas, self.bluecircle)
self.canvas.delete(self.bluecircle)
def _textButtonpress(self, event):
print 'Deleting the text tag in 2 seconds'
self.text.after(2000, self.deleteTextTag)
def deleteTextTag(self):
self.balloon.tagunbind(self.text, 'TAG1')
self.text.tag_delete('TAG1')
######################################################################
# Create demo in root window for testing.
if __name__ == '__main__':
root = Tkinter.Tk()
Pmw.initialise(root, 12, fontScheme = 'default')
root.title(title)
exitButton = Tkinter.Button(root, text = 'Exit', command = root.destroy)
exitButton.pack(side = 'bottom')
widget = Demo(root)
root.mainloop()