用python做一個(gè)性格分析工具【GUI編程實(shí)例】
九型人格

九型人格是一個(gè)近年來倍受國(guó)際著名大學(xué)MBA學(xué)員推崇的課程之一,近十幾年來已風(fēng)行歐美學(xué)術(shù)界及工商界。
全球500強(qiáng)企業(yè)的管理階層均有研習(xí)九型性格,并以此培訓(xùn)員工,建立團(tuán)隊(duì),提高執(zhí)行力。在當(dāng)代,它對(duì)于企業(yè)的前期規(guī)劃、戰(zhàn)略確定、教練指導(dǎo)、企業(yè)培訓(xùn)等方面,九型人格有很大的優(yōu)勢(shì)。
九型人格不僅僅是一種精妙的性格分析工具,更主要的是為個(gè)人修養(yǎng)、自我提升和歷練提供更深入的洞察力。
大家好,歡迎來到 Crossin的編程教室 !
很多大公司在招聘和組建團(tuán)隊(duì)時(shí)很看重“性格分析”,而“九型人格”就是一個(gè)被用得很多的性格分析工具,其將性格心理與行為劃分為九類,并對(duì)應(yīng)每一類人最適合崗位與職責(zé)。咱們先不討論這個(gè)工具是否真的有效和合理。既然企業(yè)和領(lǐng)導(dǎo)們會(huì)用它,甚至關(guān)系到聘用和升職與否,那我們自然也得了解一下,知己知彼方能百戰(zhàn)不殆嘛。
今天,我們就用Python開發(fā)一套帶界面的九型人格性格分析工具。提升編程技術(shù)的同時(shí),也可以順便了解下自己的性格分類!
既然是九型人格分析,首先我們需要拿到它的測(cè)試題。翻了很久,在百度文庫上找到一份測(cè)試原題:
https://wenku.baidu.com/view/19455024dd36a32d72758105.html

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

