背景
在学校,闲得无聊想恶搞一下室友,制造一个无限弹窗(想弹多少就弹多少),保证让Ta破防。可是有时候室友的电脑上并没有搭建Python环境,怎么办呢?。不用担心,我们将会把Python初始文件编译为exe文件,让程序在没有Python环境的情况下也能正常运行。那么好,本章节将教你如何制作(详细到只需轻轻动几下手指)。(注:本章节共分为上,下两篇)
编程思路
我们试想一下,我们本次编程所需调用的Python库有哪些。这非常重要,正如我们解题一样:解题之前必须有详细或大致的思路,否则就是在浪费我们宝贵的时间。那么好,我们先从主题入手,tkinter库是主体;其次,多次的弹窗,我们需要多线程,因此threading库必不可少;为了伪造系统的随机性,我们需要random库;为了获取系统的真实信息,我们需要os,platform两个库;为了表现程序真实性,我们需要time库......至此,所有库都准备好了-tkinter,random,time,os,platform,threading。
import tkinter
import os
import threading
import time
import random
import platform
1,弹窗颜色
为了让弹窗拥有自己的“专属颜色”,我们需要在给弹窗上色前给它准备好“调色盘”。因此我们先给建立一个列表s,其内装有各种颜色(为了编程方便,本次编程将使用十种颜色:红,橙,黄,绿,蓝,紫,白,黑,金,灰)。如下所示:
s=['red','orange','yellow','green','blue','purple','white','black','gold','gray']
2,倒计时迭代器
由于我们设置的弹窗次数是由自己定的,因次弹窗次数虽然可以改变但是有限。因此我们需要一个弹窗次数的迭代器,用来纪录程序的弹窗次数。本次编程中我们将会把弹窗的过程表现得像倒计时一样,所以我们暂且将这个迭代器称为倒计时迭代器(我设置的弹窗次数为10,即begin)。如下所示:
begin=10
def count_down():
seconds=[]
for i in range(begin,0,-1):
seconds.append(i)
return seconds
迭代器将值添加进列表seconds中并返回列表seconds的最终结果。
3,主窗口
主窗口就是我们的弹窗。这里我们制定一个函数windows(),用来打开弹窗,接下来就需要利用上面所给的自定义count_down()函数对弹窗标题进行实时内容更新。我们利用while函数对倒计时迭代器的返回内容进行一对一匹配(即不让弹窗颜色始终保持原状)。接着就是tkinter弹窗标题进行设计,我们使用os模块的name属性来获取操作系统的名称,使用platform模块来获取与系统相关的更详细的信息:platform.system() -输出操作系统名称,如 'Linux' 或 'Windows';platform.release() -输出操作系统版本号;platform.version() -输出操作系统版本信息;platform.machine() -输出计算机类型......接下来是窗口大小的设计,本次编程我采用的是1160x600(大家可自行设置)。number为0~9的随机数(包含0,9),它将提供给我们列表s中颜色的编号(即赋给bg)。然后就是弹窗内容了,我们将倒计时迭代器所匹配得到的内容加入其中,设置文字类型为楷体,文字大小为30,长宽与上面相同。利用pack()函数进行固定,mainloop()函数执行。如下所示:
def windows():
while len(count_down())>0:
window = tkinter.Tk()
window.title('{} {} {} {}警告!!!'.format(os.name,
platform.machine(),
platform.release(),
platform.version()))
window.geometry("{}x{}".format(1160,600))
number=random.randint(0,9)
tkinter.Label(window,
text='{}系统将在{}秒后自动关机'.format(platform.system(),count_down()[0])*1,
font=('楷体',30),
bg='{}'.format(s[number]),
width=1160,
height=600
).pack()
window.mainloop()
count_down().remove(count_down()[0])
4,执行单元
我们是设计一个while循环:begin作为与倒计时迭代器的匹配对象,将主窗口作为被执行对象执行。这里我们将调用time模块,让程序每执行一次弹窗弹出就休眠一秒,伪造程序正在进行强制自动关机前的倒计时的模样。如下所示:
while begin>0:
mark=threading.Thread(target=windows)
mark.start()
time.sleep(1)
begin-=1
完整代码如下:
import tkinter
import os
import threading
import time
import random
import platform
s=['red','orange','yellow','green','blue','purple','white','black','gold','gray']
begin=10
def count_down():
seconds=[]
for i in range(begin,0,-1):
seconds.append(i)
return seconds
def windows():
while len(count_down())>0:
window = tkinter.Tk()
window.title('{} {} {} {}警告!!!'.format(os.name,
platform.machine(),
platform.release(),
platform.version()))
window.geometry("{}x{}".format(1160,600))
number=random.randint(0,9)
tkinter.Label(window,
text='{}系统将在{}秒后自动关机'.format(platform.system(),count_down()[0])*1,
font=('楷体',30),
bg='{}'.format(s[number]),
width=1160,
height=600
).pack()
window.mainloop()
count_down().remove(count_down()[0])
while begin>0:
mark=threading.Thread(target=windows)
mark.start()
time.sleep(1)
begin-=1
运行效果展示:
(下一篇我们将学习将Python初始文件编译为exe文件,使它在无Python环境的情况下也能正常运行)
期待你的交流指教,我是闪云-微星,我们下期再见!