關不掉的小姐姐程序python tkinter實現 學習---打包教程


首先,我們先准備兩個.py文件,還要圖片文件         代碼//是我自己手寫的,copy時記得刪掉,不然有可能錯誤,比如中英文啥的    當然 一些語法的無問題就百度,都能給你答案

第一個.py 代碼 

pyinstaller打包不打圖片,但是.py文件肯定會打。那么把圖片用.py文件保存就是解決問題的核心。也就是把圖片用base64編碼保存在文件里面。下面代碼就是完成這個工作

 1 # -*- coding: utf-8 -*-
 2 
 3  
 4 import base64
 5  
 6 def pic2py(picture_name):     #把圖片用base64編碼保存在文件里面。
 7     """
 8     將圖像文件轉換為py文件
 9     :param picture_name:
10     :return:
11     """
12     open_pic = open("%s" % picture_name, 'rb')  #python 內置函數open()  用於打開一個文件      
13                                                 #rb 以二進制格式打開一個文件用於只讀。文件指針將會放在文件的開頭。這是默認模式
14     b64str = base64.b64encode(open_pic.read())
15     # 注意這邊b64str一定要加上.decode()
16     write_data = 'img = "%s"' % b64str.decode()
17     f = open('%s.py' % picture_name.replace('.', '_'), 'w+')  #打開一個文件用於讀寫。如果該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件。
18     f.write(write_data)
19     f.close()
20  
21     """
22     通俗的理解__name__ == '__main__':假如你叫小明.py,在朋友眼中,你是小明(__name__ == '小明');在你自己眼中,你是你自己(__name__ == '__main__')。
23     if __name__ == '__main__'的意思是:當.py文件被直接運行時,if __name__ == '__main__'之下的代碼塊將被運行;當.py文件以模塊形式被導入時,if __name__ == '__main__'之下的代碼塊不被運行。
24     """
25  
26 if __name__ == '__main__': 
27     pics = ["main_w.gif","sure.gif","not.gif"]     //這個文件我們只需要改這里的這個list變量,它的元素就是我們要使用的圖片的全名加后綴
28     for i in pics:
29         pic2py(i)
30     print("ok")

然后這個,py文件創建好之后,我們到當前目錄使用python xxx.py運行一遍。   當打印ok則運行正常。之后我們到當前目錄就會看到多了例如這個文件:

到這里說明我們的圖片已經編碼完成並保存到該文件里了

 

第二個.py文件:主代碼部分,加上將上面編碼的圖片數據在解碼並生成圖片到當前目錄。執行完在刪掉

這樣做就是每次打開程序時都會解碼到當前文件夾(因為圖片數據已經編碼並存儲到.py文件,打包時也一同打包了,這樣在別的電腦也就可以運行了)

import tkinter as tk#這個語句導入tkinter模塊,但為方便,為它定義了一個別名tk。
import time#導入time模塊后,我們就有了變量time指向該模塊,利用time這個變量,就可以訪問time模塊的所有功能。
import tkinter.messagebox  #messagebox是普通windows編程中經常用到的,目的是顯示個信息框
import base64//要將編碼之后的圖片數據解碼並保存為圖片
import os//我們刪除圖片,這個要添加進來
from main_w_gif import img as socket_one     //接下來就是在文件中導入你剛剛生成的xxx.py文件,因為每個圖片文件里面都是img變量,所以導入的時候可以用別名,這是python的基本用法了,不再多說。
from not_gif import img as socket_two
from sure_gif import img as socket_three

tmp = open('socket_one.gif', 'wb')      //這是解碼。保存圖片
tmp.write(base64.b64decode(socket_one))

tmp = open('socket_two.gif', 'wb')
tmp.write(base64.b64decode(socket_two))

tmp = open('socket_three.gif', 'wb')
tmp.write(base64.b64decode(socket_three))

tmp.close()#現在就能用了,用完(加載到程序里之后)