界面開發(fā)
界面無需太過復(fù)雜,提供說明、題目、選項(xiàng)作答、題目切換與操作按鈕即可。當(dāng)然,交卷后,需要顯示用戶的測(cè)試結(jié)果,那么開始吧!
tkinter是python自帶的GUI模塊,無需另行安裝。對(duì)于像這種簡(jiǎn)單交互界面的小程序非常適合。并且,因?yàn)椴挥妙~外的庫,在后面打包exe的時(shí)候會(huì)少踩一些坑。
30 minutes later……
完成!
Main.py
1from?Enneagram_GUI?import?*
2from?tkinter?import?*
3
4
5def?center_window(root,?width,?height):
6????screenwidth?=?root.winfo_screenwidth()
7????screenheight?=?root.winfo_screenheight()
8????size?=?'%dx%d+%d+%d'?%?(width,?height,?(screenwidth?-?width)?/?2,?(screenheight?-?height)?/?2)
9????root.geometry(size)
10
11
12root?=?Tk()
13
14center_window(root,?750,?700)
15
16root.resizable(width=False,?height=False)
17root.title('九型人格測(cè)試?|?公眾號(hào):?清風(fēng)Python')
18ExamPage(root)
19root.mainloop()
Enneagram_GUI.py
1#?-*-?coding:?utf-8?-*-
2#?@Author???:?王翔
3#?@微信號(hào)???:?King_Uranus
4#?@公眾號(hào)????:?清風(fēng)Python
5#?@GitHub???:?https://github.com/BreezePython
6#?@Date?????:?2019/11/12?23:12
7#?@Software?:?PyCharm
8#?@version ?:Python 3.7.3
9#?@File?????:?Enneagram_GUI.py
10
11
12#?coding:utf-8
13from?tkinter?import?*
14import?Enneagram_Exam
15import?Enneagram_Result
16import?tkinter.messagebox
17
18#?自測(cè)說明
19Standard?=?'此份問卷共有36道測(cè)試題目,請(qǐng)?jiān)诿款}中選擇你認(rèn)為最恰當(dāng)或者最接近描述自己的性格行為的句子,\n'?\
20???????????'請(qǐng)全部作答,最高分的項(xiàng)目很可能成為你的基本性格型態(tài)。'
21
22#?人格類型矩陣
23Style_Dict?=?[
24????{3:?2,?6:?2,?10:?2,?15:?2,?19:?1,?22:?2,?28:?2,?32:?2},
25????{1:?1,?6:?1,?12:?1,?17:?2,?20:?1,?23:?1,?29:?1,?33:?1},
26????{4:?1,?7:?1,?10:?1,?14:?2,?23:?2,?26:?2,?30:?1,?34:?1},
27????{2:?1,?8:?2,?12:?2,?16:?1,?21:?2,?24:?1,?28:?1,?34:?2},
28????{1:?2,?4:?2,?13:?1,?16:?2,?19:?2,?25:?1,?31:?1,?36:?1},
29????{5:?1,?9:?2,?14:?1,?18:?1,?21:?1,?25:?2,?29:?2,?32:?1},
30????{2:?2,?7:?2,?11:?2,?18:?2,?22:?1,?27:?2,?33:?2,?36:?2},
31????{3:?1,?9:?1,?13:?2,?17:?1,?24:?2,?27:?1,?20:?2,?35:?2}
32]
33
34
35class?ExamPage:
36????def?__init__(self,?master=None):
37????????self.root?=?master
38????????#?用戶結(jié)果集
39????????self.user_result?=?{}
40????????self.status?=?1
41????????self.All_Exam?=?Enneagram_Exam
42????????self.normal_choice?=?IntVar()
43????????self.start_exam()
44
45????#?上一題方法
46????def?before(self):
47????????if?self.normal_choice.get()?!=?0:
48????????????self.user_result[self.status]?=?self.normal_choice.get()
49????????????if?self.status?>?1:
50????????????????self.status?-=?1
51????????????????self.body.grid_forget()
52????????????????self.main_exam()
53????????else:
54????????????tkinter.messagebox.showwarning("提示:",?message="請(qǐng)先選擇答案!")
55
56????#?下一題方法
57????def?after(self):
58????????if?self.normal_choice.get()?!=?0:
59????????????self.user_result[self.status]?=?self.normal_choice.get()
60????????????if?self.status? 61????????????????self.status?+=?1
62????????????????self.body.grid_forget()
63????????????????self.main_exam()
64????????else:
65????????????tkinter.messagebox.showwarning("提示:",?message="請(qǐng)先選擇答案!")
66
67????#?獲取當(dāng)前題目
68????def?exam_files(self,?num):
69????????return?list(map(lambda?x:?x.split('.'),?self.All_Exam.Exam[num?-?1].strip().split('\n')))
70
71????#?交卷
72????def?hand_paper(self):
73????????self.user_result[self.status]?=?self.normal_choice.get()
74????????if?len(self.user_result)?!=?36:
75????????????tkinter.messagebox.showwarning("提示:",?message="您還有未完成的測(cè)試題!")
76????????else:
77????????????self.exam_result?=?LabelFrame(self.root,?text="測(cè)試結(jié)果",?padx=10,?pady=10,?fg="red",?font=("黑體",?'11'))
78????????????self.exam_result.grid(padx=10,?pady=5,?sticky=NSEW)
79????????????sc?=?Scrollbar(self.exam_result)
80????????????sc.grid(row=0,?column=1,?sticky=NS)
81????????????result_info?=?Text(self.exam_result,?font=("黑體",?'11'),?width=85,?yscrollcommand=sc.set)
82????????????result_info.grid(row=0,?column=0,?sticky=NSEW)
83????????????sc.config(command=result_info.yview)
84????????????all_num?=?[]
85????????????for?style?in?Style_Dict:
86????????????????calc_num?=?list(
87????????????????????point?for?point?in?self.user_result?if?point?in?style?and?self.user_result[point]?==?style[point])
88????????????????if?calc_num?==?None:
89????????????????????all_num.append(0)
90????????????????else:
91????????????????????all_num.append(len(calc_num))
92????????????user_type?=?all_num.index(max(all_num))
93????????????for?line?in?Enneagram_Result.Result[user_type]:
94????????????????result_info.insert(END,?line)
95
96????#?啟動(dòng)測(cè)試所需控制按鈕
97????def?start_exam(self):
98????????self.title?=?LabelFrame(self.root,?text="自測(cè)說明",?padx=10,?pady=10,?fg="red",?font=("黑體",?'11'))
99????????self.title.grid(padx=10,?pady=5)
100????????note?=?Label(self.title,?text=Standard,?justify=LEFT,?font=("黑體",?'11'))
101????????note.grid()
102????????self.show?=?LabelFrame(self.root,?text="選項(xiàng)",?padx=10,?pady=10,?fg="red",?font=("黑體",?'11'))
103????????self.show.grid(padx=10,?pady=5,?sticky=EW)
104????????go_back?=?Button(self.show,?text="上一題",?width=8,?command=lambda:?self.before())
105????????go_back.grid(row=4,?column=0,?padx=5,?pady=10)
106????????to_forword?=?Button(self.show,?text="下一題",?width=8,?command=lambda:?self.after())
107????????to_forword.grid(row=4,?column=1,?padx=5,?pady=10,?sticky=E)
108????????hand_in?=?Button(self.show,?text="交卷",?width=8,?command=lambda:?self.hand_paper())
109????????hand_in.grid(row=4,?column=2,?padx=5,?pady=10,?sticky=E)
110????????exit_sys?=?Button(self.show,?text="退出",?width=8,?command=lambda:?sys.exit())
111????????exit_sys.grid(row=4,?column=3,?padx=5,?pady=10,?sticky=E)
112????????self.main_exam()
113
114????#?測(cè)試題主界面
115????def?main_exam(self):
116????????self.normal_choice.set(0)
117????????self.body?=?LabelFrame(self.root,
118???????????????????????????????text="測(cè)試題??第%s題,剩余%s題"?%?(self.status,?(len(Enneagram_Exam.Exam)?-?self.status)),
119???????????????????????????????padx=10,?pady=10,?fg="red",?font=("黑體",?'11'))
120????????self.body.grid(padx=10,?pady=5,?sticky=EW)
121????????for?option,?choice?in?self.exam_files(self.status):
122????????????authority_choice?=?Radiobutton(self.body,?text=choice,?variable=self.normal_choice,?value=option)
123????????????authority_choice.grid(row=option,?sticky=W)
124????????Label(self.body,?text="??第%s道題,用戶選擇的結(jié)果是:"?%?self.status,?fg="red",?font=("黑體",?'11')).grid(row=3,?column=0,
125???????????????????????????????????????????????????????????????????????????????????????????????????sticky=W)
126????????Label(self.body,?textvariable=self.normal_choice).grid(row=3,?column=0,?sticky=E)
剩余的練習(xí)題與答案部分,可見完整代碼中。
代碼完成之后,為了方便給其他人使用,我們需要先將代碼打包為exe。

功能OK了,現(xiàn)在不要打擾我,我要做題了!

運(yùn)行效果:

我的答案是完美型,處女座總是在追求完美的路上跟自己死磕
程序的代碼及打包好的exe在這里:
https://pan.baidu.com/s/1tfYDbHgUce0RUJIEkFZcGQ?
提取碼:umhr
記得自測(cè)完后,告訴我你的所屬的類型哦!
_往期文章推薦_
