Commit | Line | Data |
---|---|---|
920dae64 AT |
1 | |
2 | <html> | |
3 | <head> | |
4 | <meta name="description" content="Pmw - a toolkit for building high-level compound widgets in Python"> | |
5 | <meta name="content" content="python, megawidget, mega widget, compound widget, gui, tkinter"> | |
6 | <title>Pmw demonstrations and tests</title> | |
7 | </head> | |
8 | ||
9 | <body bgcolor="#ffffff" text="#000000" link="#0000ee" | |
10 | vlink="551a8b" alink="ff0000"> | |
11 | ||
12 | <h1 ALIGN="CENTER">Pmw demonstrations and tests</h1> | |
13 | ||
14 | <center><P ALIGN="CENTER"> | |
15 | <IMG SRC = blue_line.gif ALT = "" WIDTH=320 HEIGHT=5> | |
16 | </p></center> | |
17 | ||
18 | <p> | |
19 | Pmw comes with an extensive range of demonstrations and tests. The | |
20 | demonstrations can be used to get a feel for what is provided by Pmw | |
21 | and the demonstration code can be viewed to see examples of how to | |
22 | use Pmw. The tests can be executed to check that there are no | |
23 | problems with running Pmw in your environment. | |
24 | ||
25 | </p> | |
26 | ||
27 | <dl> | |
28 | <dt> <h2>Demonstrations</h2></dt><dd> | |
29 | <p> | |
30 | The Pmw <code>demos</code> directory contains demonstration scripts | |
31 | showing many of the features of Pmw megawidgets. To view a | |
32 | comprehensive package of all the demonstrations, including a view of | |
33 | the source code, run the <code>All.py</code> script. Run | |
34 | <code>All.py -help</code> for a short description of the script's | |
35 | options. | |
36 | ||
37 | <p> | |
38 | All of the demonstrations may also be run separately. Most of the | |
39 | demonstrations show some of the features of one of the Pmw | |
40 | megawidgets. For example, to see a demonstration of the ButtonBox | |
41 | megawidget, change into the <code>demos</code> directory and | |
42 | run | |
43 | ||
44 | </p> | |
45 | <dl> | |
46 | <dd> | |
47 | <pre> | |
48 | python ButtonBox.py | |
49 | </pre> | |
50 | </dd> | |
51 | </dl> | |
52 | ||
53 | <p> | |
54 | Other demonstrations, which show other features of Pmw include | |
55 | </p> | |
56 | <dl> | |
57 | <dd> | |
58 | <pre> | |
59 | BltGraph.py demonstrates the Pmw interface to | |
60 | the BLT graph and vector commands | |
61 | BltTabset.py demonstrates the Pmw interface to | |
62 | the BLT tabset command | |
63 | Colors.py how to set color schemes | |
64 | ConfigClass.py how to configure the python class | |
65 | of a megawidger component | |
66 | ErrorHandling.py how Pmw displays run time errors | |
67 | in a window | |
68 | ExampleDemo.py template for new demonstrations | |
69 | Grid.py the Tkinter Grid geometry manager | |
70 | LogicalFont.py how to use standard values for fonts | |
71 | MessageInfo.py how to extend the Pmw MegaToplevel | |
72 | class | |
73 | NestedDialogs.py how nested modal dialogs behave | |
74 | Resources.py how to use the option database to | |
75 | modify Tk widget option defaults | |
76 | Resources_Pmw.py how to use the option database to | |
77 | modify megawidget option defaults | |
78 | ShowBusy.py demonstrates the Pmw interface to | |
79 | the BLT busy command | |
80 | SpecialEntry.py deriving from Pmw.EntryField | |
81 | Spectrum.py some of the Pmw color handling | |
82 | functions | |
83 | SpeedTest.py tests the speed of creating Pmw | |
84 | megawidgets | |
85 | TextDisplay.py how to extend the Pmw MegaWidget | |
86 | class | |
87 | WidgetDestroy.py megawidget destruction | |
88 | </pre> | |
89 | </dd> | |
90 | </dl> | |
91 | ||
92 | <b>Creating demonstrations of new megawidgets</b> | |
93 | <br> | |
94 | <p> | |
95 | If you create a new megawidget you can create a demonstration for it | |
96 | by using the file | |
97 | <a href="ExampleDemo.py"><code>ExampleDemo.py</code></a> as a | |
98 | template. This template allows the demonstration to be run | |
99 | individually or to be automatically included as part of the | |
100 | demonstration package <code>All.py</code>. You should take a copy of | |
101 | the template and name the new file after your megawidget. You should | |
102 | then replace each instance of the word <code>EXAMPLE</code> with the | |
103 | name of your megawidget and replace the code in the | |
104 | <code>__init__</code> method with code to create and initialise one or | |
105 | more instances of your megawidget, which should be a child of | |
106 | <code>parent</code>. You can add other methods as necessary. | |
107 | ||
108 | </p> | |
109 | ||
110 | </dd> | |
111 | <dt> <h2>Tests</h2></dt><dd> | |
112 | <p> | |
113 | The Pmw <code>tests</code> directory contains a test framework | |
114 | and a set of test scripts for Pmw. | |
115 | The tests cover the standard Tkinter module and most of the Pmw megawidgets. | |
116 | The tests make a great | |
117 | demonstration of the flexibility of the megawidgets. Simply change | |
118 | into the <code>tests</code> directory and run | |
119 | <code>python All.py</code>. | |
120 | ||
121 | <p> | |
122 | If all tests pass there should be no output printed to standard | |
123 | output. If any of the tests fail, please send the test output to | |
124 | the maintainer at | |
125 | <a href="mailto:gregm@iname.com"><i>gregm@iname.com</i></a>. | |
126 | ||
127 | </p> | |
128 | ||
129 | <p> | |
130 | All of the tests may be run separately. Most of the tests test the | |
131 | features of one of the Pmw megawidgets. For example, to execute the | |
132 | test for the ButtonBox megawidget, run | |
133 | ||
134 | </p> | |
135 | ||
136 | <dl> | |
137 | <dd> | |
138 | <pre> | |
139 | python ButtonBox_test.py | |
140 | </pre> | |
141 | </dd> | |
142 | </dl> | |
143 | ||
144 | <p> | |
145 | The Test.py file contains general testing functions and is imported | |
146 | by all test files. | |
147 | Other files, which test other features of Pmw include | |
148 | </p> | |
149 | <dl> | |
150 | <dd> | |
151 | <pre> | |
152 | Blt_test.py BLT vector and graph interface | |
153 | Colors_test.py setting color schemes | |
154 | MegaWidget_test.py creation of megawidget classes | |
155 | Options_test.py option and component handling | |
156 | PmwBase_test.py more option and component handling | |
157 | Tkinter_test.py Tk widgets in the Tkinter module | |
158 | </pre> | |
159 | </dd> | |
160 | </dl> | |
161 | ||
162 | <b>Creating tests for new megawidgets</b> | |
163 | <br> | |
164 | <p> | |
165 | If you create a new megawidget you should create a test for it. There | |
166 | is no template file for creating tests, but by looking at the other | |
167 | Pmw tests (for example, | |
168 | <a href="ScrolledText_test.py"><code>ScrolledText_test.py</code></a>) you | |
169 | will get some idea of how to create a test for your megawidget. | |
170 | ||
171 | </p> | |
172 | ||
173 | <p> | |
174 | The test files are designed to be run both individually or | |
175 | automatically by the test package <code>All.py</code>. Each test file | |
176 | must define the <code>testData</code> tuple. This consists of a | |
177 | sequence of 2-element tuples, each tuple being a test specification | |
178 | for one megawidget. Usually a file tests only one megawidget and so | |
179 | there is only one test specification. The first element in the | |
180 | specification is the megawidget class and the second is a sequence of | |
181 | (yet more) 2-element tuples. In each of these tuples, the first | |
182 | element is a sequence of individual tests to perform on an instance of | |
183 | the megawidget and the second element is a dictionary to use for | |
184 | the keyword arguments when creating the instance. Each individual | |
185 | test is a tuple, the meaning of which depends on the type of the first | |
186 | element, which may be either a string, a function or a method of the | |
187 | megawidget class, as explained below. | |
188 | ||
189 | </p> | |
190 | ||
191 | <ul> | |
192 | <li> | |
193 | <p> | |
194 | If the first element is a string, then it is treated as an option of | |
195 | the megawidget and configure() is called to set the option to the | |
196 | value specified by the second element. After setting the option, | |
197 | cget() is called to query the option. If the test tuple has three | |
198 | elements, then the value returned by cget() must equal the value | |
199 | specified by the third element. Otherwise, the value returned must | |
200 | equal the value specified by the second element. For example, | |
201 | ||
202 | </p> | |
203 | <dl> | |
204 | <dd> | |
205 | <pre> | |
206 | ('vscrollmode', 'static'), | |
207 | ('text_relief', 'sunken'), | |
208 | ('vscrollmode', 'bogus', 'ValueError: bad vscrollmode ' + | |
209 | 'option "bogus": should be static, dynamic, or none'), | |
210 | </pre> | |
211 | </dd> | |
212 | </dl> | |
213 | ||
214 | </li> | |
215 | <li> | |
216 | <p> | |
217 | If the first element is a function or method, then the function or | |
218 | method is called. The arguments to the call are given by the second | |
219 | element. (As a special case, if the second element is not a tuple, it | |
220 | is used as the only argument to the call.) The test tuple may have 2, | |
221 | 3 or 4 elements. | |
222 | ||
223 | </p> | |
224 | <ul> | |
225 | <li> | |
226 | <p> | |
227 | If it has two elements, then the value returned by the call must be | |
228 | None. For example, | |
229 | ||
230 | </p> | |
231 | <dl> | |
232 | <dd> | |
233 | <pre> | |
234 | (c.exportfile, '/tmp/ScrolledText_test.py'), | |
235 | (os.unlink, '/tmp/ScrolledText_test.py'), | |
236 | </pre> | |
237 | </dd> | |
238 | </dl> | |
239 | ||
240 | </li> | |
241 | <li> | |
242 | <p> | |
243 | If it has four elements, then the third element is a dictionary to use | |
244 | for the keyword arguments in the call and the value returned by the | |
245 | call must equal the value specified by the fourth element. For | |
246 | example, | |
247 | ||
248 | </p> | |
249 | <dl> | |
250 | <dd> | |
251 | <pre> | |
252 | (c.search, ('abc', '0.0'), {'nocase': 1}, '2.24'), | |
253 | </pre> | |
254 | </dd> | |
255 | </dl> | |
256 | ||
257 | </li> | |
258 | <li> | |
259 | <p> | |
260 | If is has three elements and the third element is a dictionary, then | |
261 | it is used for the keyword arguments in the call and the value | |
262 | returned by the call must be None. For example | |
263 | ||
264 | </p> | |
265 | <dl> | |
266 | <dd> | |
267 | <pre> | |
268 | (c.configurepane, 'first', {'size' : 200}), | |
269 | </pre> | |
270 | </dd> | |
271 | </dl> | |
272 | ||
273 | </li> | |
274 | <li> | |
275 | <p> | |
276 | If is has three elements and the third element is not a dictionary, | |
277 | then the value returned by the call must equal the value specified by | |
278 | the third element. For example, | |
279 | ||
280 | </p> | |
281 | <dl> | |
282 | <dd> | |
283 | <pre> | |
284 | (c.components, (), ['hull', 'label']), | |
285 | (c.add, ('Legumes',), | |
286 | 'ValueError: name "Legumes" already exists'), | |
287 | </pre> | |
288 | </dd> | |
289 | </dl> | |
290 | ||
291 | </li> | |
292 | </ul> | |
293 | </li> | |
294 | </ul> | |
295 | ||
296 | <p> | |
297 | Some special functions and values supplied by the Test module that may | |
298 | be used in the tests include: | |
299 | </p> | |
300 | <dl> | |
301 | <dd> | |
302 | <pre> | |
303 | Test.callback callback taking no arguments | |
304 | Test.callback1 callback taking one argument | |
305 | Test.callbackN callback taking any number of arguments | |
306 | ||
307 | Test.currentWidget returns the widget instance being tested | |
308 | Test.num_options returns number of options for the widget | |
309 | ||
310 | Test.earthris a sample Tkinter.PhotoImage | |
311 | Test.flagup a sample Tkinter.BitmapImage | |
312 | Test.floatvar a Tkinter.DoubleVar | |
313 | Test.stringvar a Tkinter.StringVar | |
314 | </pre> | |
315 | </dd> | |
316 | </dl> | |
317 | ||
318 | <p> | |
319 | To slow down a test (to see what is being displayed), add the | |
320 | following line which sets the delay between tests to (say) 1000 | |
321 | milliseconds: | |
322 | ||
323 | </p> | |
324 | <dl> | |
325 | <dd> | |
326 | <pre> | |
327 | Test.setdelay(1000) | |
328 | </pre> | |
329 | </dd> | |
330 | </dl> | |
331 | ||
332 | <p> | |
333 | To print information about what is being tested, add the line: | |
334 | ||
335 | </p> | |
336 | <dl> | |
337 | <dd> | |
338 | <pre> | |
339 | Test.setverbose(1) | |
340 | </pre> | |
341 | </dd> | |
342 | </dl> | |
343 | ||
344 | </dd> | |
345 | </dl> | |
346 | ||
347 | ||
348 | <center><P ALIGN="CENTER"> | |
349 | <IMG SRC = blue_line.gif ALT = "" WIDTH=320 HEIGHT=5> | |
350 | </p></center> | |
351 | ||
352 | ||
353 | <font size=-1> | |
354 | <center><P ALIGN="CENTER"> | |
355 | Pmw 1.2 - | |
356 | 5 Aug 2003 | |
357 | - <a href="index.html">Home</a> | |
358 | ||
359 | </p></center> | |
360 | </font> | |
361 | ||
362 | </body> | |
363 | </html> | |
364 |