程序員的自我救贖,使用Python開發性格分析工具
如此不均衡的貧富差距,各行業的領導者如何能管理好公司,讓員工們既努力產出,又能安于現狀呢?每個領導者必學的一門課程就是職場心理學。只有你充分了解員工心理與對應的行為表現,才能從容的掌控各類型的人員,從而達到“物盡其用”。
那么職場心理學到底學習什么?
九型人格

九型人格是一個近年來倍受國際著名大學MBA學員推崇的課程之一,近十幾年來已風行歐美學術界及工商界。
全球500強企業的管理階層均有研習九型性格,并以此培訓員工,建立團隊,提高執行力。在當代,它對于企業的前期規劃、戰略確定、教練指導、企業培訓等方面,九型人格有很大的優勢。
九型人格不僅僅是一種精妙的性格分析工具,更主要的是為個人修養、自我提升和歷練提供更深入的洞察力。
俗話說:“龍生九子,子子不同”。通過九型人格的性格分析工具,將性格心理與行為劃分為九類。再對不同性格的人群進行研究分析,找到每一類人最適合崗位與職責。這就是領導者們運籌于帷幄之中,決勝于千里之外的籌碼。
人為刀俎,我為魚肉。不想受制于領導者們的掌控,首先要了解自身的人格分類,才能完善自己的不足。這該如何下手?作為程序員,讓我們用代碼完成自我的救贖吧!
代碼改變世界
剛剛過去的華為HR事件,給我印象最深的不是各階層的矛盾,而是那位HR說的一句話:
在每位開發的心中,都曾有著一個代碼改變世界的愿望!

那么今天,我們就用Python開發一套九型人格性格分析工具。用以讓更多的人,了解自己的性格分類!
既然是九型人格分析,首先我們需要拿到它的測試題。

測試題總共36道,通過各場景下的行為表現,最終分析出你最接近的人格分類。現在題有了,如何做出測試題呢?我選擇使用Python的tkinter模塊,將測試題開發為一個可執行的exe工具,說干就干!
基礎準備
為了能將代碼打包成單獨的可執行文件,我們需要先準備測試題與對應的答案,然后提前存儲在代碼中。我們需要進行相關拆分,這種苦力活就交給擁有雷鋒精神的我來完成吧:

