blob: 4ad05f3994e6a370babeef9ea934b3deaf946d8f [file] [log] [blame]
Kurt B. Kaiser09cb74b2003-06-12 04:20:56 +00001"""About Dialog for IDLE
2
Steven M. Gava44d3d1a2001-07-31 06:59:02 +00003"""
Neal Norwitz9d72bb42007-04-17 08:48:32 +00004import os
Terry Jan Reedy296c66e2015-05-16 19:28:32 -04005from sys import version
Terry Jan Reedybfbaa6b2016-08-31 00:50:55 -04006
Terry Jan Reedy296c66e2015-05-16 19:28:32 -04007from tkinter import *
Terry Jan Reedybfbaa6b2016-08-31 00:50:55 -04008
Terry Jan Reedy6fa5bdc2016-05-28 13:22:31 -04009from idlelib import textview
Neal Norwitz539594f2002-11-30 19:12:41 +000010
Terry Jan Reedybfbaa6b2016-08-31 00:50:55 -040011
Steven M. Gava44d3d1a2001-07-31 06:59:02 +000012class AboutDialog(Toplevel):
Kurt B. Kaiser09cb74b2003-06-12 04:20:56 +000013 """Modal about dialog for idle
14
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +000015 """
mlouielu054e0912017-05-22 06:19:35 +080016 def __init__(self, parent, title, _htest=False, _utest=False):
Terry Jan Reedy1b392ff2014-05-24 18:48:18 -040017 """
18 _htest - bool, change box location when running htest
mlouielu054e0912017-05-22 06:19:35 +080019 _utest - bool, don't wait_window when running unittest
Terry Jan Reedy1b392ff2014-05-24 18:48:18 -040020 """
Steven M. Gava885c0bb2001-07-31 10:44:35 +000021 Toplevel.__init__(self, parent)
22 self.configure(borderwidth=5)
Terry Jan Reedy1b392ff2014-05-24 18:48:18 -040023 # place dialog below parent if running htest
24 self.geometry("+%d+%d" % (
25 parent.winfo_rootx()+30,
26 parent.winfo_rooty()+(30 if not _htest else 100)))
Kurt B. Kaiser09cb74b2003-06-12 04:20:56 +000027 self.bg = "#707070"
28 self.fg = "#ffffff"
Steven M. Gava885c0bb2001-07-31 10:44:35 +000029 self.CreateWidgets()
Kurt B. Kaiser09cb74b2003-06-12 04:20:56 +000030 self.resizable(height=FALSE, width=FALSE)
Steven M. Gava885c0bb2001-07-31 10:44:35 +000031 self.title(title)
32 self.transient(parent)
33 self.grab_set()
34 self.protocol("WM_DELETE_WINDOW", self.Ok)
35 self.parent = parent
36 self.buttonOk.focus_set()
Steven M. Gava885c0bb2001-07-31 10:44:35 +000037 self.bind('<Return>',self.Ok) #dismiss dialog
38 self.bind('<Escape>',self.Ok) #dismiss dialog
mlouielu054e0912017-05-22 06:19:35 +080039 self._current_textview = None
40 self._utest = _utest
41
42 if not _utest:
43 self.deiconify()
44 self.wait_window()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +000045
Steven M. Gava885c0bb2001-07-31 10:44:35 +000046 def CreateWidgets(self):
Terry Jan Reedy296c66e2015-05-16 19:28:32 -040047 release = version[:version.index(' ')]
Kurt B. Kaiser09cb74b2003-06-12 04:20:56 +000048 frameMain = Frame(self, borderwidth=2, relief=SUNKEN)
Steven M. Gava885c0bb2001-07-31 10:44:35 +000049 frameButtons = Frame(self)
Kurt B. Kaiser09cb74b2003-06-12 04:20:56 +000050 frameButtons.pack(side=BOTTOM, fill=X)
51 frameMain.pack(side=TOP, expand=TRUE, fill=BOTH)
52 self.buttonOk = Button(frameButtons, text='Close',
53 command=self.Ok)
54 self.buttonOk.pack(padx=5, pady=5)
55 #self.picture = Image('photo', data=self.pictureData)
56 frameBg = Frame(frameMain, bg=self.bg)
57 frameBg.pack(expand=TRUE, fill=BOTH)
58 labelTitle = Label(frameBg, text='IDLE', fg=self.fg, bg=self.bg,
59 font=('courier', 24, 'bold'))
60 labelTitle.grid(row=0, column=0, sticky=W, padx=10, pady=10)
61 #labelPicture = Label(frameBg, text='[picture]')
62 #image=self.picture, bg=self.bg)
63 #labelPicture.grid(row=1, column=1, sticky=W, rowspan=2,
64 # padx=0, pady=3)
65 byline = "Python's Integrated DeveLopment Environment" + 5*'\n'
66 labelDesc = Label(frameBg, text=byline, justify=LEFT,
67 fg=self.fg, bg=self.bg)
68 labelDesc.grid(row=2, column=0, sticky=W, columnspan=3, padx=10, pady=5)
69 labelEmail = Label(frameBg, text='email: idle-dev@python.org',
70 justify=LEFT, fg=self.fg, bg=self.bg)
Kurt B. Kaiser73453752003-06-16 18:46:42 +000071 labelEmail.grid(row=6, column=0, columnspan=2,
72 sticky=W, padx=10, pady=0)
Terry Jan Reedyee3e5612014-10-14 16:56:42 -040073 labelWWW = Label(frameBg, text='https://docs.python.org/' +
Terry Jan Reedy296c66e2015-05-16 19:28:32 -040074 version[:3] + '/library/idle.html',
Kurt B. Kaiser09cb74b2003-06-12 04:20:56 +000075 justify=LEFT, fg=self.fg, bg=self.bg)
76 labelWWW.grid(row=7, column=0, columnspan=2, sticky=W, padx=10, pady=0)
77 Frame(frameBg, borderwidth=1, relief=SUNKEN,
78 height=2, bg=self.bg).grid(row=8, column=0, sticky=EW,
79 columnspan=3, padx=5, pady=5)
Terry Jan Reedy296c66e2015-05-16 19:28:32 -040080 labelPythonVer = Label(frameBg, text='Python version: ' +
81 release, fg=self.fg, bg=self.bg)
Kurt B. Kaiser09cb74b2003-06-12 04:20:56 +000082 labelPythonVer.grid(row=9, column=0, sticky=W, padx=10, pady=0)
Roger Serwy0803a392013-04-08 20:57:13 -050083 tkVer = self.tk.call('info', 'patchlevel')
Kurt B. Kaiser09cb74b2003-06-12 04:20:56 +000084 labelTkVer = Label(frameBg, text='Tk version: '+
85 tkVer, fg=self.fg, bg=self.bg)
86 labelTkVer.grid(row=9, column=1, sticky=W, padx=2, pady=0)
87 py_button_f = Frame(frameBg, bg=self.bg)
88 py_button_f.grid(row=10, column=0, columnspan=2, sticky=NSEW)
mlouielu054e0912017-05-22 06:19:35 +080089 self.buttonLicense = Button(py_button_f, text='License', width=8,
90 highlightbackground=self.bg,
91 command=self.ShowLicense)
92 self.buttonLicense.pack(side=LEFT, padx=10, pady=10)
93 self.buttonCopyright = Button(py_button_f, text='Copyright', width=8,
94 highlightbackground=self.bg,
95 command=self.ShowCopyright)
96 self.buttonCopyright.pack(side=LEFT, padx=10, pady=10)
97 self.buttonCredits = Button(py_button_f, text='Credits', width=8,
98 highlightbackground=self.bg,
99 command=self.ShowPythonCredits)
100 self.buttonCredits.pack(side=LEFT, padx=10, pady=10)
Kurt B. Kaiser09cb74b2003-06-12 04:20:56 +0000101 Frame(frameBg, borderwidth=1, relief=SUNKEN,
102 height=2, bg=self.bg).grid(row=11, column=0, sticky=EW,
103 columnspan=3, padx=5, pady=5)
Terry Jan Reedy296c66e2015-05-16 19:28:32 -0400104 idle_v = Label(frameBg, text='IDLE version: ' + release,
Kurt B. Kaiser09cb74b2003-06-12 04:20:56 +0000105 fg=self.fg, bg=self.bg)
106 idle_v.grid(row=12, column=0, sticky=W, padx=10, pady=0)
107 idle_button_f = Frame(frameBg, bg=self.bg)
108 idle_button_f.grid(row=13, column=0, columnspan=3, sticky=NSEW)
mlouielu054e0912017-05-22 06:19:35 +0800109 self.idle_about_b = Button(idle_button_f, text='README', width=8,
110 highlightbackground=self.bg,
111 command=self.ShowIDLEAbout)
112 self.idle_about_b.pack(side=LEFT, padx=10, pady=10)
113 self.idle_news_b = Button(idle_button_f, text='NEWS', width=8,
114 highlightbackground=self.bg,
115 command=self.ShowIDLENEWS)
116 self.idle_news_b.pack(side=LEFT, padx=10, pady=10)
117 self.idle_credits_b = Button(idle_button_f, text='Credits', width=8,
118 highlightbackground=self.bg,
119 command=self.ShowIDLECredits)
120 self.idle_credits_b.pack(side=LEFT, padx=10, pady=10)
Steven M. Gava885c0bb2001-07-31 10:44:35 +0000121
Terry Jan Reedy35676512016-01-16 23:44:04 -0500122 # License, et all, are of type _sitebuiltins._Printer
Steven M. Gava885c0bb2001-07-31 10:44:35 +0000123 def ShowLicense(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000124 self.display_printer_text('About - License', license)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000125
Kurt B. Kaiser09cb74b2003-06-12 04:20:56 +0000126 def ShowCopyright(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000127 self.display_printer_text('About - Copyright', copyright)
Kurt B. Kaiser09cb74b2003-06-12 04:20:56 +0000128
129 def ShowPythonCredits(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000130 self.display_printer_text('About - Python Credits', credits)
Kurt B. Kaiser09cb74b2003-06-12 04:20:56 +0000131
Terry Jan Reedy35676512016-01-16 23:44:04 -0500132 # Encode CREDITS.txt to utf-8 for proper version of Loewis.
133 # Specify others as ascii until need utf-8, so catch errors.
Kurt B. Kaiser09cb74b2003-06-12 04:20:56 +0000134 def ShowIDLECredits(self):
Terry Jan Reedy35676512016-01-16 23:44:04 -0500135 self.display_file_text('About - Credits', 'CREDITS.txt', 'utf-8')
Steven M. Gava885c0bb2001-07-31 10:44:35 +0000136
Kurt B. Kaiser09cb74b2003-06-12 04:20:56 +0000137 def ShowIDLEAbout(self):
Terry Jan Reedy35676512016-01-16 23:44:04 -0500138 self.display_file_text('About - Readme', 'README.txt', 'ascii')
Kurt B. Kaiser09cb74b2003-06-12 04:20:56 +0000139
140 def ShowIDLENEWS(self):
Terry Jan Reedy6ff7a142016-06-22 03:55:20 -0400141 self.display_file_text('About - NEWS', 'NEWS.txt', 'utf-8')
Kurt B. Kaiser09cb74b2003-06-12 04:20:56 +0000142
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000143 def display_printer_text(self, title, printer):
Kurt B. Kaiser09cb74b2003-06-12 04:20:56 +0000144 printer._Printer__setup()
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000145 text = '\n'.join(printer._Printer__lines)
mlouielu054e0912017-05-22 06:19:35 +0800146 self._current_textview = textview.view_text(
147 self, title, text, _utest=self._utest)
Kurt B. Kaiser09cb74b2003-06-12 04:20:56 +0000148
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000149 def display_file_text(self, title, filename, encoding=None):
150 fn = os.path.join(os.path.abspath(os.path.dirname(__file__)), filename)
mlouielu054e0912017-05-22 06:19:35 +0800151 self._current_textview = textview.view_file(
152 self, title, fn, encoding, _utest=self._utest)
Steven M. Gava885c0bb2001-07-31 10:44:35 +0000153
154 def Ok(self, event=None):
155 self.destroy()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000156
Terry Jan Reedybfbaa6b2016-08-31 00:50:55 -0400157
Steven M. Gava44d3d1a2001-07-31 06:59:02 +0000158if __name__ == '__main__':
Terry Jan Reedydf1d34c2016-06-22 04:50:16 -0400159 import unittest
Terry Jan Reedy47e00e52016-06-22 05:49:15 -0400160 unittest.main('idlelib.idle_test.test_help_about', verbosity=2, exit=False)
Terry Jan Reedy06313b72014-05-11 23:32:32 -0400161 from idlelib.idle_test.htest import run
162 run(AboutDialog)