4
4
import os
5
5
from sys import version
6
6
7
- from tkinter import *
7
+ from tkinter import Toplevel , Frame , Label , Button
8
+ from tkinter import SUNKEN , TOP , BOTTOM , LEFT , X , BOTH , W , EW , NSEW
8
9
9
10
from idlelib import textview
10
11
@@ -13,9 +14,13 @@ class AboutDialog(Toplevel):
13
14
"""Modal about dialog for idle
14
15
15
16
"""
16
- def __init__ (self , parent , title , _htest = False ):
17
- """
17
+ def __init__ (self , parent , title , _htest = False , _utest = False ):
18
+ """Create popup, do not return until tk widget destroyed.
19
+
20
+ parent - parent of this dialog
21
+ title - string which is title of popup dialog
18
22
_htest - bool, change box location when running htest
23
+ _utest - bool, don't wait_window when running unittest
19
24
"""
20
25
Toplevel .__init__ (self , parent )
21
26
self .configure (borderwidth = 5 )
@@ -25,125 +30,152 @@ def __init__(self, parent, title, _htest=False):
25
30
parent .winfo_rooty ()+ (30 if not _htest else 100 )))
26
31
self .bg = "#707070"
27
32
self .fg = "#ffffff"
28
- self .CreateWidgets ()
29
- self .resizable (height = FALSE , width = FALSE )
33
+ self .create_widgets ()
34
+ self .resizable (height = False , width = False )
30
35
self .title (title )
31
36
self .transient (parent )
32
37
self .grab_set ()
33
- self .protocol ("WM_DELETE_WINDOW" , self .Ok )
38
+ self .protocol ("WM_DELETE_WINDOW" , self .ok )
34
39
self .parent = parent
35
- self .buttonOk .focus_set ()
36
- self .bind ('<Return>' ,self .Ok ) #dismiss dialog
37
- self .bind ('<Escape>' ,self .Ok ) #dismiss dialog
38
- self .wait_window ()
40
+ self .button_ok .focus_set ()
41
+ self .bind ('<Return>' , self .ok ) # dismiss dialog
42
+ self .bind ('<Escape>' , self .ok ) # dismiss dialog
43
+ self ._current_textview = None
44
+ self ._utest = _utest
39
45
40
- def CreateWidgets (self ):
46
+ if not _utest :
47
+ self .deiconify ()
48
+ self .wait_window ()
49
+
50
+ def create_widgets (self ):
41
51
release = version [:version .index (' ' )]
42
- frameMain = Frame (self , borderwidth = 2 , relief = SUNKEN )
43
- frameButtons = Frame (self )
44
- frameButtons .pack (side = BOTTOM , fill = X )
45
- frameMain .pack (side = TOP , expand = TRUE , fill = BOTH )
46
- self .buttonOk = Button (frameButtons , text = 'Close' ,
47
- command = self .Ok )
48
- self .buttonOk .pack (padx = 5 , pady = 5 )
49
- #self.picture = Image('photo', data=self.pictureData)
50
- frameBg = Frame (frameMain , bg = self .bg )
51
- frameBg .pack (expand = TRUE , fill = BOTH )
52
- labelTitle = Label (frameBg , text = 'IDLE' , fg = self .fg , bg = self .bg ,
53
- font = ('courier' , 24 , 'bold' ))
54
- labelTitle .grid (row = 0 , column = 0 , sticky = W , padx = 10 , pady = 10 )
55
- #labelPicture = Label(frameBg, text='[picture]')
56
- #image=self.picture, bg=self.bg)
57
- #labelPicture.grid(row=1, column=1, sticky=W, rowspan=2,
58
- # padx=0, pady=3)
59
- byline = "Python's Integrated DeveLopment Environment" + 5 * '\n '
60
- labelDesc = Label (frameBg , text = byline , justify = LEFT ,
61
- fg = self .fg , bg = self .bg )
62
- labelDesc .grid (row = 2 , column = 0 , sticky = W , columnspan = 3 , padx = 10 , pady = 5 )
63
- labelEmail = Label (
frameBg ,
text = 'email: [email protected] ' ,
64
- justify = LEFT , fg = self .fg , bg = self .bg )
65
- labelEmail .grid (row = 6 , column = 0 , columnspan = 2 ,
66
- sticky = W , padx = 10 , pady = 0 )
67
- labelWWW = Label (frameBg , text = 'https://docs.python.org/' +
68
- version [:3 ] + '/library/idle.html' ,
69
- justify = LEFT , fg = self .fg , bg = self .bg )
70
- labelWWW .grid (row = 7 , column = 0 , columnspan = 2 , sticky = W , padx = 10 , pady = 0 )
71
- Frame (frameBg , borderwidth = 1 , relief = SUNKEN ,
52
+ frame = Frame (self , borderwidth = 2 , relief = SUNKEN )
53
+ frame_buttons = Frame (self )
54
+ frame_buttons .pack (side = BOTTOM , fill = X )
55
+ frame .pack (side = TOP , expand = True , fill = BOTH )
56
+ self .button_ok = Button (frame_buttons , text = 'Close' ,
57
+ command = self .ok )
58
+ self .button_ok .pack (padx = 5 , pady = 5 )
59
+
60
+ frame_background = Frame (frame , bg = self .bg )
61
+ frame_background .pack (expand = True , fill = BOTH )
62
+
63
+ header = Label (frame_background , text = 'IDLE' , fg = self .fg ,
64
+ bg = self .bg , font = ('courier' , 24 , 'bold' ))
65
+ header .grid (row = 0 , column = 0 , sticky = W , padx = 10 , pady = 10 )
66
+ byline_text = "Python's Integrated DeveLopment Environment" + 5 * '\n '
67
+ byline = Label (frame_background , text = byline_text , justify = LEFT ,
68
+ fg = self .fg , bg = self .bg )
69
+ byline .grid (row = 2 , column = 0 , sticky = W , columnspan = 3 , padx = 10 , pady = 5 )
70
+ email = Label (
frame_background ,
text = 'email: [email protected] ' ,
71
+ justify = LEFT , fg = self .fg , bg = self .bg )
72
+ email .grid (row = 6 , column = 0 , columnspan = 2 , sticky = W , padx = 10 , pady = 0 )
73
+ docs = Label (frame_background , text = 'https://docs.python.org/' +
74
+ version [:3 ] + '/library/idle.html' ,
75
+ justify = LEFT , fg = self .fg , bg = self .bg )
76
+ docs .grid (row = 7 , column = 0 , columnspan = 2 , sticky = W , padx = 10 , pady = 0 )
77
+
78
+ Frame (frame_background , borderwidth = 1 , relief = SUNKEN ,
72
79
height = 2 , bg = self .bg ).grid (row = 8 , column = 0 , sticky = EW ,
73
80
columnspan = 3 , padx = 5 , pady = 5 )
74
- labelPythonVer = Label (frameBg , text = 'Python version: ' +
75
- release , fg = self .fg , bg = self .bg )
76
- labelPythonVer .grid (row = 9 , column = 0 , sticky = W , padx = 10 , pady = 0 )
77
- tkVer = self .tk .call ('info' , 'patchlevel' )
78
- labelTkVer = Label (frameBg , text = 'Tk version: ' +
79
- tkVer , fg = self .fg , bg = self .bg )
80
- labelTkVer .grid (row = 9 , column = 1 , sticky = W , padx = 2 , pady = 0 )
81
- py_button_f = Frame (frameBg , bg = self .bg )
82
- py_button_f .grid (row = 10 , column = 0 , columnspan = 2 , sticky = NSEW )
83
- buttonLicense = Button (py_button_f , text = 'License' , width = 8 ,
84
- highlightbackground = self .bg ,
85
- command = self .ShowLicense )
86
- buttonLicense .pack (side = LEFT , padx = 10 , pady = 10 )
87
- buttonCopyright = Button (py_button_f , text = 'Copyright' , width = 8 ,
81
+
82
+ pyver = Label (frame_background , text = 'Python version: ' + release ,
83
+ fg = self .fg , bg = self .bg )
84
+ pyver .grid (row = 9 , column = 0 , sticky = W , padx = 10 , pady = 0 )
85
+ tk_patchlevel = self .tk .call ('info' , 'patchlevel' )
86
+ tkver = Label (frame_background , text = 'Tk version: ' + tk_patchlevel ,
87
+ fg = self .fg , bg = self .bg )
88
+ tkver .grid (row = 9 , column = 1 , sticky = W , padx = 2 , pady = 0 )
89
+ py_buttons = Frame (frame_background , bg = self .bg )
90
+ py_buttons .grid (row = 10 , column = 0 , columnspan = 2 , sticky = NSEW )
91
+ self .py_license = Button (py_buttons , text = 'License' , width = 8 ,
92
+ highlightbackground = self .bg ,
93
+ command = self .show_py_license )
94
+ self .py_license .pack (side = LEFT , padx = 10 , pady = 10 )
95
+ self .py_copyright = Button (py_buttons , text = 'Copyright' , width = 8 ,
96
+ highlightbackground = self .bg ,
97
+ command = self .show_py_copyright )
98
+ self .py_copyright .pack (side = LEFT , padx = 10 , pady = 10 )
99
+ self .py_credits = Button (py_buttons , text = 'Credits' , width = 8 ,
88
100
highlightbackground = self .bg ,
89
- command = self .ShowCopyright )
90
- buttonCopyright .pack (side = LEFT , padx = 10 , pady = 10 )
91
- buttonCredits = Button (py_button_f , text = 'Credits' , width = 8 ,
92
- highlightbackground = self .bg ,
93
- command = self .ShowPythonCredits )
94
- buttonCredits .pack (side = LEFT , padx = 10 , pady = 10 )
95
- Frame (frameBg , borderwidth = 1 , relief = SUNKEN ,
101
+ command = self .show_py_credits )
102
+ self .py_credits .pack (side = LEFT , padx = 10 , pady = 10 )
103
+
104
+ Frame (frame_background , borderwidth = 1 , relief = SUNKEN ,
96
105
height = 2 , bg = self .bg ).grid (row = 11 , column = 0 , sticky = EW ,
97
106
columnspan = 3 , padx = 5 , pady = 5 )
98
- idle_v = Label (frameBg , text = 'IDLE version: ' + release ,
99
- fg = self .fg , bg = self .bg )
100
- idle_v .grid (row = 12 , column = 0 , sticky = W , padx = 10 , pady = 0 )
101
- idle_button_f = Frame (frameBg , bg = self .bg )
102
- idle_button_f .grid (row = 13 , column = 0 , columnspan = 3 , sticky = NSEW )
103
- idle_about_b = Button (idle_button_f , text = 'README' , width = 8 ,
104
- highlightbackground = self .bg ,
105
- command = self .ShowIDLEAbout )
106
- idle_about_b .pack (side = LEFT , padx = 10 , pady = 10 )
107
- idle_news_b = Button (idle_button_f , text = 'NEWS' , width = 8 ,
108
- highlightbackground = self .bg ,
109
- command = self .ShowIDLENEWS )
110
- idle_news_b .pack (side = LEFT , padx = 10 , pady = 10 )
111
- idle_credits_b = Button (idle_button_f , text = 'Credits' , width = 8 ,
112
- highlightbackground = self .bg ,
113
- command = self .ShowIDLECredits )
114
- idle_credits_b .pack (side = LEFT , padx = 10 , pady = 10 )
115
107
116
- # License, et all, are of type _sitebuiltins._Printer
117
- def ShowLicense (self ):
108
+ idlever = Label (frame_background , text = 'IDLE version: ' + release ,
109
+ fg = self .fg , bg = self .bg )
110
+ idlever .grid (row = 12 , column = 0 , sticky = W , padx = 10 , pady = 0 )
111
+ idle_buttons = Frame (frame_background , bg = self .bg )
112
+ idle_buttons .grid (row = 13 , column = 0 , columnspan = 3 , sticky = NSEW )
113
+ self .readme = Button (idle_buttons , text = 'README' , width = 8 ,
114
+ highlightbackground = self .bg ,
115
+ command = self .show_readme )
116
+ self .readme .pack (side = LEFT , padx = 10 , pady = 10 )
117
+ self .idle_news = Button (idle_buttons , text = 'NEWS' , width = 8 ,
118
+ highlightbackground = self .bg ,
119
+ command = self .show_idle_news )
120
+ self .idle_news .pack (side = LEFT , padx = 10 , pady = 10 )
121
+ self .idle_credits = Button (idle_buttons , text = 'Credits' , width = 8 ,
122
+ highlightbackground = self .bg ,
123
+ command = self .show_idle_credits )
124
+ self .idle_credits .pack (side = LEFT , padx = 10 , pady = 10 )
125
+
126
+ # License, copyright, and credits are of type _sitebuiltins._Printer
127
+ def show_py_license (self ):
128
+ "Handle License button event."
118
129
self .display_printer_text ('About - License' , license )
119
130
120
- def ShowCopyright (self ):
131
+ def show_py_copyright (self ):
132
+ "Handle Copyright button event."
121
133
self .display_printer_text ('About - Copyright' , copyright )
122
134
123
- def ShowPythonCredits (self ):
135
+ def show_py_credits (self ):
136
+ "Handle Python Credits button event."
124
137
self .display_printer_text ('About - Python Credits' , credits )
125
138
126
139
# Encode CREDITS.txt to utf-8 for proper version of Loewis.
127
140
# Specify others as ascii until need utf-8, so catch errors.
128
- def ShowIDLECredits (self ):
141
+ def show_idle_credits (self ):
142
+ "Handle Idle Credits button event."
129
143
self .display_file_text ('About - Credits' , 'CREDITS.txt' , 'utf-8' )
130
144
131
- def ShowIDLEAbout (self ):
145
+ def show_readme (self ):
146
+ "Handle Readme button event."
132
147
self .display_file_text ('About - Readme' , 'README.txt' , 'ascii' )
133
148
134
- def ShowIDLENEWS (self ):
149
+ def show_idle_news (self ):
150
+ "Handle News button event."
135
151
self .display_file_text ('About - NEWS' , 'NEWS.txt' , 'utf-8' )
136
152
137
153
def display_printer_text (self , title , printer ):
154
+ """Create textview for built-in constants.
155
+
156
+ Built-in constants have type _sitebuiltins._Printer. The
157
+ text is extracted from the built-in and then sent to a text
158
+ viewer with self as the parent and title as the title of
159
+ the popup.
160
+ """
138
161
printer ._Printer__setup ()
139
162
text = '\n ' .join (printer ._Printer__lines )
140
- textview .view_text (self , title , text )
163
+ self ._current_textview = textview .view_text (
164
+ self , title , text , _utest = self ._utest )
141
165
142
166
def display_file_text (self , title , filename , encoding = None ):
167
+ """Create textview for filename.
168
+
169
+ The filename needs to be in the current directory. The path
170
+ is sent to a text viewer with self as the parent, title as
171
+ the title of the popup, and the file encoding.
172
+ """
143
173
fn = os .path .join (os .path .abspath (os .path .dirname (__file__ )), filename )
144
- textview .view_file (self , title , fn , encoding )
174
+ self ._current_textview = textview .view_file (
175
+ self , title , fn , encoding , _utest = self ._utest )
145
176
146
- def Ok (self , event = None ):
177
+ def ok (self , event = None ):
178
+ "Dismiss help_about dialog."
147
179
self .destroy ()
148
180
149
181
0 commit comments