給小美的感恩節表白
程式員最近想戀愛了,腦子裡面想的除了程式碼,填充了些別的畫面(當然,別那麼猥瑣,程式設計師還是很純情的);

夏目友人帳
剛好最近在學習python,上網找了幾個GUI庫進行了對比,花了一上午工夫寫了個小軟體,班門弄斧了有點,一來討女神歡心,二來作學習用,將 程式碼照進現實 ;
程式一共100行不到,邏輯也蠻簡單,我們的環境是使用Sublime text 3,在windows上執行,這裡因為我們用的sublime text,在哪個平臺上都無所謂,而且最後編譯我們會採用一個命令列工具(python的),所以很好完成;
話不多說我們直接開始;
環境配置
首先下載Sumblime text 3,安裝Python 3,這些步驟就不做詳細解釋了,接著我們需要ST的兩個工具,開啟ST,按 ctrl+shift+p
,出現輸入框輸入 pci
,回車稍等一會出現pci工具,

PCI
我們在裡面搜尋 SublimeCodeIntel
和 SumblimeREPL
這兩個外掛,其中,前者是實現程式碼智慧提示和自動完成功能,後者是python的編譯工具,這裡我們主要用的是後者。
安裝完之後我們就可以通過 ctrl+B
(mac上是 command+b
)直接執行python程式了;
需要的庫
首先你的python需要有pip工具,多的內容不細說,另外在windows上還需要做兩件事情,一是安裝git bash,因為win的終端好多命令是在git裡的,二是將python路徑新增到環境變數中,否則終端也是用不了python工具的;
解決完上面兩件事情,我們安裝一下 tkinter
包,理論上這個庫是系統GUI庫,但是為了保證程式執行,你可以在終端安裝一下,安裝很容易,直接 pip install tkinter
;
另外還需要一個打包工具,直接將python指令碼打包成exe可執行檔案,發給你的女神(要知道小白是隻會雙擊,並不懂你的什麼python指令碼,不要強行給你的女神解釋什麼叫指令碼,小心涼涼);
開始寫程式碼了
from tkinter import * class Application(Frame): ···
我們需要寫一個類,繼承自 tkinter
庫裡的 Frame
,該庫可以定義一個視窗容器,供程式新增控制元件;
接下來講解將會寫到註釋裡;
# 初始化函式,我們主要的內容在方法createWidgets裡 def __init__(self, master=None): Frame.__init__(self, master) self.pack() self.createWidgets()
def createWidgets(self): # 下面這兩個字元變數用來顯示程式中變化的字元 # 依附在Label上 self.stringVar = StringVar() self.stringVar.set("說你愛我") self.buttonVar = StringVar() self.buttonVar.set("點我") # 這是一個按鈕,上面的buttonVar字元變數依附在它上面 # 所以說按鈕的字元也是可以變的 # 另外button還有一個command屬性,是一個函式名 # 它定義了點選button將要發生的事件 self.quitButton = Button(self, textvariable=self.buttonVar, command=self.hit_me, width=30, height=3) self.quitButton.pack() # 接下來就是一個背景圖片 # 背景圖片上有一個label用來顯示字元(把你想說的情話寫在上面吧) image_path = "xiaomei.png" if os.path.exists(image_path): self.background = PhotoImage(file=image_path) self.backLabel = Label(self, textvariable=self.stringVar, justify=CENTER, image=self.background, compound=CENTER, fg='red', font=("華文行楷", 30)) self.backLabel.pack() else: self.backLabel = Label(self, textvariable=self.stringVar, justify=CENTER, compound=CENTER, fg='red', font=("華文行楷", 30)) self.backLabel.pack() # 為了保證程式的健壯性,我們在用圖片做背景時要確保圖片路徑的存在性 # 萬一找不到我們不能讓程式閃退不是麼? # 另外一點預設的控制元件排列方式是從上到下依次進行的 # 具體想進行排版還要再進行研究
on_hit = False hit_count = 0 # 我們使用了一個計數器,對每一步進行判斷 # 雖然傻瓜了點,但這不正體現了我們的用心嗎? # 哈哈哈,每一步,都是我愛你的表現,你不會懂的! def hit_me(self): # global on_hit if self.on_hit == False: self.on_hit = True self.hit_count += 1 else: self.on_hit = False self.hit_count += 1 if self.hit_count == 1: # 第一步,是我愛你的開始 self.stringVar.set("愛我") elif self.hit_count == 2: # 第二步,是你愛我的回答 self.stringVar.set("還是愛我") elif self.hit_count == 3: # 第三步,是你逃不掉的緣份 self.stringVar.set("你逃不掉的!!!") elif self.hit_count == 4: # 第四步,是我對你的承諾 self.stringVar.set("看見中間那個框了嗎,給你個機會。。。") self.buttonVar.set("寫嘛寫嘛") self.e = Entry(self, show=None, highlightcolor="blue", highlightthickness=2, fg="black", relief=SUNKEN) self.e.pack() # 確認過程式,我遇上對的人 self.sureButton = Button(self, text="點我確認", width=15, height=2, command=self.sureAction) self.sureButton.pack() self.textInsert = Text(self, height=2) self.textInsert.pack()
# 若愛,定深愛 # 愛就要勇敢的表達出來 # 所以,我愛你 def sureAction(self): self.stringVar.set("不能反悔了啊!") var = self.e.get() var = "你輸入什麼都不管用的,對不起我也愛你!" self.textInsert.insert('end', var) self.e.delete(0, END) self.e.insert(END, "我愛你") self.e.pack()
# 這裡是程式入口 if __name__ == '__main__': # 我們的故事 # 從這裡開始 app = Application() # 設定視窗標題: app.master.title('大哥 大哥,說你愛我!') app.master.geometry('1200x800') # 主訊息迴圈: app.mainloop()
效果展示
第一次用gif圖,看看效果,下了一個LICEcap軟體做這件事;

xiaomei
編譯成exe
安裝 pyinstaller
工具,方法很簡單,使用 pip install pyinstaller
命令;
安裝完成在終端一路cd到剛才寫的指令碼路徑下,同時需要在當前路徑下把需要的圖片拷貝進來;
pyinstaller --onefile ./tk.py
上面這句話會將程式進行編譯生成exe檔案,接著把圖片拷貝到exe檔案目錄下,壓縮打包發給你的女神吧!
這裡有一個問題就是可以用 pyi-makespec 把資原始檔也打包到程式中,具體我沒有實現,需要的自行去百度吧;