mirror of
https://github.com/python/cpython.git
synced 2025-07-23 11:15:24 +00:00
Matt's examples
This commit is contained in:
parent
884657af49
commit
35820f77e4
33 changed files with 1876 additions and 0 deletions
30
Demo/tkinter/matt/00-HELLO-WORLD.py
Normal file
30
Demo/tkinter/matt/00-HELLO-WORLD.py
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
from Tkinter import *
|
||||||
|
|
||||||
|
# note that there is no explicit call to start Tk.
|
||||||
|
# Tkinter is smart enough to start the system if it's not already going.
|
||||||
|
|
||||||
|
class Test(Frame):
|
||||||
|
def printit(self):
|
||||||
|
print "hi"
|
||||||
|
|
||||||
|
def createWidgets(self):
|
||||||
|
self.QUIT = Button(self, {'text': 'QUIT',
|
||||||
|
'fg': 'red',
|
||||||
|
'command': self.quit})
|
||||||
|
|
||||||
|
self.QUIT.pack({'side': 'left', 'fill': 'both'})
|
||||||
|
|
||||||
|
|
||||||
|
# a hello button
|
||||||
|
self.hi_there = Button(self, {'text': 'Hello',
|
||||||
|
'command' : self.printit})
|
||||||
|
self.hi_there.pack({'side': 'left'})
|
||||||
|
|
||||||
|
|
||||||
|
def __init__(self, master=None):
|
||||||
|
Frame.__init__(self, master)
|
||||||
|
Pack.config(self)
|
||||||
|
self.createWidgets()
|
||||||
|
|
||||||
|
test = Test()
|
||||||
|
test.mainloop()
|
30
Demo/tkinter/matt/README
Normal file
30
Demo/tkinter/matt/README
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
This directory contains some ad-hoc examples of Tkinter widget
|
||||||
|
creation. The files named
|
||||||
|
|
||||||
|
*-simple.py
|
||||||
|
|
||||||
|
are the ones to start with if you're looking for a bare-bones usage of
|
||||||
|
a widget. The other files are meant to show common usage patters that
|
||||||
|
are a tad more involved.
|
||||||
|
|
||||||
|
If you have a suggestion for an example program, please send mail to
|
||||||
|
|
||||||
|
conway@virginia.edu
|
||||||
|
|
||||||
|
and I'll include it.
|
||||||
|
|
||||||
|
|
||||||
|
matt
|
||||||
|
|
||||||
|
TODO
|
||||||
|
-------
|
||||||
|
The X selection
|
||||||
|
Dialog Boxes
|
||||||
|
More canvas examples
|
||||||
|
Message widgets
|
||||||
|
Text Editors
|
||||||
|
Scrollbars
|
||||||
|
Listboxes
|
||||||
|
|
||||||
|
|
||||||
|
|
36
Demo/tkinter/matt/animation-simple.py
Normal file
36
Demo/tkinter/matt/animation-simple.py
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
from Tkinter import *
|
||||||
|
|
||||||
|
# This program shows how to use the "after" function to make animation.
|
||||||
|
|
||||||
|
class Test(Frame):
|
||||||
|
def printit(self):
|
||||||
|
print "hi"
|
||||||
|
|
||||||
|
def createWidgets(self):
|
||||||
|
self.QUIT = Button(self, {'text': 'QUIT',
|
||||||
|
'fg': 'red',
|
||||||
|
'command': self.quit})
|
||||||
|
self.QUIT.pack({'side': 'left', 'fill': 'both'})
|
||||||
|
|
||||||
|
self.draw = Canvas(self, {"width" : "5i", "height" : "5i"})
|
||||||
|
|
||||||
|
# all of these work..
|
||||||
|
self.draw.create_polygon("0", "0", "10", "0", "10", "10", "0" , "10", {"tags" : "thing"})
|
||||||
|
self.draw.pack({'side': 'left'})
|
||||||
|
|
||||||
|
def moveThing(self, *args):
|
||||||
|
# move 1/10 of an inch every 1/10 sec (1" per second, smoothly)
|
||||||
|
self.draw.move("thing", "0.01i", "0.01i")
|
||||||
|
self.after(10, self.moveThing)
|
||||||
|
|
||||||
|
|
||||||
|
def __init__(self, master=None):
|
||||||
|
Frame.__init__(self, master)
|
||||||
|
Pack.config(self)
|
||||||
|
self.createWidgets()
|
||||||
|
self.after(10, self.moveThing)
|
||||||
|
|
||||||
|
|
||||||
|
test = Test()
|
||||||
|
|
||||||
|
test.mainloop()
|
51
Demo/tkinter/matt/animation-w-velocity-ctrl.py
Normal file
51
Demo/tkinter/matt/animation-w-velocity-ctrl.py
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
from Tkinter import *
|
||||||
|
|
||||||
|
# this is the same as simple-demo-1.py, but uses
|
||||||
|
# subclassing.
|
||||||
|
# note that there is no explicit call to start Tk.
|
||||||
|
# Tkinter is smart enough to start the system if it's not already going.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class Test(Frame):
|
||||||
|
def printit(self):
|
||||||
|
print "hi"
|
||||||
|
|
||||||
|
def createWidgets(self):
|
||||||
|
self.QUIT = Button(self, {'text': 'QUIT',
|
||||||
|
'fg': 'red',
|
||||||
|
'command': self.quit})
|
||||||
|
self.QUIT.pack({'side': 'bottom', 'fill': 'both'})
|
||||||
|
|
||||||
|
self.draw = Canvas(self, {"width" : "5i", "height" : "5i"})
|
||||||
|
|
||||||
|
self.speed = Scale(self, {"orient": "horiz",
|
||||||
|
"from" : -100,
|
||||||
|
"to" : 100})
|
||||||
|
|
||||||
|
self.speed.pack({'side': 'bottom', "fill" : "x"})
|
||||||
|
|
||||||
|
# all of these work..
|
||||||
|
self.draw.create_polygon("0", "0", "10", "0", "10", "10", "0" , "10", {"tags" : "thing"})
|
||||||
|
self.draw.pack({'side': 'left'})
|
||||||
|
|
||||||
|
def moveThing(self, *args):
|
||||||
|
velocity = self.speed.get()
|
||||||
|
str = float(velocity) / 1000.0
|
||||||
|
str = `str` + "i"
|
||||||
|
self.draw.move("thing", str, str)
|
||||||
|
self.after(10, self.moveThing)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def __init__(self, master=None):
|
||||||
|
Frame.__init__(self, master)
|
||||||
|
Pack.config(self)
|
||||||
|
self.createWidgets()
|
||||||
|
self.after(10, self.moveThing)
|
||||||
|
|
||||||
|
|
||||||
|
test = Test()
|
||||||
|
|
||||||
|
test.mainloop()
|
30
Demo/tkinter/matt/canvas-demo-simple.py
Normal file
30
Demo/tkinter/matt/canvas-demo-simple.py
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
from Tkinter import *
|
||||||
|
|
||||||
|
# this program creates a canvas and puts a single polygon on the canvas
|
||||||
|
|
||||||
|
class Test(Frame):
|
||||||
|
def printit(self):
|
||||||
|
print "hi"
|
||||||
|
|
||||||
|
def createWidgets(self):
|
||||||
|
self.QUIT = Button(self, {'text': 'QUIT',
|
||||||
|
'fg': 'red',
|
||||||
|
'command': self.quit})
|
||||||
|
self.QUIT.pack({'side': 'bottom', 'fill': 'both'})
|
||||||
|
|
||||||
|
self.draw = Canvas(self, {"width" : "5i", "height" : "5i"})
|
||||||
|
|
||||||
|
# see the other demos for other ways of specifying coords for a polygon
|
||||||
|
self.draw.create_polygon("0i", "0i", "3i", "0i", "3i", "3i", "0i" , "3i")
|
||||||
|
|
||||||
|
self.draw.pack({'side': 'left'})
|
||||||
|
|
||||||
|
|
||||||
|
def __init__(self, master=None):
|
||||||
|
Frame.__init__(self, master)
|
||||||
|
Pack.config(self)
|
||||||
|
self.createWidgets()
|
||||||
|
|
||||||
|
test = Test()
|
||||||
|
|
||||||
|
test.mainloop()
|
60
Demo/tkinter/matt/canvas-gridding.py
Normal file
60
Demo/tkinter/matt/canvas-gridding.py
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
from Tkinter import *
|
||||||
|
|
||||||
|
# this is the same as simple-demo-1.py, but uses
|
||||||
|
# subclassing.
|
||||||
|
# note that there is no explicit call to start Tk.
|
||||||
|
# Tkinter is smart enough to start the system if it's not already going.
|
||||||
|
|
||||||
|
class Test(Frame):
|
||||||
|
def printit(self):
|
||||||
|
print "hi"
|
||||||
|
|
||||||
|
def createWidgets(self):
|
||||||
|
self.QUIT = Button(self, {'text': 'QUIT',
|
||||||
|
'bg': 'red',
|
||||||
|
'fg': 'white',
|
||||||
|
'height' : 3,
|
||||||
|
'command': self.quit})
|
||||||
|
self.QUIT.pack({'side': 'bottom', 'fill': 'both'})
|
||||||
|
|
||||||
|
self.canvasObject = Canvas(self, {"width" : "5i", "height" : "5i"})
|
||||||
|
self.canvasObject.pack({'side': 'left'})
|
||||||
|
|
||||||
|
def mouseDown(self, event):
|
||||||
|
# canvas x and y take the screen coords from the event and translate
|
||||||
|
# them into the coordinate system of the canvas object
|
||||||
|
self.startx = self.canvasObject.canvasx(event.x, self.griddingSize)
|
||||||
|
self.starty = self.canvasObject.canvasy(event.y, self.griddingSize)
|
||||||
|
|
||||||
|
def mouseMotion(self, event):
|
||||||
|
# canvas x and y take the screen coords from the event and translate
|
||||||
|
# them into the coordinate system of the canvas object
|
||||||
|
x = self.canvasObject.canvasx(event.x, self.griddingsize)
|
||||||
|
y = self.canvasObject.canvasy(event.y, self.griddingsize)
|
||||||
|
|
||||||
|
if (self.startx != event.x) and (self.starty != event.y) :
|
||||||
|
self.canvasObject.delete(self.rubberbandBox)
|
||||||
|
self.rubberbandBox = self.canvasObject.create_rectangle(self.startx, self.starty, x, y)
|
||||||
|
# this flushes the output, making sure that
|
||||||
|
# the rectangle makes it to the screen
|
||||||
|
# before the next event is handled
|
||||||
|
self.update_idletasks()
|
||||||
|
|
||||||
|
def __init__(self, master=None):
|
||||||
|
Frame.__init__(self, master)
|
||||||
|
Pack.config(self)
|
||||||
|
self.createWidgets()
|
||||||
|
|
||||||
|
# this is a "tagOrId" for the rectangle we draw on the canvas
|
||||||
|
self.rubberbandBox = None
|
||||||
|
|
||||||
|
# this is the size of the gridding squares
|
||||||
|
self.griddingSize = 50
|
||||||
|
|
||||||
|
Widget.bind(self.canvasObject, "<Button-1>", self.mouseDown)
|
||||||
|
Widget.bind(self.canvasObject, "<Button1-Motion>", self.mouseMotion)
|
||||||
|
|
||||||
|
|
||||||
|
test = Test()
|
||||||
|
|
||||||
|
test.mainloop()
|
70
Demo/tkinter/matt/canvas-moving-or-creating.py
Normal file
70
Demo/tkinter/matt/canvas-moving-or-creating.py
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
from Tkinter import *
|
||||||
|
|
||||||
|
# this file demonstrates a more sophisticated movement --
|
||||||
|
# move dots or create new ones if you click outside the dots
|
||||||
|
|
||||||
|
class Test(Frame):
|
||||||
|
###################################################################
|
||||||
|
###### Event callbacks for THE CANVAS (not the stuff drawn on it)
|
||||||
|
###################################################################
|
||||||
|
def mouseDown(self, event):
|
||||||
|
# see if we're inside a dot. If we are, it
|
||||||
|
# gets tagged as "current" for free by tk.
|
||||||
|
|
||||||
|
if not event.widget.find_withtag("current"):
|
||||||
|
# there is no dot here, so we can make one,
|
||||||
|
# and bind some interesting behavior to it.
|
||||||
|
# ------
|
||||||
|
|
||||||
|
# create a dot, and mark it as current
|
||||||
|
fred = self.draw.create_oval(event.x - 10, event.y -10, event.x +10, event.y + 10,
|
||||||
|
{"fill" : "green", "tag" : "current"})
|
||||||
|
|
||||||
|
self.draw.bind(fred, "<Any-Enter>", self.mouseEnter)
|
||||||
|
self.draw.bind(fred, "<Any-Leave>", self.mouseLeave)
|
||||||
|
|
||||||
|
self.lastx = event.x
|
||||||
|
self.lasty = event.y
|
||||||
|
|
||||||
|
|
||||||
|
def mouseMove(self, event):
|
||||||
|
self.draw.move("current", event.x - self.lastx, event.y - self.lasty)
|
||||||
|
self.lastx = event.x
|
||||||
|
self.lasty = event.y
|
||||||
|
|
||||||
|
###################################################################
|
||||||
|
###### Event callbacks for canvas ITEMS (stuff drawn on the canvas)
|
||||||
|
###################################################################
|
||||||
|
def mouseEnter(self, event):
|
||||||
|
# the "current" tag is applied to the object the cursor is over.
|
||||||
|
# this happens automatically.
|
||||||
|
self.draw.itemconfig("current", {"fill" : "red"})
|
||||||
|
|
||||||
|
def mouseLeave(self, event):
|
||||||
|
# the "current" tag is applied to the object the cursor is over.
|
||||||
|
# this happens automatically.
|
||||||
|
self.draw.itemconfig("current", {"fill" : "blue"})
|
||||||
|
|
||||||
|
|
||||||
|
def createWidgets(self):
|
||||||
|
self.QUIT = Button(self, {'text': 'QUIT',
|
||||||
|
'fg': 'red',
|
||||||
|
'command': self.quit})
|
||||||
|
self.QUIT.pack({'side': 'left', 'fill': 'both'})
|
||||||
|
self.draw = Canvas(self, {"width" : "5i", "height" : "5i"})
|
||||||
|
self.draw.pack({'side': 'left'})
|
||||||
|
|
||||||
|
|
||||||
|
Widget.bind(self.draw, "<1>", self.mouseDown)
|
||||||
|
Widget.bind(self.draw, "<B1-Motion>", self.mouseMove)
|
||||||
|
|
||||||
|
def __init__(self, master=None):
|
||||||
|
Frame.__init__(self, master)
|
||||||
|
Pack.config(self)
|
||||||
|
self.createWidgets()
|
||||||
|
|
||||||
|
test = Test()
|
||||||
|
test.mainloop()
|
||||||
|
|
||||||
|
|
||||||
|
|
60
Demo/tkinter/matt/canvas-moving-w-mouse.py
Normal file
60
Demo/tkinter/matt/canvas-moving-w-mouse.py
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
from Tkinter import *
|
||||||
|
|
||||||
|
# this file demonstrates the movement of a single canvas item under mouse control
|
||||||
|
|
||||||
|
class Test(Frame):
|
||||||
|
###################################################################
|
||||||
|
###### Event callbacks for THE CANVAS (not the stuff drawn on it)
|
||||||
|
###################################################################
|
||||||
|
def mouseDown(self, event):
|
||||||
|
# remember where the mouse went down
|
||||||
|
self.lastx = event.x
|
||||||
|
self.lasty = event.y
|
||||||
|
|
||||||
|
|
||||||
|
def mouseMove(self, event):
|
||||||
|
# whatever the mouse is over gets tagged as "current" for free by tk.
|
||||||
|
self.draw.move("current", event.x - self.lastx, event.y - self.lasty)
|
||||||
|
self.lastx = event.x
|
||||||
|
self.lasty = event.y
|
||||||
|
|
||||||
|
###################################################################
|
||||||
|
###### Event callbacks for canvas ITEMS (stuff drawn on the canvas)
|
||||||
|
###################################################################
|
||||||
|
def mouseEnter(self, event):
|
||||||
|
# the "current" tag is applied to the object the cursor is over.
|
||||||
|
# this happens automatically.
|
||||||
|
self.draw.itemconfig("current", {"fill" : "red"})
|
||||||
|
|
||||||
|
def mouseLeave(self, event):
|
||||||
|
# the "current" tag is applied to the object the cursor is over.
|
||||||
|
# this happens automatically.
|
||||||
|
self.draw.itemconfig("current", {"fill" : "blue"})
|
||||||
|
|
||||||
|
|
||||||
|
def createWidgets(self):
|
||||||
|
self.QUIT = Button(self, {'text': 'QUIT',
|
||||||
|
'fg': 'red',
|
||||||
|
'command': self.quit})
|
||||||
|
self.QUIT.pack({'side': 'left', 'fill': 'both'})
|
||||||
|
self.draw = Canvas(self, {"width" : "5i", "height" : "5i"})
|
||||||
|
self.draw.pack({'side': 'left'})
|
||||||
|
|
||||||
|
|
||||||
|
fred = self.draw.create_oval(0, 0, 20, 20,
|
||||||
|
{"fill" : "green", "tag" : "selected"})
|
||||||
|
|
||||||
|
self.draw.bind(fred, "<Any-Enter>", self.mouseEnter)
|
||||||
|
self.draw.bind(fred, "<Any-Leave>", self.mouseLeave)
|
||||||
|
|
||||||
|
|
||||||
|
Widget.bind(self.draw, "<1>", self.mouseDown)
|
||||||
|
Widget.bind(self.draw, "<B1-Motion>", self.mouseMove)
|
||||||
|
|
||||||
|
def __init__(self, master=None):
|
||||||
|
Frame.__init__(self, master)
|
||||||
|
Pack.config(self)
|
||||||
|
self.createWidgets()
|
||||||
|
|
||||||
|
test = Test()
|
||||||
|
test.mainloop()
|
85
Demo/tkinter/matt/canvas-mult-item-sel.py
Normal file
85
Demo/tkinter/matt/canvas-mult-item-sel.py
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
from Tkinter import *
|
||||||
|
|
||||||
|
# allows moving dots with multiple selection.
|
||||||
|
|
||||||
|
SELECTED_COLOR = "red"
|
||||||
|
UNSELECTED_COLOR = "blue"
|
||||||
|
|
||||||
|
class Test(Frame):
|
||||||
|
###################################################################
|
||||||
|
###### Event callbacks for THE CANVAS (not the stuff drawn on it)
|
||||||
|
###################################################################
|
||||||
|
def mouseDown(self, event):
|
||||||
|
# see if we're inside a dot. If we are, it
|
||||||
|
# gets tagged as "current" for free by tk.
|
||||||
|
|
||||||
|
if not event.widget.find_withtag("current"):
|
||||||
|
# we clicked outside of all dots on the canvas. unselect all.
|
||||||
|
|
||||||
|
# re-color everything back to an unselected color
|
||||||
|
self.draw.itemconfig("selected", {"fill" : UNSELECTED_COLOR})
|
||||||
|
# unselect everything
|
||||||
|
self.draw.dtag("selected")
|
||||||
|
else:
|
||||||
|
# mark as "selected" the thing the cursor is under
|
||||||
|
self.draw.addtag("selected", "withtag", "current")
|
||||||
|
# color it as selected
|
||||||
|
self.draw.itemconfig("selected", {"fill": SELECTED_COLOR})
|
||||||
|
|
||||||
|
self.lastx = event.x
|
||||||
|
self.lasty = event.y
|
||||||
|
|
||||||
|
|
||||||
|
def mouseMove(self, event):
|
||||||
|
self.draw.move("selected", event.x - self.lastx, event.y - self.lasty)
|
||||||
|
self.lastx = event.x
|
||||||
|
self.lasty = event.y
|
||||||
|
|
||||||
|
def makeNewDot(self):
|
||||||
|
# create a dot, and mark it as current
|
||||||
|
fred = self.draw.create_oval(0, 0, 20, 20,
|
||||||
|
{"fill" : SELECTED_COLOR, "tag" : "current"})
|
||||||
|
# and make it selected
|
||||||
|
self.draw.addtag("selected", "withtag", "current")
|
||||||
|
|
||||||
|
def createWidgets(self):
|
||||||
|
self.QUIT = Button(self, {'text': 'QUIT',
|
||||||
|
'fg': 'red',
|
||||||
|
'command': self.quit})
|
||||||
|
|
||||||
|
################
|
||||||
|
# make the canvas and bind some behavior to it
|
||||||
|
################
|
||||||
|
self.draw = Canvas(self, {"width" : "5i", "height" : "5i"})
|
||||||
|
Widget.bind(self.draw, "<1>", self.mouseDown)
|
||||||
|
Widget.bind(self.draw, "<B1-Motion>", self.mouseMove)
|
||||||
|
|
||||||
|
|
||||||
|
# and other things.....
|
||||||
|
self.button = Button(self, {"text" : "make a new dot",
|
||||||
|
"command" : self.makeNewDot,
|
||||||
|
"fg" : "blue"})
|
||||||
|
|
||||||
|
self.label = Message(self,
|
||||||
|
{"width" : "5i",
|
||||||
|
"text" : SELECTED_COLOR + " dots are selected and can be dragged.\n" +
|
||||||
|
UNSELECTED_COLOR + " are not selected.\n" +
|
||||||
|
"Click in a dot to select it.\n" +
|
||||||
|
"Click on empty space to deselect all dots." })
|
||||||
|
|
||||||
|
self.QUIT.pack({'side': 'bottom', 'fill': 'both'})
|
||||||
|
self.label.pack({"side" : "bottom", "fill" : "x", "expand" : 1})
|
||||||
|
self.button.pack({"side" : "bottom", "fill" : "x"})
|
||||||
|
self.draw.pack({'side': 'left'})
|
||||||
|
|
||||||
|
|
||||||
|
def __init__(self, master=None):
|
||||||
|
Frame.__init__(self, master)
|
||||||
|
Pack.config(self)
|
||||||
|
self.createWidgets()
|
||||||
|
|
||||||
|
test = Test()
|
||||||
|
test.mainloop()
|
||||||
|
|
||||||
|
|
||||||
|
|
51
Demo/tkinter/matt/canvas-reading-tag-info.py
Normal file
51
Demo/tkinter/matt/canvas-reading-tag-info.py
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
from Tkinter import *
|
||||||
|
|
||||||
|
|
||||||
|
class Test(Frame):
|
||||||
|
def printit(self):
|
||||||
|
print "hi"
|
||||||
|
|
||||||
|
def createWidgets(self):
|
||||||
|
self.QUIT = Button(self, {'text': 'QUIT',
|
||||||
|
'fg': 'red',
|
||||||
|
'command': self.quit})
|
||||||
|
self.QUIT.pack({'side': 'bottom', 'fill': 'both'})
|
||||||
|
|
||||||
|
self.drawing = Canvas(self, {"width" : "5i", "height" : "5i"})
|
||||||
|
|
||||||
|
# make a shape
|
||||||
|
pgon = self.drawing.create_polygon("10", "10", "110", "10", "110", "110", "10" , "110",
|
||||||
|
{"fill" : "red",
|
||||||
|
"tags" : "weee foo groo"})
|
||||||
|
|
||||||
|
# this is how you query an object for its attributes
|
||||||
|
# config options FOR CANVAS ITEMS always come back in tuples of length 5.
|
||||||
|
# 0 attribute name
|
||||||
|
# 1 BLANK
|
||||||
|
# 2 BLANK
|
||||||
|
# 3 default value
|
||||||
|
# 4 current value
|
||||||
|
# the blank spots are for consistency with the config command that
|
||||||
|
# is used for widgets. (remember, this is for ITEMS drawn
|
||||||
|
# on a canvas widget, not widgets)
|
||||||
|
option_value = self.drawing.itemconfig(pgon, "stipple")
|
||||||
|
print "pgon's current stipple value is -->", option_value[4], "<--"
|
||||||
|
option_value = self.drawing.itemconfig(pgon, "fill")
|
||||||
|
print "pgon's current fill value is -->", option_value[4], "<-- when he is usually colored -->", option_value[3], "<--"
|
||||||
|
|
||||||
|
## here we print out all the tags associated with this object
|
||||||
|
option_value = self.drawing.itemconfig(pgon, "tags")
|
||||||
|
print "pgon's tags are", option_value[4]
|
||||||
|
|
||||||
|
self.drawing.pack({'side': 'left'})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def __init__(self, master=None):
|
||||||
|
Frame.__init__(self, master)
|
||||||
|
Pack.config(self)
|
||||||
|
self.createWidgets()
|
||||||
|
|
||||||
|
test = Test()
|
||||||
|
|
||||||
|
test.mainloop()
|
39
Demo/tkinter/matt/canvas-w-widget-draw-el.py
Normal file
39
Demo/tkinter/matt/canvas-w-widget-draw-el.py
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
from Tkinter import *
|
||||||
|
|
||||||
|
# this file demonstrates the creation of widgets as part of a canvas object
|
||||||
|
|
||||||
|
class Test(Frame):
|
||||||
|
def printhi(self):
|
||||||
|
print "hi"
|
||||||
|
|
||||||
|
def createWidgets(self):
|
||||||
|
self.QUIT = Button(self, {'text': 'QUIT',
|
||||||
|
'fg': 'red',
|
||||||
|
'command': self.quit})
|
||||||
|
self.QUIT.pack({'side': 'bottom', 'fill': 'both'})
|
||||||
|
|
||||||
|
self.draw = Canvas(self, {"width" : "5i", "height" : "5i"})
|
||||||
|
|
||||||
|
self.button = Button(self, {"text" : "this is a button",
|
||||||
|
"command" : self.printhi})
|
||||||
|
|
||||||
|
# note here the coords are given in pixels (form the
|
||||||
|
# upper right and corner of the window, as usual for X)
|
||||||
|
# but might just have well been given in inches or points or
|
||||||
|
# whatever...use the "anchor" option to control what point of the
|
||||||
|
# widget (in this case the button) gets mapped to the given x, y.
|
||||||
|
# you can specify corners, edges, center, etc...
|
||||||
|
self.draw.create_window(300, 300, {"window" : self.button})
|
||||||
|
|
||||||
|
self.draw.pack({'side': 'left'})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def __init__(self, master=None):
|
||||||
|
Frame.__init__(self, master)
|
||||||
|
Pack.config(self)
|
||||||
|
self.createWidgets()
|
||||||
|
|
||||||
|
test = Test()
|
||||||
|
|
||||||
|
test.mainloop()
|
67
Demo/tkinter/matt/canvas-with-scrollbars.py
Normal file
67
Demo/tkinter/matt/canvas-with-scrollbars.py
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
from Tkinter import *
|
||||||
|
|
||||||
|
# This example program creates a scroling canvas, and demonstrates
|
||||||
|
# how to tie scrollbars and canvses together. The mechanism
|
||||||
|
# is analogus for listboxes and other widgets with
|
||||||
|
# "xscroll" and "yscroll" configuration options.
|
||||||
|
|
||||||
|
class Test(Frame):
|
||||||
|
def printit(self):
|
||||||
|
print "hi"
|
||||||
|
|
||||||
|
def createWidgets(self):
|
||||||
|
self.question = Label(self, {"text": "Can Find The BLUE Square??????",
|
||||||
|
Pack : {"side" : "top"}})
|
||||||
|
|
||||||
|
self.QUIT = Button(self, {'text': 'QUIT',
|
||||||
|
'bg': 'red',
|
||||||
|
"height" : "3",
|
||||||
|
'command': self.quit})
|
||||||
|
self.QUIT.pack({'side': 'bottom', 'fill': 'both'})
|
||||||
|
spacer = Frame(self, {"height" : "0.25i",
|
||||||
|
Pack : {"side" : "bottom"}})
|
||||||
|
|
||||||
|
# notice that the scroll region (20" x 20") is larger than
|
||||||
|
# displayed size of the widget (5" x 5")
|
||||||
|
self.draw = Canvas(self, {"width" : "5i",
|
||||||
|
"height" : "5i",
|
||||||
|
"bg" : "white",
|
||||||
|
"scrollregion" : "0i 0i 20i 20i"})
|
||||||
|
|
||||||
|
|
||||||
|
self.draw.scrollX = Scrollbar(self, {"orient" : "horizontal"})
|
||||||
|
self.draw.scrollY = Scrollbar(self, {"orient" : "vertical"})
|
||||||
|
|
||||||
|
# now tie the three together. This is standard boilerplate text
|
||||||
|
self.draw['xscroll'] = self.draw.scrollX.set
|
||||||
|
self.draw['yscroll'] = self.draw.scrollY.set
|
||||||
|
self.draw.scrollX['command'] = self.draw.xview
|
||||||
|
self.draw.scrollY['command'] = self.draw.yview
|
||||||
|
|
||||||
|
# draw something. Note that the first square
|
||||||
|
# is visible, but you need to scroll to see the second one.
|
||||||
|
self.draw.create_polygon("0i", "0i", "3.5i", "0i", "3.5i", "3.5i", "0i" , "3.5i")
|
||||||
|
self.draw.create_polygon("10i", "10i", "13.5i", "10i", "13.5i", "13.5i", "10i" , "13.5i", "-fill", "blue")
|
||||||
|
|
||||||
|
|
||||||
|
# pack 'em up
|
||||||
|
self.draw.scrollX.pack({'side': 'bottom',
|
||||||
|
"fill" : "x"})
|
||||||
|
self.draw.scrollY.pack({'side': 'right',
|
||||||
|
"fill" : "y"})
|
||||||
|
self.draw.pack({'side': 'left'})
|
||||||
|
|
||||||
|
|
||||||
|
def scrollCanvasX(self, *args):
|
||||||
|
print "scrolling", args
|
||||||
|
print self.draw.scrollX.get()
|
||||||
|
|
||||||
|
|
||||||
|
def __init__(self, master=None):
|
||||||
|
Frame.__init__(self, master)
|
||||||
|
Pack.config(self)
|
||||||
|
self.createWidgets()
|
||||||
|
|
||||||
|
test = Test()
|
||||||
|
|
||||||
|
test.mainloop()
|
65
Demo/tkinter/matt/dialog-box.py
Normal file
65
Demo/tkinter/matt/dialog-box.py
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
from Tkinter import *
|
||||||
|
|
||||||
|
# this shows how to create a new window with a button in it that can create new windows
|
||||||
|
|
||||||
|
class Test(Frame):
|
||||||
|
def printit(self):
|
||||||
|
print "hi"
|
||||||
|
|
||||||
|
def makeWindow(self):
|
||||||
|
# there is no Tkinter interface to the dialog box. Making one would mean putting
|
||||||
|
# a few wrapper functions in the Tkinter.py file.
|
||||||
|
# even better is to put in a SUIT-like selection of commonly-used dialogs.
|
||||||
|
# the parameters to this call are as follows:
|
||||||
|
|
||||||
|
fred = Toplevel() # a toplevel window that the dialog goes into
|
||||||
|
|
||||||
|
|
||||||
|
# this function returns the index of teh button chosen. In this case, 0 for "yes" and 1 for "no"
|
||||||
|
|
||||||
|
print self.tk.call("tk_dialog", # the command name
|
||||||
|
fred, # the name of a toplevel window
|
||||||
|
"fred the dialog box", # the title on the window
|
||||||
|
"click on a choice", # the message to appear in the window
|
||||||
|
"info", # the bitmap (if any) to appear. If no bitmap is desired, pass ""
|
||||||
|
# legal values here are:
|
||||||
|
# string what it looks like
|
||||||
|
# ----------------------------------------------
|
||||||
|
# error a circle with a slash through it
|
||||||
|
# grey25 grey square
|
||||||
|
# grey50 darker grey square
|
||||||
|
# hourglass use for "wait.."
|
||||||
|
# info a large, lower case "i"
|
||||||
|
# questhead a human head with a "?" in it
|
||||||
|
# question a large "?"
|
||||||
|
# warning a large "!"
|
||||||
|
# @fname any X bitmap where fname is the path to the file
|
||||||
|
#
|
||||||
|
"0", # the index of the default button choice. hitting return selects this
|
||||||
|
"yes", "no") # all remaining parameters are the labels for the
|
||||||
|
# buttons that appear left to right in the dialog box
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def createWidgets(self):
|
||||||
|
self.QUIT = Button(self, {'text': 'QUIT',
|
||||||
|
'fg': 'red',
|
||||||
|
'command': self.quit})
|
||||||
|
|
||||||
|
self.QUIT.pack({'side': 'left', 'fill': 'both'})
|
||||||
|
|
||||||
|
|
||||||
|
# a hello button
|
||||||
|
self.hi_there = Button(self, {'text': 'Make a New Window',
|
||||||
|
'command' : self.makeWindow})
|
||||||
|
self.hi_there.pack({'side': 'left'})
|
||||||
|
|
||||||
|
|
||||||
|
def __init__(self, master=None):
|
||||||
|
Frame.__init__(self, master)
|
||||||
|
Pack.config(self)
|
||||||
|
self.windownum = 0
|
||||||
|
self.createWidgets()
|
||||||
|
|
||||||
|
test = Test()
|
||||||
|
test.mainloop()
|
25
Demo/tkinter/matt/entry-simple.py
Normal file
25
Demo/tkinter/matt/entry-simple.py
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
from Tkinter import *
|
||||||
|
import string
|
||||||
|
|
||||||
|
# This program shows how to use a simple type-in box
|
||||||
|
|
||||||
|
class App(Frame):
|
||||||
|
def __init__(self, master=None):
|
||||||
|
Frame.__init__(self, master)
|
||||||
|
self.pack()
|
||||||
|
|
||||||
|
self.entrythingy = Entry()
|
||||||
|
self.entrythingy.pack()
|
||||||
|
|
||||||
|
# and here we get a callback when the user hits return. we could
|
||||||
|
# make the key that triggers the callback anything we wanted to.
|
||||||
|
# other typical options might be <Key-Tab> or <Key> (for anything)
|
||||||
|
self.entrythingy.bind('<Key-Return>', self.print_contents)
|
||||||
|
|
||||||
|
def print_contents(self, event):
|
||||||
|
print "hi. contents of entry is now ---->", self.entrythingy.get()
|
||||||
|
|
||||||
|
root = App()
|
||||||
|
root.master.title("Foo")
|
||||||
|
root.mainloop()
|
||||||
|
|
47
Demo/tkinter/matt/entry-with-shared-variable.py
Normal file
47
Demo/tkinter/matt/entry-with-shared-variable.py
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
from Tkinter import *
|
||||||
|
import string
|
||||||
|
|
||||||
|
# This program shows how to make a typein box shadow a program variable.
|
||||||
|
|
||||||
|
class App(Frame):
|
||||||
|
def __init__(self, master=None):
|
||||||
|
Frame.__init__(self, master)
|
||||||
|
self.pack()
|
||||||
|
|
||||||
|
self.entrythingy = Entry()
|
||||||
|
self.entrythingy.pack()
|
||||||
|
|
||||||
|
self.button = Button(self, {"text" : "Uppercase The Entry", "command" : self.upper})
|
||||||
|
self.button.pack()
|
||||||
|
|
||||||
|
|
||||||
|
# here we have the text in the entry widget tied to a variable.
|
||||||
|
# changes in the variable are echoed in the widget and vice versa.
|
||||||
|
# Very handy.
|
||||||
|
# there are other Variable types. See Tkinter.py for all
|
||||||
|
# the other variable types that can be shadowed
|
||||||
|
self.contents = StringVar()
|
||||||
|
self.contents.set("this is a variable")
|
||||||
|
self.entrythingy.config({"textvariable":self.contents})
|
||||||
|
|
||||||
|
# and here we get a callback when the user hits return. we could
|
||||||
|
# make the key that triggers the callback anything we wanted to.
|
||||||
|
# other typical options might be <Key-Tab> or <Key> (for anything)
|
||||||
|
self.entrythingy.bind('<Key-Return>', self.print_contents)
|
||||||
|
|
||||||
|
def upper(self):
|
||||||
|
# notice here, we don't actually refer to the entry box.
|
||||||
|
# we just operate on the string variable and we
|
||||||
|
# because it's being looked at by the entry widget, changing
|
||||||
|
# the variable changes the entry widget display automatically.
|
||||||
|
# the strange get/set operators are clunky, true...
|
||||||
|
str = string.upper(self.contents.get())
|
||||||
|
self.contents.set(str)
|
||||||
|
|
||||||
|
def print_contents(self, event):
|
||||||
|
print "hi. contents of entry is now ---->", self.contents.get()
|
||||||
|
|
||||||
|
root = App()
|
||||||
|
root.master.title("Foo")
|
||||||
|
root.mainloop()
|
||||||
|
|
43
Demo/tkinter/matt/killing-window-w-wm.py
Normal file
43
Demo/tkinter/matt/killing-window-w-wm.py
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
from Tkinter import *
|
||||||
|
|
||||||
|
# This file shows how to trap the killing of a window
|
||||||
|
# when the user uses window manager menus (typ. upper left hand corner
|
||||||
|
# menu in the decoration border).
|
||||||
|
|
||||||
|
|
||||||
|
### ******* this isn't really called -- read the comments
|
||||||
|
def my_delete_callback():
|
||||||
|
print "whoops -- tried to delete me!"
|
||||||
|
|
||||||
|
class Test(Frame):
|
||||||
|
def deathHandler(self, event):
|
||||||
|
print self, "is now getting nuked. performing some save here...."
|
||||||
|
|
||||||
|
def createWidgets(self):
|
||||||
|
# a hello button
|
||||||
|
self.hi_there = Button(self, {'text': 'Hello'})
|
||||||
|
self.hi_there.pack({'side': 'left'})
|
||||||
|
|
||||||
|
|
||||||
|
def __init__(self, master=None):
|
||||||
|
Frame.__init__(self, master)
|
||||||
|
Pack.config(self)
|
||||||
|
self.createWidgets()
|
||||||
|
|
||||||
|
###
|
||||||
|
### PREVENT WM kills from happening
|
||||||
|
###
|
||||||
|
|
||||||
|
# the docs would have you do this:
|
||||||
|
|
||||||
|
# self.master.protocol("WM_DELETE_WINDOW", my_delete_callback)
|
||||||
|
|
||||||
|
# unfortunately, some window managers will not send this request to a window.
|
||||||
|
# the "protocol" function seems incapable of trapping these "aggressive" window kills.
|
||||||
|
# this line of code catches everything, tho. The window is deleted, but you have a chance
|
||||||
|
# of cleaning up first.
|
||||||
|
self.bind_all("<Destroy>", self.deathHandler)
|
||||||
|
|
||||||
|
|
||||||
|
test = Test()
|
||||||
|
test.mainloop()
|
268
Demo/tkinter/matt/menu-all-types-of-entries.py
Normal file
268
Demo/tkinter/matt/menu-all-types-of-entries.py
Normal file
|
@ -0,0 +1,268 @@
|
||||||
|
from Tkinter import *
|
||||||
|
|
||||||
|
# some vocabulary to keep from getting confused. This terminology
|
||||||
|
# is something I cooked up for this file, but follows the man pages
|
||||||
|
# pretty closely
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# This is a MENUBUTTON
|
||||||
|
# V
|
||||||
|
# +-------------+
|
||||||
|
# | |
|
||||||
|
#
|
||||||
|
# +------------++------------++------------+
|
||||||
|
# | || || |
|
||||||
|
# | File || Edit || Options | <-------- the MENUBAR
|
||||||
|
# | || || |
|
||||||
|
# +------------++------------++------------+
|
||||||
|
# | New... |
|
||||||
|
# | Open... |
|
||||||
|
# | Print |
|
||||||
|
# | | <-------- This is a MENU. The lines of text in the menu are
|
||||||
|
# | | MENU ENTRIES
|
||||||
|
# | +---------------+
|
||||||
|
# | Open Files > | file1 |
|
||||||
|
# | | file2 |
|
||||||
|
# | | another file | <------ this cascading part is also a MENU
|
||||||
|
# +----------------| |
|
||||||
|
# | |
|
||||||
|
# | |
|
||||||
|
# | |
|
||||||
|
# +---------------+
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# some miscellaneous callbacks
|
||||||
|
def new_file():
|
||||||
|
print "opening new file"
|
||||||
|
|
||||||
|
|
||||||
|
def open_file():
|
||||||
|
print "opening OLD file"
|
||||||
|
|
||||||
|
def print_something():
|
||||||
|
print "picked a menu item"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
anchovies = 0
|
||||||
|
|
||||||
|
def print_anchovies():
|
||||||
|
global anchovies
|
||||||
|
anchovies = not anchovies
|
||||||
|
print "anchovies?", anchovies
|
||||||
|
|
||||||
|
def makeCommandMenu():
|
||||||
|
# make menu button
|
||||||
|
Command_button = Menubutton(mBar, {'text': 'Simple Button Commands',
|
||||||
|
'underline': 0,
|
||||||
|
Pack: {'side': 'left',
|
||||||
|
'padx': '2m'}})
|
||||||
|
|
||||||
|
# make the pulldown part of the File menu. The parameter passed is the master.
|
||||||
|
# we attach it to the button as a python attribute called "menu" by convention.
|
||||||
|
# hopefully this isn't too confusing...
|
||||||
|
Command_button.menu = Menu(Command_button)
|
||||||
|
|
||||||
|
|
||||||
|
# just to be cute, let's disable the undo option:
|
||||||
|
Command_button.menu.add('command', {"label" : "Undo"} )
|
||||||
|
# undo is the 0th entry...
|
||||||
|
Command_button.menu.entryconfig(0, {"state" : "disabled"})
|
||||||
|
|
||||||
|
Command_button.menu.add('command', {'label': 'New...',
|
||||||
|
|
||||||
|
'underline': 0,
|
||||||
|
'command' : new_file})
|
||||||
|
|
||||||
|
|
||||||
|
Command_button.menu.add('command', {'label': 'Open...',
|
||||||
|
'underline': 0,
|
||||||
|
'command' : open_file})
|
||||||
|
|
||||||
|
Command_button.menu.add('command', {'label': 'Different Font',
|
||||||
|
'underline': 0,
|
||||||
|
'font' : '-*-helvetica-*-r-*-*-*-180-*-*-*-*-*-*',
|
||||||
|
'command' : print_something})
|
||||||
|
|
||||||
|
# we can make bitmaps be menu entries too. File format is X11 bitmap.
|
||||||
|
# if you use XV, save it under X11 bitmap format. duh-uh.,..
|
||||||
|
# Command_button.menu.add('command', {'bitmap' : '@/home/mjc4y/ftp/tcl/tk3.6/library/demos/bitmaps/face'})
|
||||||
|
Command_button.menu.add('command', {'bitmap' : '@/home/mjc4y/dilbert/project.status.is.doomed.last.panel.bm'})
|
||||||
|
|
||||||
|
# this is just a line
|
||||||
|
Command_button.menu.add('separator')
|
||||||
|
|
||||||
|
# change the color
|
||||||
|
Command_button.menu.add('command', {'label': 'Quit',
|
||||||
|
'underline': 0,
|
||||||
|
'background' : 'red',
|
||||||
|
'activebackground' : 'green',
|
||||||
|
'command': 'exit'})
|
||||||
|
|
||||||
|
|
||||||
|
# set up a pointer from the file menubutton back to the file menu
|
||||||
|
Command_button['menu'] = Command_button.menu
|
||||||
|
|
||||||
|
return Command_button
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def makeCascadeMenu():
|
||||||
|
# make menu button
|
||||||
|
Cascade_button = Menubutton(mBar, {'text': 'Cascading Menus',
|
||||||
|
'underline': 0,
|
||||||
|
Pack: {'side': 'left',
|
||||||
|
'padx': '2m'}})
|
||||||
|
|
||||||
|
# the primary pulldown
|
||||||
|
Cascade_button.menu = Menu(Cascade_button)
|
||||||
|
|
||||||
|
# this is the menu that cascades from the primary pulldown....
|
||||||
|
Cascade_button.menu.choices = Menu(Cascade_button.menu)
|
||||||
|
|
||||||
|
# ...and this is a menu that cascades from that.
|
||||||
|
Cascade_button.menu.choices.wierdones = Menu(Cascade_button.menu.choices)
|
||||||
|
|
||||||
|
# then you define the menus from the deepest level on up.
|
||||||
|
Cascade_button.menu.choices.wierdones.add('command', {'label' : 'avacado'})
|
||||||
|
Cascade_button.menu.choices.wierdones.add('command', {'label' : 'belgian endive'})
|
||||||
|
Cascade_button.menu.choices.wierdones.add('command', {'label' : 'beefaroni'})
|
||||||
|
|
||||||
|
# definition of the menu one level up...
|
||||||
|
Cascade_button.menu.choices.add('command', {'label' : 'Chocolate'})
|
||||||
|
Cascade_button.menu.choices.add('command', {'label' : 'Vanilla'})
|
||||||
|
Cascade_button.menu.choices.add('command', {'label' : 'TuttiFruiti'})
|
||||||
|
Cascade_button.menu.choices.add('command', {'label' : 'WopBopaLoopBapABopBamBoom'})
|
||||||
|
Cascade_button.menu.choices.add('command', {'label' : 'Rocky Road'})
|
||||||
|
Cascade_button.menu.choices.add('command', {'label' : 'BubbleGum'})
|
||||||
|
Cascade_button.menu.choices.add('cascade', {'label' : 'Wierd Flavors',
|
||||||
|
'menu' : Cascade_button.menu.choices.wierdones})
|
||||||
|
|
||||||
|
# and finally, the definition for the top level
|
||||||
|
Cascade_button.menu.add('cascade', {'label' : 'more choices',
|
||||||
|
'menu' : Cascade_button.menu.choices})
|
||||||
|
|
||||||
|
|
||||||
|
Cascade_button['menu'] = Cascade_button.menu
|
||||||
|
|
||||||
|
return Cascade_button
|
||||||
|
|
||||||
|
def makeCheckbuttonMenu():
|
||||||
|
global fred
|
||||||
|
# make menu button
|
||||||
|
Checkbutton_button = Menubutton(mBar, {'text': 'Checkbutton Menus',
|
||||||
|
'underline': 0,
|
||||||
|
Pack: {'side': 'left',
|
||||||
|
'padx': '2m'}})
|
||||||
|
|
||||||
|
# the primary pulldown
|
||||||
|
Checkbutton_button.menu = Menu(Checkbutton_button)
|
||||||
|
|
||||||
|
# and all the check buttons. Note that the "variable" "onvalue" and "offvalue" options
|
||||||
|
# are not supported correctly at present. You have to do all your application
|
||||||
|
# work through the calback.
|
||||||
|
Checkbutton_button.menu.add('checkbutton', {'label': 'Pepperoni'})
|
||||||
|
Checkbutton_button.menu.add('checkbutton', {'label': 'Sausage'})
|
||||||
|
Checkbutton_button.menu.add('checkbutton', {'label': 'Extra Cheese'})
|
||||||
|
|
||||||
|
# so here's a callback
|
||||||
|
Checkbutton_button.menu.add('checkbutton', {'label': 'Anchovy',
|
||||||
|
'command' : print_anchovies})
|
||||||
|
|
||||||
|
# and start with anchovies selected to be on. Do this by
|
||||||
|
# calling invoke on this menu option. To refer to the "anchovy" menu
|
||||||
|
# entry we need to know it's index. To do this, we use the index method
|
||||||
|
# which takes arguments of several forms:
|
||||||
|
#
|
||||||
|
# argument what it does
|
||||||
|
# -----------------------------------
|
||||||
|
# a number -- this is useless.
|
||||||
|
# "last" -- last option in the menu
|
||||||
|
# "none" -- used with the activate command. see the man page on menus
|
||||||
|
# "active" -- the currently active menu option. A menu option is made active
|
||||||
|
# with the 'activate' method
|
||||||
|
# "@number" -- where 'number' is an integer and is treated like a y coordinate in pixels
|
||||||
|
# string pattern -- this is the option used below, and attempts to match "labels" using the
|
||||||
|
# rules of Tcl_StringMatch
|
||||||
|
Checkbutton_button.menu.invoke(Checkbutton_button.menu.index('Anchovy'))
|
||||||
|
|
||||||
|
# set up a pointer from the file menubutton back to the file menu
|
||||||
|
Checkbutton_button['menu'] = Checkbutton_button.menu
|
||||||
|
|
||||||
|
return Checkbutton_button
|
||||||
|
|
||||||
|
|
||||||
|
def makeRadiobuttonMenu():
|
||||||
|
# make menu button
|
||||||
|
Radiobutton_button = Menubutton(mBar, {'text': 'Radiobutton Menus',
|
||||||
|
'underline': 0,
|
||||||
|
Pack: {'side': 'left',
|
||||||
|
'padx': '2m'}})
|
||||||
|
|
||||||
|
# the primary pulldown
|
||||||
|
Radiobutton_button.menu = Menu(Radiobutton_button)
|
||||||
|
|
||||||
|
# and all the Radio buttons. Note that the "variable" "onvalue" and "offvalue" options
|
||||||
|
# are not supported correctly at present. You have to do all your application
|
||||||
|
# work through the calback.
|
||||||
|
Radiobutton_button.menu.add('radiobutton', {'label': 'Republican'})
|
||||||
|
Radiobutton_button.menu.add('radiobutton', {'label': 'Democrat'})
|
||||||
|
Radiobutton_button.menu.add('radiobutton', {'label': 'Libertarian'})
|
||||||
|
Radiobutton_button.menu.add('radiobutton', {'label': 'Commie'})
|
||||||
|
Radiobutton_button.menu.add('radiobutton', {'label': 'Facist'})
|
||||||
|
Radiobutton_button.menu.add('radiobutton', {'label': 'Labor Party'})
|
||||||
|
Radiobutton_button.menu.add('radiobutton', {'label': 'Torie'})
|
||||||
|
Radiobutton_button.menu.add('radiobutton', {'label': 'Independent'})
|
||||||
|
Radiobutton_button.menu.add('radiobutton', {'label': 'Anarchist'})
|
||||||
|
Radiobutton_button.menu.add('radiobutton', {'label': 'No Opinion'})
|
||||||
|
|
||||||
|
# set up a pointer from the file menubutton back to the file menu
|
||||||
|
Radiobutton_button['menu'] = Radiobutton_button.menu
|
||||||
|
|
||||||
|
return Radiobutton_button
|
||||||
|
|
||||||
|
|
||||||
|
def makeDisabledMenu():
|
||||||
|
Dummy_button = Menubutton(mBar, {'text': 'Dead Menu',
|
||||||
|
'underline': 0,
|
||||||
|
Pack: {'side': 'left',
|
||||||
|
'padx': '2m'}})
|
||||||
|
|
||||||
|
# this is the standard way of turning off a whole menu
|
||||||
|
Dummy_button["state"] = "disabled"
|
||||||
|
return Dummy_button
|
||||||
|
|
||||||
|
#################################################
|
||||||
|
#### Main starts here ...
|
||||||
|
root = Tk()
|
||||||
|
|
||||||
|
|
||||||
|
# make a menu bar
|
||||||
|
mBar = Frame(root, {'relief': 'raised',
|
||||||
|
'bd': 2,
|
||||||
|
Pack: {'side': 'top',
|
||||||
|
'fill': 'x'}})
|
||||||
|
|
||||||
|
Command_button = makeCommandMenu()
|
||||||
|
Cascade_button = makeCascadeMenu()
|
||||||
|
Checkbutton_button = makeCheckbuttonMenu()
|
||||||
|
Radiobutton_button = makeRadiobuttonMenu()
|
||||||
|
NoMenu = makeDisabledMenu()
|
||||||
|
|
||||||
|
# finally, install the buttons in the menu bar.
|
||||||
|
# This allows for scanning from one menubutton to the next.
|
||||||
|
mBar.tk_menuBar(Command_button, Cascade_button, Checkbutton_button, Radiobutton_button, NoMenu)
|
||||||
|
|
||||||
|
|
||||||
|
root.title('menu demo')
|
||||||
|
root.iconname('menu demo')
|
||||||
|
|
||||||
|
root.mainloop()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
132
Demo/tkinter/matt/menu-simple.py
Normal file
132
Demo/tkinter/matt/menu-simple.py
Normal file
|
@ -0,0 +1,132 @@
|
||||||
|
from Tkinter import *
|
||||||
|
|
||||||
|
# some vocabulary to keep from getting confused. This terminology
|
||||||
|
# is something I cooked up for this file, but follows the man pages
|
||||||
|
# pretty closely
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# This is a MENUBUTTON
|
||||||
|
# V
|
||||||
|
# +-------------+
|
||||||
|
# | |
|
||||||
|
#
|
||||||
|
# +------------++------------++------------+
|
||||||
|
# | || || |
|
||||||
|
# | File || Edit || Options | <-------- the MENUBAR
|
||||||
|
# | || || |
|
||||||
|
# +------------++------------++------------+
|
||||||
|
# | New... |
|
||||||
|
# | Open... |
|
||||||
|
# | Print |
|
||||||
|
# | | <-------- This is a MENU. The lines of text in the menu are
|
||||||
|
# | | MENU ENTRIES
|
||||||
|
# | +---------------+
|
||||||
|
# | Open Files > | file1 |
|
||||||
|
# | | file2 |
|
||||||
|
# | | another file | <------ this cascading part is also a MENU
|
||||||
|
# +----------------| |
|
||||||
|
# | |
|
||||||
|
# | |
|
||||||
|
# | |
|
||||||
|
# +---------------+
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def new_file():
|
||||||
|
print "opening new file"
|
||||||
|
|
||||||
|
|
||||||
|
def open_file():
|
||||||
|
print "opening OLD file"
|
||||||
|
|
||||||
|
|
||||||
|
def makeFileMenu():
|
||||||
|
# make menu button : "File"
|
||||||
|
File_button = Menubutton(mBar, {'text': 'File',
|
||||||
|
'underline': 0,
|
||||||
|
Pack: {'side': 'left',
|
||||||
|
'padx': '1m'}})
|
||||||
|
|
||||||
|
# make the pulldown part of the File menu. The parameter passed is the master.
|
||||||
|
# we attach it to the File button as a python attribute called "menu" by convention.
|
||||||
|
# hopefully this isn't too confusing...
|
||||||
|
File_button.menu = Menu(File_button)
|
||||||
|
|
||||||
|
# add an item. The first param is a menu entry type,
|
||||||
|
# must be one of: "cascade", "checkbutton", "command", "radiobutton", "seperator"
|
||||||
|
# see menu-demo-2.py for examples of use
|
||||||
|
File_button.menu.add('command', {'label': 'New...',
|
||||||
|
'underline': 0,
|
||||||
|
'command' : new_file})
|
||||||
|
|
||||||
|
|
||||||
|
File_button.menu.add('command', {'label': 'Open...',
|
||||||
|
'underline': 0,
|
||||||
|
'command' : open_file})
|
||||||
|
|
||||||
|
File_button.menu.add('command', {'label': 'Quit',
|
||||||
|
'underline': 0,
|
||||||
|
'command': 'exit'})
|
||||||
|
|
||||||
|
|
||||||
|
# set up a pointer from the file menubutton back to the file menu
|
||||||
|
File_button['menu'] = File_button.menu
|
||||||
|
|
||||||
|
return File_button
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def makeEditMenu():
|
||||||
|
Edit_button = Menubutton(mBar, {'text': 'Edit',
|
||||||
|
'underline': 0,
|
||||||
|
Pack: {'side': 'left',
|
||||||
|
'padx' : '1m'}})
|
||||||
|
Edit_button.menu = Menu(Edit_button)
|
||||||
|
|
||||||
|
# just to be cute, let's disable the undo option:
|
||||||
|
Edit_button.menu.add('command', {"label" : "Undo"} )
|
||||||
|
# undo is the 0th entry...
|
||||||
|
Edit_button.menu.entryconfig(0, {"state" : "disabled"})
|
||||||
|
|
||||||
|
# and these are just for show. No "command" callbacks attached.
|
||||||
|
Edit_button.menu.add('command', {"label" : "Cut"} )
|
||||||
|
Edit_button.menu.add('command', {"label" : "Copy"} )
|
||||||
|
Edit_button.menu.add('command', {"label" : "Paste"} )
|
||||||
|
|
||||||
|
# set up a pointer from the file menubutton back to the file menu
|
||||||
|
Edit_button['menu'] = Edit_button.menu
|
||||||
|
|
||||||
|
return Edit_button
|
||||||
|
|
||||||
|
|
||||||
|
#################################################
|
||||||
|
|
||||||
|
#### Main starts here ...
|
||||||
|
root = Tk()
|
||||||
|
|
||||||
|
|
||||||
|
# make a menu bar
|
||||||
|
mBar = Frame(root, {'relief': 'raised',
|
||||||
|
'bd': 2,
|
||||||
|
Pack: {'side': 'top',
|
||||||
|
'fill': 'x'}})
|
||||||
|
|
||||||
|
File_button = makeFileMenu()
|
||||||
|
Edit_button = makeEditMenu()
|
||||||
|
|
||||||
|
# finally, install the buttons in the menu bar.
|
||||||
|
# This allows for scanning from one menubutton to the next.
|
||||||
|
mBar.tk_menuBar(File_button, Edit_button)
|
||||||
|
|
||||||
|
|
||||||
|
root.title('menu demo')
|
||||||
|
root.iconname('packer')
|
||||||
|
|
||||||
|
root.mainloop()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
32
Demo/tkinter/matt/not-what-you-might-think-1.py
Normal file
32
Demo/tkinter/matt/not-what-you-might-think-1.py
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
from Tkinter import *
|
||||||
|
|
||||||
|
|
||||||
|
class Test(Frame):
|
||||||
|
def createWidgets(self):
|
||||||
|
|
||||||
|
self.Gpanel = Frame(self, {'width': '1i',
|
||||||
|
'height' : '1i',
|
||||||
|
'bg' : 'green'})
|
||||||
|
self.Gpanel.pack({'side' : 'left'})
|
||||||
|
|
||||||
|
|
||||||
|
# a QUIT button
|
||||||
|
self.Gpanel.QUIT = Button(self.Gpanel, {'text': 'QUIT',
|
||||||
|
'fg': 'red',
|
||||||
|
'command': self.quit})
|
||||||
|
self.Gpanel.QUIT.pack( {'side': 'left'})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def __init__(self, master=None):
|
||||||
|
Frame.__init__(self, master)
|
||||||
|
Pack.config(self)
|
||||||
|
self.createWidgets()
|
||||||
|
|
||||||
|
test = Test()
|
||||||
|
|
||||||
|
test.master.title('packer demo')
|
||||||
|
test.master.iconname('packer')
|
||||||
|
|
||||||
|
test.mainloop()
|
37
Demo/tkinter/matt/not-what-you-might-think-2.py
Normal file
37
Demo/tkinter/matt/not-what-you-might-think-2.py
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
from Tkinter import *
|
||||||
|
|
||||||
|
|
||||||
|
class Test(Frame):
|
||||||
|
def createWidgets(self):
|
||||||
|
|
||||||
|
self.Gpanel = Frame(self, {'width': '1i',
|
||||||
|
'height' : '1i',
|
||||||
|
'bg' : 'green'})
|
||||||
|
|
||||||
|
# this line turns off the recalculation of geometry by masters.
|
||||||
|
self.Gpanel.tk.call('pack', 'propagate', str(self.Gpanel), "0")
|
||||||
|
|
||||||
|
self.Gpanel.pack({'side' : 'left'})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# a QUIT button
|
||||||
|
self.Gpanel.QUIT = Button(self.Gpanel, {'text': 'QUIT',
|
||||||
|
'fg': 'red',
|
||||||
|
'command': self.quit})
|
||||||
|
self.Gpanel.QUIT.pack( {'side': 'left'})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def __init__(self, master=None):
|
||||||
|
Frame.__init__(self, master)
|
||||||
|
Pack.config(self)
|
||||||
|
self.createWidgets()
|
||||||
|
|
||||||
|
test = Test()
|
||||||
|
|
||||||
|
test.master.title('packer demo')
|
||||||
|
test.master.iconname('packer')
|
||||||
|
|
||||||
|
test.mainloop()
|
50
Demo/tkinter/matt/packer-and-placer-together.py
Normal file
50
Demo/tkinter/matt/packer-and-placer-together.py
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
from Tkinter import *
|
||||||
|
|
||||||
|
# This is a program that tests the placer geom manager in conjunction with
|
||||||
|
# the packer. The background (green) is packed, while the widget inside is placed
|
||||||
|
|
||||||
|
|
||||||
|
def do_motion(event):
|
||||||
|
app.button.place({'x' : event.x,
|
||||||
|
'y' : event.y})
|
||||||
|
|
||||||
|
def dothis():
|
||||||
|
print 'calling me!'
|
||||||
|
|
||||||
|
def createWidgets(top):
|
||||||
|
# make a frame. Note that the widget is 200 x 200
|
||||||
|
# and the window containing is 400x400. We do this
|
||||||
|
# simply to show that this is possible. The rest of the
|
||||||
|
# area is inaccesssible.
|
||||||
|
f = Frame(top, {'width' : '200',
|
||||||
|
'height' : '200',
|
||||||
|
'bg' : 'green'})
|
||||||
|
|
||||||
|
# note that we use a different manager here.
|
||||||
|
# This way, the top level frame widget resizes when the
|
||||||
|
# application window does.
|
||||||
|
f.pack({'fill' : 'both',
|
||||||
|
'expand' : 1})
|
||||||
|
|
||||||
|
# now make a button
|
||||||
|
f.button = Button(f, {'fg' : 'red',
|
||||||
|
'text' : 'amazing',
|
||||||
|
'command' : dothis})
|
||||||
|
|
||||||
|
# and place it so that the nw corner is
|
||||||
|
# 1/2 way along the top X edge of its' parent
|
||||||
|
f.button.place({'relx' : '0.5',
|
||||||
|
'rely' : '0.0',
|
||||||
|
'anchor' : 'nw'})
|
||||||
|
|
||||||
|
# allow the user to move the button SUIT-style.
|
||||||
|
f.bind('<Control-Shift-Motion>', do_motion)
|
||||||
|
|
||||||
|
return f
|
||||||
|
|
||||||
|
root = Tk()
|
||||||
|
app = createWidgets(root)
|
||||||
|
root.geometry("400x400")
|
||||||
|
root.maxsize(1000, 1000)
|
||||||
|
root.mainloop()
|
||||||
|
|
35
Demo/tkinter/matt/packer-simple.py
Normal file
35
Demo/tkinter/matt/packer-simple.py
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
from Tkinter import *
|
||||||
|
|
||||||
|
|
||||||
|
class Test(Frame):
|
||||||
|
def printit(self):
|
||||||
|
print self.hi_there["command"]
|
||||||
|
|
||||||
|
def createWidgets(self):
|
||||||
|
# a hello button
|
||||||
|
self.QUIT = Button(self, {'text': 'QUIT',
|
||||||
|
'fg': 'red',
|
||||||
|
'command': self.quit})
|
||||||
|
|
||||||
|
self.QUIT.pack({'side': 'left', 'fill': 'both'})
|
||||||
|
|
||||||
|
|
||||||
|
self.hi_there = Button(self, {'text': 'Hello',
|
||||||
|
'command' : self.printit})
|
||||||
|
self.hi_there.pack({'side': 'left'})
|
||||||
|
|
||||||
|
# note how Packer defaults to {'side': 'top'}
|
||||||
|
|
||||||
|
self.guy2 = Button(self, {'text': 'button 2'})
|
||||||
|
self.guy2.pack()
|
||||||
|
|
||||||
|
self.guy3 = Button(self, {'text': 'button 3'})
|
||||||
|
self.guy3.pack()
|
||||||
|
|
||||||
|
def __init__(self, master=None):
|
||||||
|
Frame.__init__(self, master)
|
||||||
|
Pack.config(self)
|
||||||
|
self.createWidgets()
|
||||||
|
|
||||||
|
test = Test()
|
||||||
|
test.mainloop()
|
48
Demo/tkinter/matt/placer-simple.py
Normal file
48
Demo/tkinter/matt/placer-simple.py
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
from Tkinter import *
|
||||||
|
|
||||||
|
# This is a program that tests the placer geom manager
|
||||||
|
|
||||||
|
def do_motion(event):
|
||||||
|
app.button.place({'x' : event.x,
|
||||||
|
'y' : event.y})
|
||||||
|
|
||||||
|
def dothis():
|
||||||
|
print 'calling me!'
|
||||||
|
|
||||||
|
def createWidgets(top):
|
||||||
|
# make a frame. Note that the widget is 200 x 200
|
||||||
|
# and the window containing is 400x400. We do this
|
||||||
|
# simply to show that this is possible. The rest of the
|
||||||
|
# area is inaccesssible.
|
||||||
|
f = Frame(top, {'width' : '200',
|
||||||
|
'height' : '200',
|
||||||
|
'bg' : 'green'})
|
||||||
|
|
||||||
|
# place it so the upper left hand corner of
|
||||||
|
# the frame is in the upper left corner of
|
||||||
|
# the parent
|
||||||
|
f.place({'relx' : '0.0',
|
||||||
|
'rely' : '0.0'})
|
||||||
|
|
||||||
|
# now make a button
|
||||||
|
f.button = Button(f, {'fg' : 'red',
|
||||||
|
'text' : 'amazing',
|
||||||
|
'command' : dothis})
|
||||||
|
|
||||||
|
# and place it so that the nw corner is
|
||||||
|
# 1/2 way along the top X edge of its' parent
|
||||||
|
f.button.place({'relx' : '0.5',
|
||||||
|
'rely' : '0.0',
|
||||||
|
'anchor' : 'nw'})
|
||||||
|
|
||||||
|
# allow the user to move the button SUIT-style.
|
||||||
|
f.bind('<Control-Shift-Motion>', do_motion)
|
||||||
|
|
||||||
|
return f
|
||||||
|
|
||||||
|
root = Tk()
|
||||||
|
app = createWidgets(root)
|
||||||
|
root.geometry("400x400")
|
||||||
|
root.maxsize(1000, 1000)
|
||||||
|
root.mainloop()
|
||||||
|
|
59
Demo/tkinter/matt/pong-demo-1.py
Normal file
59
Demo/tkinter/matt/pong-demo-1.py
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
from Tkinter import *
|
||||||
|
|
||||||
|
import string
|
||||||
|
|
||||||
|
|
||||||
|
class Pong(Frame):
|
||||||
|
def createWidgets(self):
|
||||||
|
self.QUIT = Button(self, {'text': 'QUIT',
|
||||||
|
'fg': 'red',
|
||||||
|
'command': self.quit})
|
||||||
|
self.QUIT.pack({'side': 'left', 'fill': 'both'})
|
||||||
|
|
||||||
|
## The playing field
|
||||||
|
self.draw = Canvas(self, {"width" : "5i", "height" : "5i"})
|
||||||
|
|
||||||
|
## The speed control for the ball
|
||||||
|
self.speed = Scale(self, {"orient": "horiz",
|
||||||
|
"label" : "ball speed",
|
||||||
|
"from" : -100,
|
||||||
|
"to" : 100})
|
||||||
|
|
||||||
|
self.speed.pack({'side': 'bottom', "fill" : "x"})
|
||||||
|
|
||||||
|
# The ball
|
||||||
|
self.ball = self.draw.create_oval("0i", "0i", "0.10i", "0.10i", {"fill" : "red"})
|
||||||
|
self.x = 0.05
|
||||||
|
self.y = 0.05
|
||||||
|
self.velocity_x = 0.3
|
||||||
|
self.velocity_y = 0.5
|
||||||
|
|
||||||
|
self.draw.pack({'side': 'left'})
|
||||||
|
|
||||||
|
|
||||||
|
def moveBall(self, *args):
|
||||||
|
if (self.x > 5.0) or (self.x < 0.0):
|
||||||
|
self.velocity_x = -1.0 * self.velocity_x
|
||||||
|
if (self.y > 5.0) or (self.y < 0.0):
|
||||||
|
self.velocity_y = -1.0 * self.velocity_y
|
||||||
|
|
||||||
|
deltax = (self.velocity_x * self.speed.get() / 100.0)
|
||||||
|
deltay = (self.velocity_y * self.speed.get() / 100.0)
|
||||||
|
self.x = self.x + deltax
|
||||||
|
self.y = self.y + deltay
|
||||||
|
|
||||||
|
self.draw.move(self.ball, `deltax` + "i", `deltay` + "i")
|
||||||
|
self.after(10, self.moveBall)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def __init__(self, master=None):
|
||||||
|
Frame.__init__(self, master)
|
||||||
|
Pack.config(self)
|
||||||
|
self.createWidgets()
|
||||||
|
self.after(10, self.moveBall)
|
||||||
|
|
||||||
|
|
||||||
|
game = Pong()
|
||||||
|
|
||||||
|
game.mainloop()
|
69
Demo/tkinter/matt/printing-coords-of-items.py
Normal file
69
Demo/tkinter/matt/printing-coords-of-items.py
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
from Tkinter import *
|
||||||
|
|
||||||
|
# this file demonstrates the creation of widgets as part of a canvas object
|
||||||
|
|
||||||
|
class Test(Frame):
|
||||||
|
###################################################################
|
||||||
|
###### Event callbacks for THE CANVAS (not the stuff drawn on it)
|
||||||
|
###################################################################
|
||||||
|
def mouseDown(self, event):
|
||||||
|
# see if we're inside a dot. If we are, it
|
||||||
|
# gets tagged as "current" for free by tk.
|
||||||
|
|
||||||
|
if not event.widget.find_withtag("current"):
|
||||||
|
# there is no dot here, so we can make one,
|
||||||
|
# and bind some interesting behavior to it.
|
||||||
|
# ------
|
||||||
|
|
||||||
|
# create a dot, and mark it as current
|
||||||
|
fred = self.draw.create_oval(event.x - 10, event.y -10, event.x +10, event.y + 10,
|
||||||
|
{"fill" : "green", "tag" : "current"})
|
||||||
|
|
||||||
|
self.draw.bind(fred, "<Any-Enter>", self.mouseEnter)
|
||||||
|
self.draw.bind(fred, "<Any-Leave>", self.mouseLeave)
|
||||||
|
|
||||||
|
self.lastx = event.x
|
||||||
|
self.lasty = event.y
|
||||||
|
|
||||||
|
|
||||||
|
def mouseMove(self, event):
|
||||||
|
self.draw.move("current", event.x - self.lastx, event.y - self.lasty)
|
||||||
|
self.lastx = event.x
|
||||||
|
self.lasty = event.y
|
||||||
|
|
||||||
|
###################################################################
|
||||||
|
###### Event callbacks for canvas ITEMS (stuff drawn on the canvas)
|
||||||
|
###################################################################
|
||||||
|
def mouseEnter(self, event):
|
||||||
|
# the "current" tag is applied to the object the cursor is over.
|
||||||
|
# this happens automatically.
|
||||||
|
self.draw.itemconfig("current", {"fill" : "red"})
|
||||||
|
print self.tk.splitlist(self.draw.coords("current"))
|
||||||
|
|
||||||
|
def mouseLeave(self, event):
|
||||||
|
# the "current" tag is applied to the object the cursor is over.
|
||||||
|
# this happens automatically.
|
||||||
|
self.draw.itemconfig("current", {"fill" : "blue"})
|
||||||
|
|
||||||
|
def createWidgets(self):
|
||||||
|
self.QUIT = Button(self, {'text': 'QUIT',
|
||||||
|
'fg': 'red',
|
||||||
|
'command': self.quit})
|
||||||
|
self.QUIT.pack({'side': 'left', 'fill': 'both'})
|
||||||
|
self.draw = Canvas(self, {"width" : "5i", "height" : "5i"})
|
||||||
|
self.draw.pack({'side': 'left'})
|
||||||
|
|
||||||
|
|
||||||
|
Widget.bind(self.draw, "<1>", self.mouseDown)
|
||||||
|
Widget.bind(self.draw, "<B1-Motion>", self.mouseMove)
|
||||||
|
|
||||||
|
def __init__(self, master=None):
|
||||||
|
Frame.__init__(self, master)
|
||||||
|
Pack.config(self)
|
||||||
|
self.createWidgets()
|
||||||
|
|
||||||
|
test = Test()
|
||||||
|
test.mainloop()
|
||||||
|
|
||||||
|
|
||||||
|
|
66
Demo/tkinter/matt/radiobutton-simple.py
Normal file
66
Demo/tkinter/matt/radiobutton-simple.py
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
from Tkinter import *
|
||||||
|
|
||||||
|
# This is a demo program that shows how to
|
||||||
|
# create radio buttons and how to get other widgets to
|
||||||
|
# share the information in a radio button.
|
||||||
|
#
|
||||||
|
# There are other ways of doing this too, but
|
||||||
|
# the "variable" option of radiobuttons seems to be the easiest.
|
||||||
|
#
|
||||||
|
# note how each button has a value it sets the variable to as it gets hit.
|
||||||
|
|
||||||
|
|
||||||
|
class Test(Frame):
|
||||||
|
def printit(self):
|
||||||
|
print "hi"
|
||||||
|
|
||||||
|
def createWidgets(self):
|
||||||
|
|
||||||
|
self.flavor = StringVar()
|
||||||
|
self.flavor.set("chocolate")
|
||||||
|
|
||||||
|
self.radioframe = Frame(self)
|
||||||
|
self.radioframe.pack()
|
||||||
|
|
||||||
|
# 'text' is the label
|
||||||
|
# 'variable' is the name of the variable that all these radio buttons share
|
||||||
|
# 'value' is the value this variable takes on when the radio button is selected
|
||||||
|
# 'anchor' makes the text appear left justified (default is centered. ick)
|
||||||
|
self.radioframe.choc = Radiobutton (self.radioframe, {"text" : "Chocolate Flavor",
|
||||||
|
"variable" : self.flavor,
|
||||||
|
"value" : "chocolate",
|
||||||
|
"anchor" : "w",
|
||||||
|
Pack : {"side" : "top", "fill" : "x"}})
|
||||||
|
|
||||||
|
self.radioframe.straw = Radiobutton (self.radioframe, {"text" : "Strawberry Flavor",
|
||||||
|
"variable" : self.flavor,
|
||||||
|
"anchor" : "w",
|
||||||
|
"value" : "strawberry",
|
||||||
|
Pack : {"side" : "top", "fill" : "x"}})
|
||||||
|
|
||||||
|
self.radioframe.lemon = Radiobutton (self.radioframe, {"text" : "Lemon Flavor",
|
||||||
|
"anchor" : "w",
|
||||||
|
"variable" : self.flavor,
|
||||||
|
"value" : "lemon",
|
||||||
|
Pack : {"side" : "top", "fill" : "x"}})
|
||||||
|
|
||||||
|
|
||||||
|
# this is a text entry that lets you type in the name of a flavor too.
|
||||||
|
self.entry = Entry(self, {"textvariable" : self.flavor,
|
||||||
|
Pack : {"side" : "top", "fill" : "x"}})
|
||||||
|
self.QUIT = Button(self, {'text': 'QUIT',
|
||||||
|
'fg': 'red',
|
||||||
|
'command': self.quit})
|
||||||
|
|
||||||
|
self.QUIT.pack({'side': 'bottom', 'fill': 'both'})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def __init__(self, master=None):
|
||||||
|
Frame.__init__(self, master)
|
||||||
|
Pack.config(self)
|
||||||
|
self.createWidgets()
|
||||||
|
|
||||||
|
test = Test()
|
||||||
|
|
||||||
|
test.mainloop()
|
57
Demo/tkinter/matt/rubber-band-box-demo-1.py
Normal file
57
Demo/tkinter/matt/rubber-band-box-demo-1.py
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
from Tkinter import *
|
||||||
|
|
||||||
|
class Test(Frame):
|
||||||
|
def printit(self):
|
||||||
|
print "hi"
|
||||||
|
|
||||||
|
def createWidgets(self):
|
||||||
|
self.QUIT = Button(self, {'text': 'QUIT',
|
||||||
|
'bg': 'red',
|
||||||
|
'fg': 'white',
|
||||||
|
'height' : 3,
|
||||||
|
'command': self.quit})
|
||||||
|
self.QUIT.pack({'side': 'bottom', 'fill': 'both'})
|
||||||
|
|
||||||
|
self.canvasObject = Canvas(self, {"width" : "5i", "height" : "5i"})
|
||||||
|
self.canvasObject.pack({'side': 'left'})
|
||||||
|
|
||||||
|
def mouseDown(self, event):
|
||||||
|
# canvas x and y take the screen coords from the event and translate
|
||||||
|
# them into the coordinate system of the canvas object
|
||||||
|
self.startx = self.canvasObject.canvasx(event.x)
|
||||||
|
self.starty = self.canvasObject.canvasy(event.y)
|
||||||
|
|
||||||
|
def mouseMotion(self, event):
|
||||||
|
# canvas x and y take the screen coords from the event and translate
|
||||||
|
# them into the coordinate system of the canvas object
|
||||||
|
x = self.canvasObject.canvasx(event.x)
|
||||||
|
y = self.canvasObject.canvasy(event.y)
|
||||||
|
|
||||||
|
if (self.startx != event.x) and (self.starty != event.y) :
|
||||||
|
self.canvasObject.delete(self.rubberbandBox)
|
||||||
|
self.rubberbandBox = self.canvasObject.create_rectangle(self.startx, self.starty, x, y)
|
||||||
|
# this flushes the output, making sure that
|
||||||
|
# the rectangle makes it to the screen
|
||||||
|
# before the next event is handled
|
||||||
|
self.update_idletasks()
|
||||||
|
|
||||||
|
def mouseUp(self, event):
|
||||||
|
self.canvasObject.delete(self.rubberbandBox)
|
||||||
|
|
||||||
|
def __init__(self, master=None):
|
||||||
|
Frame.__init__(self, master)
|
||||||
|
Pack.config(self)
|
||||||
|
self.createWidgets()
|
||||||
|
|
||||||
|
# this is a "tagOrId" for the rectangle we draw on the canvas
|
||||||
|
self.rubberbandBox = None
|
||||||
|
|
||||||
|
# and the bindings that make it work..
|
||||||
|
Widget.bind(self.canvasObject, "<Button-1>", self.mouseDown)
|
||||||
|
Widget.bind(self.canvasObject, "<Button1-Motion>", self.mouseMotion)
|
||||||
|
Widget.bind(self.canvasObject, "<Button1-ButtonRelease>", self.mouseUp)
|
||||||
|
|
||||||
|
|
||||||
|
test = Test()
|
||||||
|
|
||||||
|
test.mainloop()
|
50
Demo/tkinter/matt/rubber-line-demo-1.py
Normal file
50
Demo/tkinter/matt/rubber-line-demo-1.py
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
from Tkinter import *
|
||||||
|
|
||||||
|
class Test(Frame):
|
||||||
|
def printit(self):
|
||||||
|
print "hi"
|
||||||
|
|
||||||
|
def createWidgets(self):
|
||||||
|
self.QUIT = Button(self, {'text': 'QUIT',
|
||||||
|
'bg': 'red',
|
||||||
|
'fg': 'white',
|
||||||
|
'height' : 3,
|
||||||
|
'command': self.quit})
|
||||||
|
self.QUIT.pack({'side': 'bottom', 'fill': 'both'})
|
||||||
|
|
||||||
|
self.canvasObject = Canvas(self, {"width" : "5i", "height" : "5i"})
|
||||||
|
self.canvasObject.pack({'side': 'left'})
|
||||||
|
|
||||||
|
def mouseDown(self, event):
|
||||||
|
# canvas x and y take the screen coords from the event and translate
|
||||||
|
# them into the coordinate system of the canvas object
|
||||||
|
self.startx = self.canvasObject.canvasx(event.x)
|
||||||
|
self.starty = self.canvasObject.canvasy(event.y)
|
||||||
|
|
||||||
|
def mouseMotion(self, event):
|
||||||
|
# canvas x and y take the screen coords from the event and translate
|
||||||
|
# them into the coordinate system of the canvas object
|
||||||
|
x = self.canvasObject.canvasx(event.x)
|
||||||
|
y = self.canvasObject.canvasy(event.y)
|
||||||
|
|
||||||
|
if (self.startx != event.x) and (self.starty != event.y) :
|
||||||
|
self.canvasObject.delete(self.rubberbandLine)
|
||||||
|
self.rubberbandLine = self.canvasObject.create_line(self.startx, self.starty, x, y)
|
||||||
|
# this flushes the output, making sure that
|
||||||
|
# the rectangle makes it to the screen
|
||||||
|
# before the next event is handled
|
||||||
|
self.update_idletasks()
|
||||||
|
|
||||||
|
def __init__(self, master=None):
|
||||||
|
Frame.__init__(self, master)
|
||||||
|
Pack.config(self)
|
||||||
|
self.createWidgets()
|
||||||
|
# this is a "tagOrId" for the rectangle we draw on the canvas
|
||||||
|
self.rubberbandLine = None
|
||||||
|
Widget.bind(self.canvasObject, "<Button-1>", self.mouseDown)
|
||||||
|
Widget.bind(self.canvasObject, "<Button1-Motion>", self.mouseMotion)
|
||||||
|
|
||||||
|
|
||||||
|
test = Test()
|
||||||
|
|
||||||
|
test.mainloop()
|
40
Demo/tkinter/matt/slider-demo-1.py
Normal file
40
Demo/tkinter/matt/slider-demo-1.py
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
from Tkinter import *
|
||||||
|
|
||||||
|
# shows how to make a slider, set and get its value under program control
|
||||||
|
|
||||||
|
|
||||||
|
class Test(Frame):
|
||||||
|
def print_value(self, val):
|
||||||
|
print "slider now at", val
|
||||||
|
|
||||||
|
def reset(self):
|
||||||
|
self.slider.set(0)
|
||||||
|
|
||||||
|
def createWidgets(self):
|
||||||
|
self.slider = Scale(self, {"from" : 0,
|
||||||
|
'to': 100,
|
||||||
|
"orient" : "horizontal",
|
||||||
|
"length" : "3i",
|
||||||
|
"label" : "happy slider",
|
||||||
|
'command' : self.print_value})
|
||||||
|
|
||||||
|
self.reset = Button(self, {'text': 'reset slider',
|
||||||
|
'command': self.reset})
|
||||||
|
|
||||||
|
|
||||||
|
self.QUIT = Button(self, {'text': 'QUIT',
|
||||||
|
'fg': 'red',
|
||||||
|
'command': self.quit})
|
||||||
|
|
||||||
|
|
||||||
|
self.slider.pack({'side': 'left'})
|
||||||
|
self.reset.pack({'side': 'left'})
|
||||||
|
self.QUIT.pack({'side': 'left', 'fill': 'both'})
|
||||||
|
|
||||||
|
def __init__(self, master=None):
|
||||||
|
Frame.__init__(self, master)
|
||||||
|
Pack.config(self)
|
||||||
|
self.createWidgets()
|
||||||
|
|
||||||
|
test = Test()
|
||||||
|
test.mainloop()
|
33
Demo/tkinter/matt/subclass-existing-widgets.py
Normal file
33
Demo/tkinter/matt/subclass-existing-widgets.py
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
from Tkinter import *
|
||||||
|
|
||||||
|
# This is a program that makes a simple two button application
|
||||||
|
|
||||||
|
|
||||||
|
class New_Button(Button):
|
||||||
|
def callback(self):
|
||||||
|
print self.counter
|
||||||
|
self.counter = self.counter + 1
|
||||||
|
|
||||||
|
def createWidgets(top):
|
||||||
|
f = Frame(top)
|
||||||
|
f.pack()
|
||||||
|
f.QUIT = Button(f, {'text': 'QUIT',
|
||||||
|
'fg': 'red',
|
||||||
|
'command': top.quit})
|
||||||
|
|
||||||
|
f.QUIT.pack({'side': 'left', 'fill': 'both'})
|
||||||
|
|
||||||
|
|
||||||
|
# a hello button
|
||||||
|
f.hi_there = New_Button(f, {'text': 'Hello'})
|
||||||
|
# we do this on a different line because we need to reference f.hi_there
|
||||||
|
f.hi_there.config({'command' : f.hi_there.callback})
|
||||||
|
f.hi_there.pack({'side': 'left'})
|
||||||
|
f.hi_there.counter = 43
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
root = Tk()
|
||||||
|
createWidgets(root)
|
||||||
|
root.mainloop()
|
||||||
|
|
37
Demo/tkinter/matt/window-creation-more.py
Normal file
37
Demo/tkinter/matt/window-creation-more.py
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
from Tkinter import *
|
||||||
|
|
||||||
|
# this shows how to create a new window with a button in it that can create new windows
|
||||||
|
|
||||||
|
class Test(Frame):
|
||||||
|
def printit(self):
|
||||||
|
print "hi"
|
||||||
|
|
||||||
|
def makeWindow(self):
|
||||||
|
fred = Toplevel()
|
||||||
|
fred.label = Button(fred, {'text': "This is window number " + `self.windownum` + "." ,
|
||||||
|
'command' : self.makeWindow})
|
||||||
|
fred.label.pack()
|
||||||
|
self.windownum = self.windownum + 1
|
||||||
|
|
||||||
|
def createWidgets(self):
|
||||||
|
self.QUIT = Button(self, {'text': 'QUIT',
|
||||||
|
'fg': 'red',
|
||||||
|
'command': self.quit})
|
||||||
|
|
||||||
|
self.QUIT.pack({'side': 'left', 'fill': 'both'})
|
||||||
|
|
||||||
|
|
||||||
|
# a hello button
|
||||||
|
self.hi_there = Button(self, {'text': 'Make a New Window',
|
||||||
|
'command' : self.makeWindow})
|
||||||
|
self.hi_there.pack({'side': 'left'})
|
||||||
|
|
||||||
|
|
||||||
|
def __init__(self, master=None):
|
||||||
|
Frame.__init__(self, master)
|
||||||
|
Pack.config(self)
|
||||||
|
self.windownum = 0
|
||||||
|
self.createWidgets()
|
||||||
|
|
||||||
|
test = Test()
|
||||||
|
test.mainloop()
|
34
Demo/tkinter/matt/window-creation-simple.py
Normal file
34
Demo/tkinter/matt/window-creation-simple.py
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
from Tkinter import *
|
||||||
|
|
||||||
|
# this shows how to spawn off new windows at a button press
|
||||||
|
|
||||||
|
class Test(Frame):
|
||||||
|
def printit(self):
|
||||||
|
print "hi"
|
||||||
|
|
||||||
|
def makeWindow(self):
|
||||||
|
fred = Toplevel()
|
||||||
|
fred.label = Label(fred, {'text': "Here's a new window",})
|
||||||
|
fred.label.pack()
|
||||||
|
|
||||||
|
def createWidgets(self):
|
||||||
|
self.QUIT = Button(self, {'text': 'QUIT',
|
||||||
|
'fg': 'red',
|
||||||
|
'command': self.quit})
|
||||||
|
|
||||||
|
self.QUIT.pack({'side': 'left', 'fill': 'both'})
|
||||||
|
|
||||||
|
|
||||||
|
# a hello button
|
||||||
|
self.hi_there = Button(self, {'text': 'Make a New Window',
|
||||||
|
'command' : self.makeWindow})
|
||||||
|
self.hi_there.pack({'side': 'left'})
|
||||||
|
|
||||||
|
|
||||||
|
def __init__(self, master=None):
|
||||||
|
Frame.__init__(self, master)
|
||||||
|
Pack.config(self)
|
||||||
|
self.createWidgets()
|
||||||
|
|
||||||
|
test = Test()
|
||||||
|
test.mainloop()
|
40
Demo/tkinter/matt/window-creation-w-location.py
Normal file
40
Demo/tkinter/matt/window-creation-w-location.py
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
from Tkinter import *
|
||||||
|
|
||||||
|
import sys
|
||||||
|
sys.path.append("/users/mjc4y/projects/python/tkinter/utils")
|
||||||
|
from TkinterUtils import *
|
||||||
|
|
||||||
|
# this shows how to create a new window with a button in it that can create new windows
|
||||||
|
|
||||||
|
|
||||||
|
class Test(Frame):
|
||||||
|
def makeWindow(self, *args):
|
||||||
|
fred = Toplevel()
|
||||||
|
|
||||||
|
fred.label = Canvas (fred, {"width" : "2i",
|
||||||
|
"height" : "2i"})
|
||||||
|
|
||||||
|
fred.label.create_line("0", "0", "2i", "2i")
|
||||||
|
fred.label.create_line("0", "2i", "2i", "0")
|
||||||
|
fred.label.pack()
|
||||||
|
|
||||||
|
centerWindow(fred, self.master)
|
||||||
|
|
||||||
|
def createWidgets(self):
|
||||||
|
self.QUIT = QuitButton(self)
|
||||||
|
self.QUIT.pack({'side': 'left', 'fill': 'both'})
|
||||||
|
|
||||||
|
|
||||||
|
self.makeWindow = Button(self, {'text': 'Make a New Window',
|
||||||
|
'width' : 50,
|
||||||
|
'height' : 20,
|
||||||
|
'command' : self.makeWindow})
|
||||||
|
self.makeWindow.pack({'side': 'left'})
|
||||||
|
|
||||||
|
def __init__(self, master=None):
|
||||||
|
Frame.__init__(self, master)
|
||||||
|
Pack.config(self)
|
||||||
|
self.createWidgets()
|
||||||
|
|
||||||
|
test = Test()
|
||||||
|
test.mainloop()
|
Loading…
Add table
Add a link
Reference in a new issue