• Skip to primary navigation
  • Skip to main content
  • Skip to primary sidebar
  • About
  • Projects

Self-Directed Reality

Actions are greater than Thoughts

  • Archive of My Thoughts
You are here: Home / Projects / Python Password Generator – Philadelphia Museum of Art

Python Password Generator – Philadelphia Museum of Art

July 9, 2022 by Paris

Overview

In the Automated* VPN Account Management post, I stated that I created a VPN Password Generator using Python. This section is a quick look at that project and code in detail.

I am a new programmer and I am only on Day 8 of Dr. Angela Yu’s 100 Days of Code – The Complete Python Pro Bootcamp for 2022 course as of the time of this writing.

Suffice it to say that I learned a lot so far and learned even more putting this password generator together, especially with all of the tools and packages used that the course didn’t cover yet.

Solution

Step One – Goal and Resources

The goal of this VPN password generator is to randomly select 3 words from a set of 61000+ English words, counts the letters in each word, and randomly adds a compatible sign to the final string to generate a human-readable password. 

In addition, I created a GUI using PySimpleGUI and created a windows-based executable using PyInstaller so the program can be packaged and run locally on Windows devices in the Museum for easy password creation.

Here is a video of the Windows program in action, showing off the Generate, Copy, and Quit buttons working along with the Always on Top modifier enabled.

41 second video of the VPN Password Generator and Features

Additional Features include:

  • The ability to generate a new password just by clicking ‘generate’
  • The ability to copy the password to the clipboard using pyperclip clipboard
  • Always on top so the window can be closed at anytime
  • A color scheme that matches the design of the Philadelphia Museum of Art’s website. I even used the closest font I could find to match the layout.

List all of the resources I used for this project:

  • Python 3
  • Visual Studio Code
  • pyperclip
  • english_words
  • PySimpleGUI
  • PyInstaller
  • virtual environments (venv)
  • pip install packages and modules

Step Two – My Project Code

Here is my Python code for this project:
And yes I comment. I mean why wouldn’t I? Have you SEEN the rest of the projects on this site? 😂

# VPN Password Generator - Version 1.0
# This VPN password generator randomly selects 3 words from a set of 61000+ words, counts the letters in each word, and randomly
# adds a compatible sign to the final string.  
# Created by Paris Hunter www.parisdhunter.com

import random

# Imports Pyperclip to use to push the generated password to the clipboard
import pyperclip as pc

# Imports english-words 1.1.0 by Matt Wiens with 61000+ English words.
import english_words 

# Imports PySimpleGUI by MikeTheWatchGuy to create the interactive window
import PySimpleGUI as sg 

# This is the list of English words with lower case letters and no punctation stored in a set
# converted to a list for the random module to work

word_list = list(english_words.english_words_lower_alpha_set)

# The following signs are password friendly on most systems
signs = ['!', '#', '$', '&', '*']

# Randomly select word number one from the list, capitalize it and count the number of letters within the word
word_one = random.choice(word_list).capitalize()
length_one = len(word_one)

# Randomly select word number two from the list, capitalize it and count the number of letters within the word
word_two = random.choice(word_list).capitalize()
length_two = len(word_two)

# Randomly select word number three from the list, capitalize it and count the number of letters within the word
word_three = random.choice(word_list).capitalize()
length_three = len(word_three)

# Randomly select a sign from the sign list
chosen_sign = random.choice(signs)

# Combines all of the above into one string to use as the VPN password.
vpn = (f"{word_one}" + f"{length_one}" + f"{word_two}" + f"{length_two}"
 + f"{word_three}" + f"{length_three}" + f"{chosen_sign}")

# This is new PMA Theme
sg.LOOK_AND_FEEL_TABLE['PMA'] = {'BACKGROUND': '#FFFFFF',
                                        'TEXT': '#222222',
                                        'INPUT': '#339966',
                                        'TEXT_INPUT': '#000000',
                                        'SCROLL': '#99CC99',
                                        'BUTTON': ('#FFFFFF', '#C93F2E'),
                                        'PROGRESS': ('#D1826B', '#CC8019'),
                                        'BORDER': 1, 'SLIDER_DEPTH': 0,                                         
'PROGRESS_DEPTH': 0, }                                        

# This changes the theme of the window to match the PMA design styles.
sg.theme('PMA')

# Define the window's contents
layout = [[sg.Text("Here is your randomly generated human-readable password:", font= ('Avenir', 14, 'bold'))],
          [sg.Text(vpn, font= ('Avenir', 12), key='-OUTPUT-')],
          [sg.Text(size=(40,1),font= ('Avenir'), key='-OUTPUT-')],
          [sg.Text("Note: Press COPY to copy the password to your clipboard", font= ('Avenir', 10), text_color= '#404040')],
          [sg.Button('Generate', font= ('Avenir')), sg.Button('Copy', font= ('Avenir')) , sg.Button('Quit', font= ('Avenir'))]]

# Create the window
window = sg.Window('VPN Password Generator v1.0 by Paris Hunter', layout, use_custom_titlebar= 'true',titlebar_background_color= '#404040', keep_on_top= 'True', element_padding= 5,)

# Display and interact with the Window using an Event Loop
while True:
    event, values = window.read()
    # See if user wants to quit or window was manually closed
    if event == sg.WINDOW_CLOSED or event == 'Quit':
        break
    elif event == 'Generate':
        word_one = random.choice(word_list).capitalize()
        length_one = len(word_one)
        word_two = random.choice(word_list).capitalize()
        length_two = len(word_two)
        word_three = random.choice(word_list).capitalize()
        length_three = len(word_three)
        chosen_sign = random.choice(signs)
        vpn = (f"{word_one}" + f"{length_one}" + f"{word_two}" + f"{length_two}"
 + f"{word_three}" + f"{length_three}" + f"{chosen_sign}")
    # Updates the VPN password every time the 'generate' button is pressed
        window['-OUTPUT-'].update(vpn)
    
    # Copies the VPN password to the clipboard every time the 'copy' button is pressed
    elif event == 'Copy':
        pc.copy(vpn)

# Finish up by removing from the screen
window.close()

Future Features

If I was going to work on this in the future, there are a few things I would change:

Icon on Titlebar – Change the icon on the Title bar from the Python logo to a custom logo. I did the work to create a custom logo but I couldn’t get the image to display. I could have used an ICO file type but I wanted cross-platform compatibility (for Mac OS) so I ended up attempting Base64 to make the logo work. It didn’t work out for me and PySimpleGUI this time.

Icon on Windows Taskbar – There is NO icon on the Windows Taskbar to show that the program is even open/running so I that’s one reason why I made it ‘Always on Top’ so I (or another user) can’t lose it.

Icon on the Exe – The icon on the EXE was placed by Pyinstaller and it is simply a snake on a floppy disk. I am sure I could change those options when building the distributable, but it literally was my first time using it. And in addition, I would change the metadata about the project (creation date, version, etc ) as well.

Primary Sidebar

What’s on Your Mind?

Recent Posts

  • Inertia – The Loudness Found in the Unnatural Quiet of COVID October 18, 2021
  • Lesson Learned – Reflecting on February 2019 April 28, 2021
  • How 2020 became Year Zero January 11, 2021

Copyright © 2023 · Twenty Seven Pro on Genesis Framework · WordPress · Log in