Escalation approval tool, copy to clipboard via Python I created a simple little script for the people I work with, what it does is copy information to the users clipboard for escalation approvals. It's pretty simple and not very exciting but I want to know if there are ways to do this better:

from Tkinter import Tk
import getpass
import os
import time


class ClipBoard(object):

    full_string = ''  # Full string that will contain the entire escalation approval

    def __init__(self, string, addition):
        self.string = string
        self.addition = addition

    def add_addition_to_string(self):  # Add the string together
        return self.string + self.addition

    def copy_string_to_clipboard(self):  # Copy to the windows clipboard
        cb = Tk()
        cb.withdraw()
        cb.clipboard_clear()
        cb.clipboard_append(self.full_string)

    def create_full_string(self):  # Create the string and return it
        self.full_string = self.add_addition_to_string()
        return self.full_string


class ConfigureProgram(object):

    def __init__(self, directory, escalator):
        self.directory = directory
        self.escalator = escalator

    def check_directory(self):  # Check if the directory exists
        if os.path.exists(self.directory) is False:
            os.makedirs(self.directory)  # If it doesn't create it
        else:
            return True

    def check_esc_name(self):  # Check if there's already a file made
        if self.check_directory() is True:
            with open(self.escalator, 'a+') as esc:  # If not create it
                esc.write(raw_input('Enter what you want appear on escalations(be specific): '))


def get_user():  # Get the username that's running at the moment
    return getpass.getuser()


def create_addition_for_string():  # Where's it going to?
    return raw_input('Escalate to where? ')


def check_if_run_yet(path_to_file):  # Check if you need to configure the program
    return os.path.exists(path_to_file)


def read_username():  # Read the escalators name from the file created
    with open("C:\Users\{}\AppData\Roaming\esc\esc_name.txt".format(get_user())) as f:
        return f.readline()


if __name__ == '__main__':
    path = "C:\Users\{}\AppData\Roaming\esc\esc_name.txt".format(get_user())

    if check_if_run_yet(path) is not False:
        opening = "Ticket has been reviewed and approved by {}. Ticket assigned to ".format(read_username())
        cliptext = ClipBoard(opening, create_addition_for_string())
        cliptext.create_full_string()
        cliptext.copy_string_to_clipboard()
        print 'Press CNTRL-V to paste the approval.'
        time.sleep(1)
    else:
        config = ConfigureProgram(
            "C:\Users\{}\AppData\Roaming\esc".format(get_user()), path
        )
        config.check_directory()
        config.check_esc_name()
        print "Program configured, please run again."
        time.sleep(2)
The main part of your program is only

def copy_string_to_clipboard(self):  # Copy to the windows clipboard
    cb = Tk()
    cb.withdraw()
    cb.clipboard_clear()
    cb.clipboard_append(self.full_string)


the rest being used only as a formatting tool. You should thus focus into making such formatting as clear as possible.

But first of, you may want to read about docstrings as your comment should be one:

def copy_string_to_clipboard(self):
    """Copy to the windows clipboard"""

    cb = Tk()
    cb.withdraw()
    cb.clipboard_clear()
    cb.clipboard_append(self.full_string)


So now, onto cleaning a bit everything around this function.

First off, you don't need a class with 3 other functions just to concatenate two strings. Based on your opening variable, what you need to do is simply:

user = read_username()
assignation = raw_input('Escalate to where? ')
copy_to_clipboard(
        'Ticket has been reviewed and approved by {}. '
        'Ticket assigned to {}.'.format(user, assignation))


where copy_to_clipboard has been slightly modified to accept the whole string as argument:

def copy_to_clipboard(text):
    """Copy the content of a string to the windows clipboard"""

    cb = Tk()
    cb.withdraw()
    cb.clipboard_clear()
    cb.clipboard_append(text)


The last thing to do is to simplify a bit the reading of the user config file. It's a bit of a shame to be required to run the program twice in order to create a file if it doesn't exist. Instead, you could try to read the file and, if it fails, ask the user for its content:

def read_username(filename='esc_name.txt'):
    """Get the user's name from config file or command line"""

    try:
        with open(filename) as f:
            return f.readline()
    except OSError:
        pass

    # If we are here, we couldn't read the configuration
    # file so ask the user an try to save its choice
    username = raw_input('Enter what you want appear on escalations (be specific): ')

    try:
        with open(filename, 'w') as f:
            f.write(username)
    except OSError:
        pass

    return username


But this function assumes we are in the right directory, which may not exist yet. Let's tackle that as well:

from getpass import getuser


def setup(program_dir='esc'):
    """Create our own directory structure and move to the right place"""

    appdata = r'C:\Users\{}\AppData\Roaming'.format(getuser())
    os.chdir(appdata)
    if not os.path.exists(program_dir):
        os.mkdir(program_dir)
    os.chdir(program_dir)


as you can see, I used getuser from getpass directly without having to create a wrapper that just remove 1 level of nesting.

Also, if I recall correctly, os.environ['APPDATA'] should contain the value we are building into appdata. So you could simplify it to:

def setup(program_dir='esc'):
    """Create our own directory structure and move to the right place"""

    os.chdir(os.environ['APPDATA'])
    if not os.path.exists(program_dir):
        os.mkdir(program_dir)
    os.chdir(program_dir)




Putting it all together, you can end up with:

import os
from Tkinter import Tk


def copy_to_clipboard(text):
    """Copy the content of a string to the windows clipboard"""

    cb = Tk()
    cb.withdraw()
    cb.clipboard_clear()
    cb.clipboard_append(text)


def setup(program_dir='esc'):
    """Create our own directory structure and move to the right place"""

    os.chdir(os.environ['APPDATA'])
    if not os.path.exists(program_dir):
        os.mkdir(program_dir)
    os.chdir(program_dir)


def read_username(filename='esc_name.txt'):
    """Get the user's name from config file or command line"""

    try:
        with open(filename) as f:
            return f.readline()
    except OSError:
        pass

    # If we are here, we couldn't read the configuration
    # file so ask the user an try to save its choice
    username = raw_input('Enter what you want appear on escalations (be specific): ')

    try:
        with open(filename, 'w') as f:
            f.write(username)
    except OSError:
        pass

    return username


if __name__ == '__main__':
    setup()
    user = read_username()
    assignation = raw_input('Escalate to where? ')
    copy_to_clipboard(
            'Ticket has been reviewed and approved by {}. '
            'Ticket assigned to {}.'.format(user, assignation))
    print 'Press CTRL-V to paste the approval.'