Module pdoc3_mdnotes.gui
GUI
Module gathers classes and methods necessary to create GUI. Its divided for two
blocks Directory and Buttons both extending tkinter.Frame. Directory
holds label, path entry and browse button. In Buttons frame there are bottom
buttons with their functions. Gui connects each part and places them in main
window which will be displayed. Modules used: pathlib, sys, tkinter with
filedialog, messagebox and webbrowser.
License
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Expand source code Browse git
"""#### GUI
Module gathers classes and methods necessary to create GUI. Its divided for two
blocks `Directory` and `Buttons` both extending `tkinter.Frame`. `Directory`
holds label, path entry and browse button. In `Buttons` frame there are bottom
buttons with their functions. `Gui` connects each part and places them in main
window which will be displayed. Modules used: `pathlib`, `sys`, `tkinter` with
`filedialog`, `messagebox` and `webbrowser`.
#### License
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
"""
from pathlib import Path
import sys
import tkinter as tk
from tkinter.filedialog import askdirectory
import tkinter.messagebox as msg
import webbrowser
from pdoc3_mdnotes import mdnotes
class Gui(tk.Tk):
"""
Place individual widgets and allow their communication. It extends `tk.Tk`.
...
Attributes
----------
directory : Directory
used for communication with `Directory` widget
"""
def __init__(self, title, size):
"""Create applications GUI.
Parameters
----------
title : str
name of application, displayed on top bar
size : str
application size in format 'heightxwidth'
"""
super().__init__(className=title)
self.title(title)
self.geometry(size)
self.resizable(False, False)
self.iconphoto(False,
tk.PhotoImage(file=self.get_image('mdnotes.png')))
self.directory = Directory(self)
self.directory.grid(row=0, column=0, padx=20, pady=25)
buttons = Buttons(self)
buttons.grid(row=1, column=0, padx=10, pady=15, sticky='SE')
self.bind('<Return>', buttons.create_notes)
self.bind('<Escape>', sys.exit)
@staticmethod
def get_image(name):
"""Return image path.
According to type of installation picks method to get image path. It
can by obtained from module directory or from `_MEIPASS` when
application is built.
Parameters
----------
name : str
image name with extension
Returns
-------
pathlib.Path
image path
"""
directory = getattr(sys, '_MEIPASS', Path(__file__).parent.absolute())
return Path(directory) / 'icons' / name
class Directory(tk.Frame):
"""
Create directory widget. It extends `tk.Frame`.
...
Attributes
----------
home : pathlib.Path
home directory path displayed in entry on application startup, set as
initial directory for browse button
icon : tk.PhotoImage
object containing icon used with browse button
variable : tk.StringVar
stores value for path used in application, displayed in entry
"""
def __init__(self, menu):
"""Place directory widget elements.
Parameters
----------
menu : Gui
container where `Directory` widget will be bound
"""
super().__init__(menu)
self.home = Path.home()
self.icon = tk.PhotoImage(file=menu.get_image('browse.png'))
self.variable = tk.StringVar(self, value=self.home)
tk.Label(self, text='Path: ', font='none 10').grid(row=0, column=0)
tk.Entry(self,
textvariable=self.variable,
width=42).grid(row=0, column=1, padx=5)
tk.Button(self, text='Browse',
width=20, height=20,
image=self.icon,
command=self.browse).grid(row=0, column=2)
def browse(self):
"""Use `tkinter.askdirectory` to pick directory.
Initial directory is set to `self.home`. When user picks new one
`self.variable` is updated.
"""
self.variable.set(askdirectory(initialdir=self.home))
class Buttons(tk.Frame):
"""
Create buttons widget. It extends `tk.Frame`.
...
Methods
-------
get_path
method bound to get path from application entry
"""
def __init__(self, menu):
"""Place buttons widget elements.
Parameters
----------
menu : Gui
container where `Buttons` widget will be bound
"""
super().__init__(menu)
tk.Button(self, text='Submit', width=7,
command=self.create_notes).grid(row=0, column=0)
tk.Button(self, text='About', width=7,
command=self.open_homepage).grid(row=0, column=1)
self.get_path = menu.directory.variable.get
def create_notes(self, *_):
"""Make `html` notes.
If path from application entry is correct it creates `html` notes with
`pdoc3_mdnotes.mdnotes.main` function. In case of error appropriate
notification is displayed.
"""
try:
path = Path(self.get_path())
if not path.is_absolute():
raise AttributeError
mdnotes.main(path)
msg.showinfo('Success',
'Notes created in set directory. Exiting...')
sys.exit()
except mdnotes.ACCESS_ERRORS:
msg.showerror('Error',
('Wrong path. It must be a directory with write '
'permission. Use absolute path only, e.g. Windows: '
r'"C:\Desktop\Files", Linux: "/home/user/Files".'))
@staticmethod
def open_homepage():
"""Open project homepage in browser."""
webbrowser.open('https://ethru.github.io/pdoc3-mdnotes/', new=True)
def main():
"""Adjust GUI width according to used platform then create it."""
width = '400' if sys.platform == 'win32' else '460'
Gui('pdoc3-mdnotes', f'{width}x130').mainloop()
if __name__ == '__main__':
main()
Functions
def main()-
Adjust GUI width according to used platform then create it.
Expand source code Browse git
def main(): """Adjust GUI width according to used platform then create it.""" width = '400' if sys.platform == 'win32' else '460' Gui('pdoc3-mdnotes', f'{width}x130').mainloop()
Classes
class Buttons (menu)-
Create buttons widget. It extends
tk.Frame.…
Methods
get_path- method bound to get path from application entry
Place buttons widget elements.
Parameters
menu:Gui- container where
Buttonswidget will be bound
Expand source code Browse git
class Buttons(tk.Frame): """ Create buttons widget. It extends `tk.Frame`. ... Methods ------- get_path method bound to get path from application entry """ def __init__(self, menu): """Place buttons widget elements. Parameters ---------- menu : Gui container where `Buttons` widget will be bound """ super().__init__(menu) tk.Button(self, text='Submit', width=7, command=self.create_notes).grid(row=0, column=0) tk.Button(self, text='About', width=7, command=self.open_homepage).grid(row=0, column=1) self.get_path = menu.directory.variable.get def create_notes(self, *_): """Make `html` notes. If path from application entry is correct it creates `html` notes with `pdoc3_mdnotes.mdnotes.main` function. In case of error appropriate notification is displayed. """ try: path = Path(self.get_path()) if not path.is_absolute(): raise AttributeError mdnotes.main(path) msg.showinfo('Success', 'Notes created in set directory. Exiting...') sys.exit() except mdnotes.ACCESS_ERRORS: msg.showerror('Error', ('Wrong path. It must be a directory with write ' 'permission. Use absolute path only, e.g. Windows: ' r'"C:\Desktop\Files", Linux: "/home/user/Files".')) @staticmethod def open_homepage(): """Open project homepage in browser.""" webbrowser.open('https://ethru.github.io/pdoc3-mdnotes/', new=True)Ancestors
- tkinter.Frame
- tkinter.Widget
- tkinter.BaseWidget
- tkinter.Misc
- tkinter.Pack
- tkinter.Place
- tkinter.Grid
Static methods
def open_homepage()-
Open project homepage in browser.
Expand source code Browse git
@staticmethod def open_homepage(): """Open project homepage in browser.""" webbrowser.open('https://ethru.github.io/pdoc3-mdnotes/', new=True)
Methods
def create_notes(self, *_)-
Make
htmlnotes.If path from application entry is correct it creates
htmlnotes withmain()function. In case of error appropriate notification is displayed.Expand source code Browse git
def create_notes(self, *_): """Make `html` notes. If path from application entry is correct it creates `html` notes with `pdoc3_mdnotes.mdnotes.main` function. In case of error appropriate notification is displayed. """ try: path = Path(self.get_path()) if not path.is_absolute(): raise AttributeError mdnotes.main(path) msg.showinfo('Success', 'Notes created in set directory. Exiting...') sys.exit() except mdnotes.ACCESS_ERRORS: msg.showerror('Error', ('Wrong path. It must be a directory with write ' 'permission. Use absolute path only, e.g. Windows: ' r'"C:\Desktop\Files", Linux: "/home/user/Files".'))
class Directory (menu)-
Create directory widget. It extends
tk.Frame.…
Attributes
home:pathlib.Path- home directory path displayed in entry on application startup, set as initial directory for browse button
icon:tk.PhotoImage- object containing icon used with browse button
variable:tk.StringVar- stores value for path used in application, displayed in entry
Place directory widget elements.
Parameters
menu:Gui- container where
Directorywidget will be bound
Expand source code Browse git
class Directory(tk.Frame): """ Create directory widget. It extends `tk.Frame`. ... Attributes ---------- home : pathlib.Path home directory path displayed in entry on application startup, set as initial directory for browse button icon : tk.PhotoImage object containing icon used with browse button variable : tk.StringVar stores value for path used in application, displayed in entry """ def __init__(self, menu): """Place directory widget elements. Parameters ---------- menu : Gui container where `Directory` widget will be bound """ super().__init__(menu) self.home = Path.home() self.icon = tk.PhotoImage(file=menu.get_image('browse.png')) self.variable = tk.StringVar(self, value=self.home) tk.Label(self, text='Path: ', font='none 10').grid(row=0, column=0) tk.Entry(self, textvariable=self.variable, width=42).grid(row=0, column=1, padx=5) tk.Button(self, text='Browse', width=20, height=20, image=self.icon, command=self.browse).grid(row=0, column=2) def browse(self): """Use `tkinter.askdirectory` to pick directory. Initial directory is set to `self.home`. When user picks new one `self.variable` is updated. """ self.variable.set(askdirectory(initialdir=self.home))Ancestors
- tkinter.Frame
- tkinter.Widget
- tkinter.BaseWidget
- tkinter.Misc
- tkinter.Pack
- tkinter.Place
- tkinter.Grid
Methods
def browse(self)-
Use
tkinter.askdirectoryto pick directory.Initial directory is set to
self.home. When user picks new oneself.variableis updated.Expand source code Browse git
def browse(self): """Use `tkinter.askdirectory` to pick directory. Initial directory is set to `self.home`. When user picks new one `self.variable` is updated. """ self.variable.set(askdirectory(initialdir=self.home))
class Gui (title, size)-
Place individual widgets and allow their communication. It extends
tk.Tk.…
Attributes
directory:Directory- used for communication with
Directorywidget
Create applications GUI.
Parameters
title:str- name of application, displayed on top bar
size:str- application size in format 'heightxwidth'
Expand source code Browse git
class Gui(tk.Tk): """ Place individual widgets and allow their communication. It extends `tk.Tk`. ... Attributes ---------- directory : Directory used for communication with `Directory` widget """ def __init__(self, title, size): """Create applications GUI. Parameters ---------- title : str name of application, displayed on top bar size : str application size in format 'heightxwidth' """ super().__init__(className=title) self.title(title) self.geometry(size) self.resizable(False, False) self.iconphoto(False, tk.PhotoImage(file=self.get_image('mdnotes.png'))) self.directory = Directory(self) self.directory.grid(row=0, column=0, padx=20, pady=25) buttons = Buttons(self) buttons.grid(row=1, column=0, padx=10, pady=15, sticky='SE') self.bind('<Return>', buttons.create_notes) self.bind('<Escape>', sys.exit) @staticmethod def get_image(name): """Return image path. According to type of installation picks method to get image path. It can by obtained from module directory or from `_MEIPASS` when application is built. Parameters ---------- name : str image name with extension Returns ------- pathlib.Path image path """ directory = getattr(sys, '_MEIPASS', Path(__file__).parent.absolute()) return Path(directory) / 'icons' / nameAncestors
- tkinter.Tk
- tkinter.Misc
- tkinter.Wm
Static methods
def get_image(name)-
Return image path.
According to type of installation picks method to get image path. It can by obtained from module directory or from
_MEIPASSwhen application is built.Parameters
name:str- image name with extension
Returns
pathlib.Path- image path
Expand source code Browse git
@staticmethod def get_image(name): """Return image path. According to type of installation picks method to get image path. It can by obtained from module directory or from `_MEIPASS` when application is built. Parameters ---------- name : str image name with extension Returns ------- pathlib.Path image path """ directory = getattr(sys, '_MEIPASS', Path(__file__).parent.absolute()) return Path(directory) / 'icons' / name