"""
我們編寫的Python代碼會調用內置的Tkinter,Tkinter封裝了訪問Tk的接口;

Tk是一個圖形庫,支持多個操作系統,使用Tcl語言開發;

Tk會調用操作系統提供的本地GUI接口,完成最終的GUI。

所以,我們的代碼只需要調用Tkinter提供的接口就可以了

tkinter的兩種寫法,這兩種寫法是有區別的,

第一種,使用就需要加類名,也就是需要加tkinter,  
第二種,已經把tkinter完全導入了,你不用管調用的是哪個類,只管使用就可以了。所以不需要加類名。



#法1:
import tkinter
win=tkinter.Tk()
win.mainloop()
#法2:
from tkinter import *
win=Tk()



""" window
= tk.Tk() # 設置主窗口大小 window.geometry('450x400') # 設置主窗口標題 window.title('你是不是比較蠢') def closeWindow(): tkinter.messagebox.showerror(title='別嘛',message='還沒回答呢!') #錯誤消息框 return window.protocol('WM_DELETE_WINDOW', closeWindow) # 設置文字 lable1 = tk.Label(window, text="hey,xxx") #, font=("Arial", 14) lable2 = tk.Label(window, text="你是不是傻子?") #, font=("Arial", 34) # 設置圖片 photo = tk.PhotoImage(file='./socket_one.gif') imgLabel = tk.Label(window, imag=photo) # 調用tkinter的布局管理模塊 lable1.pack() lable2.pack() imgLabel.pack() photo1 = tk.PhotoImage(file='./socket_two.gif')#不能放在love里面 由於垃圾回收機制造成的問題.當運行離開 create_new_demo() 作用域后,里面的 myimg 對象 被認為之后再也用不到.所以被垃圾回收機制給處理了. photo2 = tk.PhotoImage(file='./socket_three.gif') # 點擊喜歡的操作 def Love(): love = tk.Toplevel(window) love.geometry('400x220') love.title("好巧,我也這么認為") lable = tk.Label(love,text="好巧,我也這么認為") #, font=("Arial", 24) imgLabel1 = tk.Label(love, imag=photo1) imgLabel1.pack() btn = tk.Button(love, text="確定",width=30, height=2) btn.config(command=lambda :closelove(love)) lable.pack() love.protocol('WM_DELETE_WINDOW', closeall) btn.pack() # 點擊不喜歡的操作 def NoLove(): no_love = tk.Toplevel(window) no_love.geometry('350x330') no_love.title("再考慮考慮唄") lable = tk.Label(no_love,text="再考慮考慮唄") #, font=("Arial", 24) imgLabel2 = tk.Label(no_love, imag=photo2) imgLabel2.pack() btn = tk.Button(no_love, text="確定",width=30, height=2) btn.config(command=lambda :closenolove(no_love)) lable.pack() btn.pack() # 子窗口關閉操作 def closeall(): window.destroy() def closelove(love): window.destroy() def closenolove(no_love): no_love.destroy() # 設置按鈕 btn1 = tk.Button(window, text="",width=30, height=2) # 配置按鈕 btn1.config(command=Love) btn2 = tk.Button(window, text="不是",width=30, height=2) btn2.config(command=NoLove) # 調用tkinter的布局管理模塊 btn1.pack() btn2.pack() window.mainloop()
"""
window.mainloop就會讓window不斷的刷新,如果沒有mainloop,就是一個靜態的window,傳入進去的值就不會有循環,mainloop就相當於一個很大的while循環,有個while,每點擊一次就會更新一次,所以我們必須要有循環
  所以的窗口文件都必須有類似的mainloop
  mainloop是窗口文件的關鍵的關鍵的關鍵。

"""
os.remove(
'socket_one.gif')//刪除圖片 os.remove('socket_two.gif') os.remove('socket_three.gif')

 之后按照我前面說的打包教程打包第二個.py文件,就ok了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM