奧推網

選單
科技

用 Python 實現浪漫表白程式

作者 | 李秋鍵 出品 | CSDN(ID:CSDNnews)

相信很多小夥伴都曾在抖音、快手以及 B 站等平臺刷到過表白程式,不論是各種的程式製作愛心或者是程式製作心動符號等,在各個平臺很受歡迎。但是其中大多數形式都已經被公眾所知曉,且缺乏流動性。故今天我們將自行設計一個表白浪漫程式,具有動態開關寵物、照片牆、彈窗提示以及 turtle 畫圖等功能。其中具體效果圖如下:

本浪漫程式的技術路線分為以下幾個部分:

透過 Pyqt5 模組構建透明視窗,並設定聊天窗等功能,設定右鍵功能,使其功能啟動“浪漫程式“;

開始寵物系統再透過多執行緒啟動其他程式,包含彈窗程式,海龜畫圖程式等;

生成愛心照片牆:透過 2。py 程式生成愛心照片牆,並縮放至1000×806;

海龜畫圖:執行 1。py 程式實現海龜畫圖,繪製玫瑰花和愛心;

其中的程式操作流程:

首先執行 2。py 生成照片牆,並縮放至 1000×806;然後執行 biu。py 啟動寵物系統,透過郵件寵物執行整個程式,最終程式會慢慢完成,形成動態程式效果。

具體功能的形成分為以下幾個部分介紹,最終程式碼也會免費放置文末的百度網盤中,供大家學習參考。

照片牆生成程式

其中程式執行基本步驟為:首先需要將需要生成的照片放置 photo 資料夾中,然後直接執行 2。py 程式即可。

其中的照片牆素材如下:

程式碼思路如下:

首先自定義二維 list,其中 1 表示填充空白塊,0 表示填充讀取到的照片;然後讀取照片路徑,並透過 random 實現隨機化,避免相近圖片排在一起;接著透過 Image 庫讀入圖片,對讀取到得影象集遍歷繪製至其中。其中具體部分程式碼如下所示:

random。shuffle(imgs)img_h = img_w = 250rows = len(map)columns = len(map[0])figure = Image。new(“RGB”, (img_w * columns, img_h * rows), “white”)count = 0for i in range(len(map)): for j in range(len(map[i])): if map[i][j] == 1: continue else: try: image = Image。open(os。path。join(img_dir, imgs[count])) except: continue image = image。resize((img_w, img_h)) figure。paste(image, (img_w * j, img_h * i)) count += 1

這裡用遊戲中的圖片作為生成素材,最終生成的照片牆如下:

啟動寵物程式

啟動寵物程式基本流程為:首先建立表白語料庫作為聊天視窗展示;然後自行選擇一些具有表白意義的 gif 動態圖作為寵物動作;最後透過 Pyqt5 構建透明視窗程式,透過多執行緒實現動作交替以及右鍵滑鼠功能等。

1、其中構建的語料庫檔案如下,儲存到“data。txt“中,並透過換行實現語句分割,其中“data。txt”直接放置和程式同一目錄即可,可參照文末提供的原始程式放置位置:

2、構建的寵物動作動態圖素材,將找到的素材放置biu資料夾下,如下圖所示:

3、程式實現。程式實現主要分為初始化透明視窗、設定托盤選項、右鍵選單功能、設定聊天對話方塊功能以及動作時間交替等部分,整體程式的實現有 pyqt5 構成。

其中具體知識點分為以下幾個部分:

1、Pyqt5 基本流程

1。1 類的定義和初始化

為了使程式更加規範,我們定義整體的類變數,方便呼叫。

其中分為下面幾步:

1、時間變數初始化

2、呼叫隨時間圖案變化函式

3、視窗位置和邊框初始化

4、計時器初始化。

5、滑鼠跟蹤定義

1。2 透明視窗的定義

初始化中加入 self。setAttribute(Qt。WA_TranslucentBackground) 實現背景透明效果。

1。3 不規則視窗函式的建立

主要使用 Qt。AvoidDither|Qt。ThresholdAlphaDither|Qt。ThresholdDither 引數實現不規則視窗。同時還需要規定不規則視窗尺寸等等,主要定義函式 mypix 進行呼叫

1。4 滑鼠設定

可透過初始化 self。setMouseTracking(False) 設定滑鼠移動跟蹤是否有效。設定為 True 時,只要滑鼠在視窗內移動時 mouseMoveEvent 事件就能捕獲

設定為 False 時(預設),只有滑鼠鍵按下並在視窗內移動時 mouseMoveEvent 事件才能捕獲

注意只能是 QWidget,如果是 QMainwindow,則無效

self。hasMouseTracking()返回設定的狀態

1。5 建立多執行緒時間變化

定義時間變化函式,一個執行緒用來更新動畫,另一個用來更新對話方塊。

1。6 對話方塊函式定義

如果滑鼠觸碰到寵物的話就彈出對話。

其中部分程式碼如下:

def __init__(self): super(DemoWin, self)。__init__() self。initUI() # 初始化,不規則視窗 self。setWindowFlags(Qt。FramelessWindowHint | Qt。WindowStaysOnTopHint | Qt。SubWindow) self。setAutoFillBackground(False) self。setAttribute(Qt。WA_TranslucentBackground, True) self。repaint() # 是否跟隨滑鼠 self。is_follow_mouse = False self。move(1650,20) with open(“data。txt”, “r”) as f: text = f。read() self。sentence = text。split(“\n”)

2、滑鼠控制

2。1 滑鼠點選事件

滑鼠點選 icon 傳遞的訊號會帶有一個整形的值,1是表示單擊右鍵,2是雙擊,3是單擊左鍵。

2。2 滑鼠按下呼叫

透過 n = event。button() 用來判斷是哪個滑鼠健觸發了事件【返回值:0 1 2 4】。

其中:

QtCore。Qt。NoButton - 0 - 沒有按下滑鼠鍵

QtCore。Qt。LeftButton -1 -按下滑鼠左鍵

QtCore。Qt。RightButton -2 -按下滑鼠右鍵

QtCore。Qt。Mion 或 QtCore。Qt。MiddleButton -4 -按下滑鼠中鍵

透過 nn = event。buttons() 返回前面所列列舉值的組合,用於判斷同時按下了哪些鍵

2。3 滑鼠鬆開

定義函式 mouseReleaseEvent,滑鼠鍵釋放時呼叫引數1:滑鼠的作用物件;引數2:滑鼠事件物件,用來儲存滑鼠資料。

2。4 滑鼠拖動事件

定義函式 mouseMoveEvent 透過 self。hasMouseTracking() 獲取移動值。然後獲得滑鼠座標。控制視窗隨之移動

2。5 滑鼠移出和滾輪事件

滑鼠移出定義函式 leaveEvent,滾輪 wheelEvent。

2。6 滑鼠右鍵事件

滑鼠移出定義函式contextMenuEvent,在右鍵選單裡透過cmenu。addAction加入標籤。action = cmenu。exec_(self。mapToGlobal(e。pos())) 獲取滑鼠點選標籤,用來判斷使用者點選了哪一個標籤。

其中部分程式碼如下:

# 當按右鍵的時候,這個event會被觸發def contextMenuEvent(self, event): menu = QMenu(self) video = menu。addAction(“浪漫程式”) quitAction = menu。addAction(“退出”) action = menu。exec_(self。mapToGlobal(event。pos())) if action == quitAction: qApp。quit() if action == video: import threading def t2(): os。system(“python 1。py”) t22=threading。Thread(target=t2) t22。start()

3、動態寵物控制

3。1 根據事件的動作判定

這裡定義點選等動作自動回饋等等。

3。2 寵物圖片更換

定義列表用來儲存素材關係。

3。3 程式退出事件

透過quit函式控制退出

def quit(self): self。close() sys。exit()

3。4 整體執行

從main入口開始執行整體類

if __name__ == ‘__main__’: app = QApplication(sys。argv) app。setWindowIcon(QIcon(“1。jpg”)) # 建立一個主視窗 mainWin = DemoWin() # 顯示 mainWin。show() # 主迴圈 sys。exit(app。exec_())

最終實現效果如下如所示:

turtle 畫圖

這裡透過海龜畫圖繪製愛心和玫瑰,實現動態繪圖效果。透過 pensize 函式定義畫筆大小;speed 定義速度;Color 定義顏色;等等

其中部分程式碼如下:

wn = turtle。Screen()wn。screensize()wn。setup(width=1。0, height=1。0)wn。register_shape(‘1。gif’)rocket = turtle。Turtle()rocket。shape(‘1。gif’)color(‘red’, ‘pink’)getscreen()。tracer(1, 0)heart(100, 0, 0。7)go_to(80, 70)write(“小明”, font=(“楷體”, 18, “normal”))setheading(0)heart(-80, -100, 1)go_to(-110, 15)write(“小紅”, font=(“宋體”, 20, “normal”))go_to(40, -80)write(“三生三世皆是你!”, move=True, align=“left”, font=(“arial”, 22, “italic”))time。sleep(2)wn。clear()

彈窗程式

彈窗程式非常簡單,透過 tkinter 構建彈窗即可,再定義視窗和字型大小顏色等等即可。然後迴圈多執行緒實現。

其中部分程式碼如下:

def dow(): window = tk。Tk() width = window。winfo_screenwidth() height = window。winfo_screenheight() a = random。randrange(0, width) b = random。randrange(0, height) window。title(‘小明表白小紅’) # 彈窗的名字window。geometry(“200x50” + “+” + str(a) + “+” + str(b)) # 彈窗大小 tk。Label(window, text=‘小明表白小紅!’, # 標籤的文字 bg=‘Red’, # 背景顏色 font=(‘楷體’, 17), # 字型和字型大小 width=15, height=2 # 標籤長寬 )。pack() # 固定視窗位置 window。mainloop()threads = []for i in range(100): t = threading。Thread(target=dow) threads。append(t) time。sleep(0。1) threads[i]。start()

效果如下:

完整程式碼詳見:https://gitcode。net/qq_42279468/gaobai/-/tree/master

《2022-2023 中國開發者大調查》重磅啟動,歡迎掃描下方二維碼,參與問卷調研,更有 iPad 等精美大禮等你拿!