annotate Lib/tkinter/test/support.py @ 78069:a8aa77458e12 3.2

Add c_size_t and c_ssize_t to the ctypes summary table.
author Antoine Pitrou <solipsis@pitrou.net>
date Thu, 12 Jul 2012 20:31:50 +0200
parents b58b0c5c7e96
children 92e268f2719e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
71185
279488f5a171 Issue #8716: Avoid crashes caused by Aqua Tk on OSX when attempting to run
Ned Deily <nad@acm.org>
parents: 51255
diff changeset
1 import sys
51132
c9093d41590e Merged revisions 69050 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents:
diff changeset
2 import tkinter
71185
279488f5a171 Issue #8716: Avoid crashes caused by Aqua Tk on OSX when attempting to run
Ned Deily <nad@acm.org>
parents: 51255
diff changeset
3 import unittest
279488f5a171 Issue #8716: Avoid crashes caused by Aqua Tk on OSX when attempting to run
Ned Deily <nad@acm.org>
parents: 51255
diff changeset
4
71242
b58b0c5c7e96 Issue #8716: Instead of relying on Aqua Tk exceptions to detect lack of
Ned Deily <nad@acm.org>
parents: 71185
diff changeset
5 _tk_unavailable = None
71185
279488f5a171 Issue #8716: Avoid crashes caused by Aqua Tk on OSX when attempting to run
Ned Deily <nad@acm.org>
parents: 51255
diff changeset
6
279488f5a171 Issue #8716: Avoid crashes caused by Aqua Tk on OSX when attempting to run
Ned Deily <nad@acm.org>
parents: 51255
diff changeset
7 def check_tk_availability():
279488f5a171 Issue #8716: Avoid crashes caused by Aqua Tk on OSX when attempting to run
Ned Deily <nad@acm.org>
parents: 51255
diff changeset
8 """Check that Tk is installed and available."""
71242
b58b0c5c7e96 Issue #8716: Instead of relying on Aqua Tk exceptions to detect lack of
Ned Deily <nad@acm.org>
parents: 71185
diff changeset
9 global _tk_unavailable
71185
279488f5a171 Issue #8716: Avoid crashes caused by Aqua Tk on OSX when attempting to run
Ned Deily <nad@acm.org>
parents: 51255
diff changeset
10
71242
b58b0c5c7e96 Issue #8716: Instead of relying on Aqua Tk exceptions to detect lack of
Ned Deily <nad@acm.org>
parents: 71185
diff changeset
11 if _tk_unavailable is None:
b58b0c5c7e96 Issue #8716: Instead of relying on Aqua Tk exceptions to detect lack of
Ned Deily <nad@acm.org>
parents: 71185
diff changeset
12 _tk_unavailable = False
b58b0c5c7e96 Issue #8716: Instead of relying on Aqua Tk exceptions to detect lack of
Ned Deily <nad@acm.org>
parents: 71185
diff changeset
13 if sys.platform == 'darwin':
b58b0c5c7e96 Issue #8716: Instead of relying on Aqua Tk exceptions to detect lack of
Ned Deily <nad@acm.org>
parents: 71185
diff changeset
14 # The Aqua Tk implementations on OS X can abort the process if
b58b0c5c7e96 Issue #8716: Instead of relying on Aqua Tk exceptions to detect lack of
Ned Deily <nad@acm.org>
parents: 71185
diff changeset
15 # being called in an environment where a window server connection
b58b0c5c7e96 Issue #8716: Instead of relying on Aqua Tk exceptions to detect lack of
Ned Deily <nad@acm.org>
parents: 71185
diff changeset
16 # cannot be made, for instance when invoked by a buildbot or ssh
b58b0c5c7e96 Issue #8716: Instead of relying on Aqua Tk exceptions to detect lack of
Ned Deily <nad@acm.org>
parents: 71185
diff changeset
17 # process not running under the same user id as the current console
b58b0c5c7e96 Issue #8716: Instead of relying on Aqua Tk exceptions to detect lack of
Ned Deily <nad@acm.org>
parents: 71185
diff changeset
18 # user. To avoid that, raise an exception if the window manager
b58b0c5c7e96 Issue #8716: Instead of relying on Aqua Tk exceptions to detect lack of
Ned Deily <nad@acm.org>
parents: 71185
diff changeset
19 # connection is not available.
b58b0c5c7e96 Issue #8716: Instead of relying on Aqua Tk exceptions to detect lack of
Ned Deily <nad@acm.org>
parents: 71185
diff changeset
20 from ctypes import cdll, c_int, pointer, Structure
b58b0c5c7e96 Issue #8716: Instead of relying on Aqua Tk exceptions to detect lack of
Ned Deily <nad@acm.org>
parents: 71185
diff changeset
21 from ctypes.util import find_library
b58b0c5c7e96 Issue #8716: Instead of relying on Aqua Tk exceptions to detect lack of
Ned Deily <nad@acm.org>
parents: 71185
diff changeset
22
b58b0c5c7e96 Issue #8716: Instead of relying on Aqua Tk exceptions to detect lack of
Ned Deily <nad@acm.org>
parents: 71185
diff changeset
23 app_services = cdll.LoadLibrary(find_library("ApplicationServices"))
71185
279488f5a171 Issue #8716: Avoid crashes caused by Aqua Tk on OSX when attempting to run
Ned Deily <nad@acm.org>
parents: 51255
diff changeset
24
71242
b58b0c5c7e96 Issue #8716: Instead of relying on Aqua Tk exceptions to detect lack of
Ned Deily <nad@acm.org>
parents: 71185
diff changeset
25 if app_services.CGMainDisplayID() == 0:
b58b0c5c7e96 Issue #8716: Instead of relying on Aqua Tk exceptions to detect lack of
Ned Deily <nad@acm.org>
parents: 71185
diff changeset
26 _tk_unavailable = "cannot run without OS X window manager"
b58b0c5c7e96 Issue #8716: Instead of relying on Aqua Tk exceptions to detect lack of
Ned Deily <nad@acm.org>
parents: 71185
diff changeset
27 else:
b58b0c5c7e96 Issue #8716: Instead of relying on Aqua Tk exceptions to detect lack of
Ned Deily <nad@acm.org>
parents: 71185
diff changeset
28 class ProcessSerialNumber(Structure):
b58b0c5c7e96 Issue #8716: Instead of relying on Aqua Tk exceptions to detect lack of
Ned Deily <nad@acm.org>
parents: 71185
diff changeset
29 _fields_ = [("highLongOfPSN", c_int),
b58b0c5c7e96 Issue #8716: Instead of relying on Aqua Tk exceptions to detect lack of
Ned Deily <nad@acm.org>
parents: 71185
diff changeset
30 ("lowLongOfPSN", c_int)]
b58b0c5c7e96 Issue #8716: Instead of relying on Aqua Tk exceptions to detect lack of
Ned Deily <nad@acm.org>
parents: 71185
diff changeset
31 psn = ProcessSerialNumber()
b58b0c5c7e96 Issue #8716: Instead of relying on Aqua Tk exceptions to detect lack of
Ned Deily <nad@acm.org>
parents: 71185
diff changeset
32 psn_p = pointer(psn)
b58b0c5c7e96 Issue #8716: Instead of relying on Aqua Tk exceptions to detect lack of
Ned Deily <nad@acm.org>
parents: 71185
diff changeset
33 if ( (app_services.GetCurrentProcess(psn_p) < 0) or
b58b0c5c7e96 Issue #8716: Instead of relying on Aqua Tk exceptions to detect lack of
Ned Deily <nad@acm.org>
parents: 71185
diff changeset
34 (app_services.SetFrontProcess(psn_p) < 0) ):
b58b0c5c7e96 Issue #8716: Instead of relying on Aqua Tk exceptions to detect lack of
Ned Deily <nad@acm.org>
parents: 71185
diff changeset
35 _tk_unavailable = "cannot run without OS X gui process"
b58b0c5c7e96 Issue #8716: Instead of relying on Aqua Tk exceptions to detect lack of
Ned Deily <nad@acm.org>
parents: 71185
diff changeset
36 else: # not OS X
b58b0c5c7e96 Issue #8716: Instead of relying on Aqua Tk exceptions to detect lack of
Ned Deily <nad@acm.org>
parents: 71185
diff changeset
37 import tkinter
b58b0c5c7e96 Issue #8716: Instead of relying on Aqua Tk exceptions to detect lack of
Ned Deily <nad@acm.org>
parents: 71185
diff changeset
38 try:
b58b0c5c7e96 Issue #8716: Instead of relying on Aqua Tk exceptions to detect lack of
Ned Deily <nad@acm.org>
parents: 71185
diff changeset
39 tkinter.Button()
b58b0c5c7e96 Issue #8716: Instead of relying on Aqua Tk exceptions to detect lack of
Ned Deily <nad@acm.org>
parents: 71185
diff changeset
40 except tkinter.TclError as msg:
b58b0c5c7e96 Issue #8716: Instead of relying on Aqua Tk exceptions to detect lack of
Ned Deily <nad@acm.org>
parents: 71185
diff changeset
41 # assuming tk is not available
b58b0c5c7e96 Issue #8716: Instead of relying on Aqua Tk exceptions to detect lack of
Ned Deily <nad@acm.org>
parents: 71185
diff changeset
42 _tk_unavailable = "tk not available: %s" % msg
71185
279488f5a171 Issue #8716: Avoid crashes caused by Aqua Tk on OSX when attempting to run
Ned Deily <nad@acm.org>
parents: 51255
diff changeset
43
71242
b58b0c5c7e96 Issue #8716: Instead of relying on Aqua Tk exceptions to detect lack of
Ned Deily <nad@acm.org>
parents: 71185
diff changeset
44 if _tk_unavailable:
b58b0c5c7e96 Issue #8716: Instead of relying on Aqua Tk exceptions to detect lack of
Ned Deily <nad@acm.org>
parents: 71185
diff changeset
45 raise unittest.SkipTest(_tk_unavailable)
71185
279488f5a171 Issue #8716: Avoid crashes caused by Aqua Tk on OSX when attempting to run
Ned Deily <nad@acm.org>
parents: 51255
diff changeset
46 return
51132
c9093d41590e Merged revisions 69050 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents:
diff changeset
47
c9093d41590e Merged revisions 69050 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents:
diff changeset
48 def get_tk_root():
71185
279488f5a171 Issue #8716: Avoid crashes caused by Aqua Tk on OSX when attempting to run
Ned Deily <nad@acm.org>
parents: 51255
diff changeset
49 check_tk_availability() # raise exception if tk unavailable
51132
c9093d41590e Merged revisions 69050 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents:
diff changeset
50 try:
c9093d41590e Merged revisions 69050 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents:
diff changeset
51 root = tkinter._default_root
c9093d41590e Merged revisions 69050 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents:
diff changeset
52 except AttributeError:
c9093d41590e Merged revisions 69050 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents:
diff changeset
53 # it is possible to disable default root in Tkinter, although
c9093d41590e Merged revisions 69050 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents:
diff changeset
54 # I haven't seen people doing it (but apparently someone did it
c9093d41590e Merged revisions 69050 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents:
diff changeset
55 # here).
c9093d41590e Merged revisions 69050 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents:
diff changeset
56 root = None
c9093d41590e Merged revisions 69050 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents:
diff changeset
57
c9093d41590e Merged revisions 69050 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents:
diff changeset
58 if root is None:
c9093d41590e Merged revisions 69050 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents:
diff changeset
59 # create a new master only if there isn't one already
c9093d41590e Merged revisions 69050 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents:
diff changeset
60 root = tkinter.Tk()
c9093d41590e Merged revisions 69050 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents:
diff changeset
61
c9093d41590e Merged revisions 69050 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents:
diff changeset
62 return root
c9093d41590e Merged revisions 69050 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents:
diff changeset
63
51255
8c4410d067ee Recorded merge of revisions 69195 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents: 51132
diff changeset
64 def root_deiconify():
8c4410d067ee Recorded merge of revisions 69195 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents: 51132
diff changeset
65 root = get_tk_root()
8c4410d067ee Recorded merge of revisions 69195 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents: 51132
diff changeset
66 root.deiconify()
8c4410d067ee Recorded merge of revisions 69195 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents: 51132
diff changeset
67
8c4410d067ee Recorded merge of revisions 69195 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents: 51132
diff changeset
68 def root_withdraw():
8c4410d067ee Recorded merge of revisions 69195 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents: 51132
diff changeset
69 root = get_tk_root()
8c4410d067ee Recorded merge of revisions 69195 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents: 51132
diff changeset
70 root.withdraw()
8c4410d067ee Recorded merge of revisions 69195 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents: 51132
diff changeset
71
51132
c9093d41590e Merged revisions 69050 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents:
diff changeset
72
c9093d41590e Merged revisions 69050 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents:
diff changeset
73 def simulate_mouse_click(widget, x, y):
c9093d41590e Merged revisions 69050 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents:
diff changeset
74 """Generate proper events to click at the x, y position (tries to act
c9093d41590e Merged revisions 69050 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents:
diff changeset
75 like an X server)."""
c9093d41590e Merged revisions 69050 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents:
diff changeset
76 widget.event_generate('<Enter>', x=0, y=0)
c9093d41590e Merged revisions 69050 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents:
diff changeset
77 widget.event_generate('<Motion>', x=x, y=y)
c9093d41590e Merged revisions 69050 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents:
diff changeset
78 widget.event_generate('<ButtonPress-1>', x=x, y=y)
c9093d41590e Merged revisions 69050 via svnmerge from
Guilherme Polo <ggpolo@gmail.com>
parents:
diff changeset
79 widget.event_generate('<ButtonRelease-1>', x=x, y=y)