Search code examples
pythonpython-3.xpyqt4

Method of collecting employee information is not comprehesive enough


I am building a GUI to mimic an Employee program I have written in order to learn PyQt4. Currently, I have the GUI set up to ask for a programing language. Here the user can choose from a list of languages. Which is the method I like the functionality of:

def new_developer(self):
    name, ok = QtGui.QInputDialog.getText(self, "Add Developer", "Enter developers name:")
    salary, ok = QtGui.QInputDialog.getInt(self, "Add Developer", "Enter developers salary:")
    items = ("C", "C++", "Java", "Python")
    programing_language, ok = QtGui.QInputDialog.getItem(self, "Add Developer",
                                                         "list of languages", items, 0, False)
    ID = new_ID()
    emp1 = Developer(ID, salary, name, programing_language)

The other method I was using before was to simply have the user enter in a string representing the employees programing language.

My problem is that the current method doesn't allow the user to select multiple programing languages. I was hoping someone could help me out with a method of altering my code so that the user can select multiple programing languages. Here is the entirety of the program for reference if needed:

import sys
import random
from PyQt4 import QtGui

employee_dict = {}
all_randomly_generated_intigers = {}
x = 0

class Employee:
  def __init__(self, id, salary, name):
    self.id = id
    self.salary = salary
    self.name = name
    employee_dictonary(self)

  def info(self):

    if isinstance(self, Developer):
      return "Employee ID:{} \nSalary:{} \nDevelopers name:{}"\
             " \nKnown programing languages:{}".format(self.id,
                                                       self.salary,
                                                       self.name,
                                                       self.programming_language)
    else:
      return "Employee ID:{} \nEmployees salary:{} "\
             "\nEmployees name:".format(self.id, self.salary, self.name)

class Developer(Employee):
  def __init__(self, id, salary, name, programming_language):
    super().__init__(id, salary, name)
    self.programming_language = programming_language

def employee_dictonary(self):
  employee_dict[self.id] = self

def new_ID():
  y = random.randint(0, 5)
  global x
  while x in all_randomly_generated_intigers:
    x += 1
  all_randomly_generated_intigers[x] = y
  return x

class Window(QtGui.QMainWindow, Employee):

  def __init__(self):
    super(Window, self).__init__()  #Returns the parent object or the QMainWindow object
    self.setGeometry(50, 50, 500, 300)
    self.setWindowTitle("Employee builder")

    create_Employee = QtGui.QAction("&Add Employee", self)
    create_Employee.triggered.connect(self.new_employee)

    create_Developer = QtGui.QAction("&Add Developer", self)
    create_Developer.triggered.connect(self.new_developer)

    find_employee_information = QtGui.QAction("&Find Employee Information", self)
    find_employee_information.triggered.connect(self.display_employee)

    mainMenu = self.menuBar()
    fileMenu = mainMenu.addMenu('&File')
    fileInformationMenu = mainMenu.addMenu('&Employee Information')
    fileMenu.addAction(create_Employee)
    fileMenu.addAction(create_Developer)
    fileInformationMenu.addAction(find_employee_information)

    self.home()

  def home(self):
    self.show()

  def new_developer(self):
    name, ok = QtGui.QInputDialog.getText(self, "Add Developer", "Enter developers name:")
    salary, ok = QtGui.QInputDialog.getInt(self, "Add Developer", "Enter developers salary:")
    items = ("C", "C++", "Java", "Python")
    programing_language, ok = QtGui.QInputDialog.getItem(self, "Add Developer",
                                                         "list of languages", items, 0, False)
    ID = new_ID()
    emp1 = Developer(ID, salary, name, programing_language)

  def new_employee(self):
    name, ok = QtGui.QInputDialog.getText(self, "Add Employee", "Enter employees name:")
    salary, ok = QtGui.QInputDialog.getInt(self, "Add Employee", "Enter employees salary:")
    ID = new_ID()
    emp1 = Employee(ID, salary, name)

  def display_employee(self):
    ID, ok = QtGui.QInputDialog.getInt(self, "Employee Information", "Enter employees ID number:")
    employee = employee_dict[ID]
    QtGui.QMessageBox.information(self, "New Employee", employee.info())

def run():
  app = QtGui.QApplication(sys.argv)
  GUI = Window()
  sys.exit(app.exec_())

run()

Solution

  • If you want to keep calling the same dialog until the user cancels, keeping a list of all choices, you just do that with a loop. So, instead of this:

    programing_language, ok = QtGui.QInputDialog.getItem(self, "Add Developer",
                                                         "list of languages", items, 0, False)
    

    … do this:

    progamming_languages = []
    while True:
        programing_language, ok = QtGui.QInputDialog.getItem(self, "Add Developer",
                                                             "list of languages", items, 0, False)
        if not ok:
            break
        programming_languages.append(progamming_language)
    

    While we're at it, you really should be checking ok instead of ignoring it in all of the other cases. After all, it the user clicks Cancel instead of typing a name when you ask for the name, do you really want to keep asking questions and end up creating a new employee with an empty name?


    Also, your code would be a lot more readable if you didn't start your hanging indents already way out near the edge of the screen. For example, instead of this:

    programing_language, ok = QtGui.QInputDialog.getItem(self, "Add Developer",
                                                         "list of languages", items, 0, False)
    

    … do this:

    programing_language, ok = QtGui.QInputDialog.getItem(
        self, "Add Developer", "list of languages", items, 0, False)
    

    … or maybe even this:

    programing_language, ok = QtGui.QInputDialog.getItem(
        self, "Add Developer", "list of languages", items, 0, False
    )
    

    Or, even better, get an auto-formatter like black or yapf and set it up to auto-format your code whenever you save so you don't have to think about stuff like this.