Changing the default printer in Windows

Where I work there's two different printers being used on a daily basis, one of them prints things from a particular program, which only uses the default printer. A lot of the times, during busy periods, people forget to switch the default printer, resulting in that program using the wrong printer, which isn't suitable for what's being printed.

The work PC is ancient and getting into the printers menu can take up to a few minutes. I am hoping my program will reduce spending so much time on the computer just to change the default printer.

This is the first time I've done up an interface in Tkinter, so I'd appreciate feedback if it can be done better.

import tkinter as tk
import tkinter.ttk as ttk

import win32print

def get_available_printers():
return [printer[2] for printer in win32print.EnumPrinters(2)]

class PrinterManager(tk.Frame):

def __init__(self, master, *args, **kwargs):
tk.Frame.__init__(self, master, *args, **kwargs)
self.master = master
self.configure_interface()
self.create_widgets()

def configure_interface(self):
self.master.title('Printer Manager')
self.master.geometry('350x100')
self.master.resizable(False, False)
self.master.config(background='#626a77')

def create_widgets(self):
self.default_printer_label = tk.Label(self.master, bg='#626a77', fg='white')
self.default_printer_label.place(x=10, y=12)
self.update_default_printer_label()

refresh_button = tk.Button(self.master, text='Refresh', command=self.update_default_printer_label)
refresh_button.place(x=285, y=10)

selected_printer = tk.StringVar()

set_default_printer_button = tk.Button(self.master, text='Set', command=lambda: self.set_default_printer(selected_printer))
set_default_printer_button.place(x=285, y=60, width=50)

def update_default_printer_label(self):
default_printer = win32print.GetDefaultPrinter()
default_printer_text = 'Default printer: {}'.format(default_printer)
self.default_printer_label.config(text=default_printer_text)

def set_default_printer(self, printer_name):
win32print.SetDefaultPrinter(printer_name.get())
self.update_default_printer_label()

if __name__ == '__main__':
root = tk.Tk()
PrinterManager(root)
root.mainloop()


That is great as a first tkinter application. I like the fact you wrote two specific functions update_default_printer_label() and set_default_printer(). Most programmers will just do all what you did in one function and they believe as long as it does not exceed 25 lines length they are near perfection. With your approach, you have fine grain control on your program as unit testing is simplified (because you have small functions doing one clear task).
I do not have much to say about your program. There are very few imperfections but some may argue it is Ok. Nevertheless, I do not see the reason you let the function get_available_printers() orphan (I mean it can be integrated into the class PrinterManager, it is its right place and you will add only self. to call it where you did)
• Thanks! Yeah, I realized that get_available_printers is an oddball and since I have moved it inside the class. I actually already have created an .exe with pyinstaller, being able to build it into one file was great. – Lukasz May 12 '18 at 12:23