关不掉的小姐姐程序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了

 

posted @ 2018-10-04 20:41  菜芽caiya  阅读(2347)  评论(0编辑  收藏  举报