界面開發
界面無需太過復雜,提供說明、題目、選項作答、題目切換與操作按鈕即可。當然,交卷后,需要顯示用戶的測試結果,那么開始吧!
30 minutes later…完成!
- # -*- coding: utf-8 -*-
- # @Author : 王翔
- # @微信號 : King_Uranus
- # @公眾號 : 清風Python
- # @GitHub : https://github.com/BreezePython
- # @Date : 2019/11/12 23:12
- # @Software : PyCharm
- # @version :Python 3.7.3
- # @File : Enneagram_GUI.py
- # coding:utf-8
- from tkinter import *
- import Enneagram_Exam
- import Enneagram_Result
- import tkinter.messagebox
- # 自測說明
- Standard = '此份問卷共有36道測試題目,請在每題中選擇你認為最恰當或者最接近描述自己的性格行為的句子,\n' \
- '請全部作答,最高分的項目很可能成為你的基本性格型態。'
- # 人格類型矩陣
- Style_Dict = [
- {3: 2, 6: 2, 10: 2, 15: 2, 19: 1, 22: 2, 28: 2, 32: 2},
- {1: 1, 6: 1, 12: 1, 17: 2, 20: 1, 23: 1, 29: 1, 33: 1},
- {4: 1, 7: 1, 10: 1, 14: 2, 23: 2, 26: 2, 30: 1, 34: 1},
- {2: 1, 8: 2, 12: 2, 16: 1, 21: 2, 24: 1, 28: 1, 34: 2},
- {1: 2, 4: 2, 13: 1, 16: 2, 19: 2, 25: 1, 31: 1, 36: 1},
- {5: 1, 9: 2, 14: 1, 18: 1, 21: 1, 25: 2, 29: 2, 32: 1},
- {2: 2, 7: 2, 11: 2, 18: 2, 22: 1, 27: 2, 33: 2, 36: 2},
- {3: 1, 9: 1, 13: 2, 17: 1, 24: 2, 27: 1, 20: 2, 35: 2}
- ]
- class ExamPage:
- def __init__(self, master=None):
- self.root = master
- # 用戶結果集
- self.user_result = {}
- self.status = 1
- self.All_Exam = Enneagram_Exam
- self.normal_choice = IntVar()
- self.start_exam()
- # 上一題方法
- def before(self):
- if self.normal_choice.get() != 0:
- self.user_result[self.status] = self.normal_choice.get()
- if self.status > 1:
- self.status -= 1
- self.body.grid_forget()
- self.main_exam()
- else:
- tkinter.messagebox.showwarning("提示:", message="請先選擇答案!")
- # 下一題方法
- def after(self):
- if self.normal_choice.get() != 0:
- self.user_result[self.status] = self.normal_choice.get()
- if self.status < len(Enneagram_Exam.Exam):
- self.status += 1
- self.body.grid_forget()
- self.main_exam()
- else:
- tkinter.messagebox.showwarning("提示:", message="請先選擇答案!")
- # 獲取當前題目
- def exam_files(self, num):
- return list(map(lambda x: x.split('.'), self.All_Exam.Exam[num - 1].strip().split('\n')))
- # 交卷
- def hand_paper(self):
- self.user_result[self.status] = self.normal_choice.get()
- if len(self.user_result) != 36:
- tkinter.messagebox.showwarning("提示:", message="您還有未完成的測試題!")
- else:
- self.exam_result = LabelFrame(self.root, text="測試結果", padx=10, pady=10, fg="red", font=("黑體", '11'))
- self.exam_result.grid(padx=10, pady=5, sticky=NSEW)
- sc = Scrollbar(self.exam_result)
- sc.grid(row=0, column=1, sticky=NS)
- result_info = Text(self.exam_result, font=("黑體", '11'), width=85, yscrollcommand=sc.set)
- result_info.grid(row=0, column=0, sticky=NSEW)
- sc.config(command=result_info.yview)
- all_num = []
- for style in Style_Dict:
- calc_num = list(
- point for point in self.user_result if point in style and self.user_result[point] == style[point])
- if calc_num == None:
- all_num.append(0)
- else:
- all_num.append(len(calc_num))
- user_type = all_num.index(max(all_num))
- for line in Enneagram_Result.Result[user_type]:
- result_info.insert(END, line)
- # 啟動測試所需控制按鈕
- def start_exam(self):
- self.title = LabelFrame(self.root, text="自測說明", padx=10, pady=10, fg="red", font=("黑體", '11'))
- self.title.grid(padx=10, pady=5)
- note = Label(self.title, text=Standard, justify=LEFT, font=("黑體", '11'))
- note.grid()
- self.show = LabelFrame(self.root, text="選項", padx=10, pady=10, fg="red", font=("黑體", '11'))
- self.show.grid(padx=10, pady=5, sticky=EW)
- go_back = Button(self.show, text="上一題", width=8, command=lambda: self.before())
- go_back.grid(row=4, column=0, padx=5, pady=10)
- to_forword = Button(self.show, text="下一題", width=8, command=lambda: self.after())
- to_forword.grid(row=4, column=1, padx=5, pady=10, sticky=E)
- hand_in = Button(self.show, text="交卷", width=8, command=lambda: self.hand_paper())
- hand_in.grid(row=4, column=2, padx=5, pady=10, sticky=E)
- exit_sys = Button(self.show, text="退出", width=8, command=lambda: sys.exit())
- exit_sys.grid(row=4, column=3, padx=5, pady=10, sticky=E)
- self.main_exam()
- # 測試題主界面
- def main_exam(self):
- self.normal_choice.set(0)
- self.body = LabelFrame(self.root,
- text="測試題 第%s題,剩余%s題" % (self.status, (len(Enneagram_Exam.Exam) - self.status)),
- padx=10, pady=10, fg="red", font=("黑體", '11'))
- self.body.grid(padx=10, pady=5, sticky=EW)
- for option, choice in self.exam_files(self.status):
- authority_choice = Radiobutton(self.body, text=choice, variable=self.normal_choice, value=option)
- authority_choice.grid(row=option, sticky=W)
- Label(self.body, text=" 第%s道題,用戶選擇的結果是:" % self.status, fg="red", font=("黑體", '11')).grid(row=3, column=0,
- sticky=W)
- Label(self.body, textvariable=self.normal_choice).grid(row=3, column=0, sticky=E)
剩余的練習題與答案代碼,就不在這里贅述了。
對于一位程序員的審美,大家要求別太高,重點來關注下功能實現吧!當然在此之前我們需要先將代碼打包為exe工具,大小8MB。

功能OK了,現在不要打擾我,我要做題了!

我的答案是完美型,處女座總是在追求完美的路上跟自己死磕,哎…活得好累。