|
|
1.1 root 1: # mkPlot w
2: #
3: # Create a top-level window containing a canvas displaying a simple
4: # graph with data points that can be moved interactively.
5: #
6: # Arguments:
7: # w - Name to use for new top-level window.
8:
9: proc mkPlot {{w .plot}} {
10: catch {destroy $w}
11: toplevel $w
12: dpos $w
13: wm title $w "Plot Demonstration"
14: wm iconname $w "Plot"
15: set c $w.c
16:
17: frame $w.frame1 -relief raised -bd 2
18: canvas $c -relief raised -width 450 -height 300
19: button $w.ok -text "OK" -command "destroy $w"
20: pack append $w $w.frame1 {top fill} $w.c {expand fill} \
21: $w.ok {bottom pady 10 frame center}
22: message $w.frame1.m -font -Adobe-Times-Medium-R-Normal-*-180-* -aspect 300 \
23: -text "This window displays a canvas widget containing a simple 2-dimensional plot. You can doctor the data by dragging any of the points with mouse button 1."
24: pack append $w.frame1 $w.frame1.m {frame center}
25:
26: set font -Adobe-helvetica-medium-r-*-180-*
27:
28: $c create line 100 250 400 250 -width 2
29: $c create line 100 250 100 50 -width 2
30: $c create text 225 20 -text "A Simple Plot" -font $font -fill brown
31:
32: for {set i 0} {$i <= 10} {incr i} {
33: set x [expr {100 + ($i*30)}]
34: $c create line $x 250 $x 245 -width 2
35: $c create text $x 254 -text [expr 10*$i] -anchor n -font $font
36: }
37: for {set i 0} {$i <= 5} {incr i} {
38: set y [expr {250 - ($i*40)}]
39: $c create line 100 $y 105 $y -width 2
40: $c create text 96 $y -text [expr $i*50].0 -anchor e -font $font
41: }
42:
43: foreach point {{12 56} {20 94} {33 98} {32 120} {61 180}
44: {75 160} {98 223}} {
45: set x [expr {100 + (3*[lindex $point 0])}]
46: set y [expr {250 - (4*[lindex $point 1])/5}]
47: set item [$c create oval [expr $x-6] [expr $y-6] \
48: [expr $x+6] [expr $y+6] -width 1 -outline black \
49: -fill SkyBlue2]
50: $c addtag point withtag $item
51: }
52:
53: $c bind point <Any-Enter> "$c itemconfig current -fill red"
54: $c bind point <Any-Leave> "$c itemconfig current -fill SkyBlue2"
55: $c bind point <1> "plotDown $c %x %y"
56: $c bind point <ButtonRelease-1> "$c dtag selected"
57: bind $c <B1-Motion> "plotMove $c %x %y"
58: }
59:
60: set plot(lastX) 0
61: set plot(lastY) 0
62:
63: proc plotDown {w x y} {
64: global plot
65: $w dtag selected
66: $w addtag selected withtag current
67: $w raise current
68: set plot(lastX) $x
69: set plot(lastY) $y
70: }
71:
72: proc plotMove {w x y} {
73: global plot
74: $w move selected [expr $x-$plot(lastX)] [expr $y-$plot(lastY)]
75: set plot(lastX) $x
76: set plot(lastY) $y
77: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.