过分了,别人用来做桌面应用开发,这家伙却用来撩妹(2)-上帝给你开了各种撩妹窗口(Tkinter)
续上一篇学习,我们搞定了了tkinter的基础函数,这次我们开始来搞事情。
一、目录
过分了,别人用来做桌面应用开发,这家伙却用来撩妹(2)-上帝给你开了各种撩妹窗口(Tkinter)
一、目录
二、前言
三、撩妹弹窗正文
第一步:实现一个窗口
第二步:弹窗都是爱你的模样
第三步:实现启动多个窗口
第四步:每隔一段时间弹出一个骚扰窗口
第五步:随机的窗口
二、前言
三、撩妹弹窗正文
第一步:实现一个窗口
首先我们先来创建一个普通的弹窗。这里我们需要制定一下窗口的需求:
- 窗口大小固定
- 背景颜色为浅蓝色
- 显示文字“祝福弹框”
- 以函数的方式实现,调用函数便可启动弹窗
最终的需求代码如下:
import tkinter
from tkinter import *
tk=tkinter.Tk()
def window():
tk.title("一个窗口") # 设置窗口名称
tk.geometry("180x80+500+300")
tk.iconbitmap('favicon.ico')
tk["background"] = "#7AC5CD"
tk.maxsize(180, 80)
tk.minsize(180, 80)
# tk.attributes("-toolwindow", True)#隐藏顶部工具栏之后,icon不会显示
Label(text="祝福弹窗",bg="#7AC5CD",width=25,height=5,font=60).grid(column=1,row=1)
tk.mainloop()
if __name__ == '__main__':
window()
完整需求实现,如图:
第二步:弹窗都是爱你的模样
老规矩,我们来说一下我们的需求吧!
- 窗口大小固定
- 弹窗插入一张图片(任意图片均可)
- 图片的大小与窗口一致
- 将下面的桃心图片显示在窗口中。
好的,我们的需求已经制定了,那我们来看一下。
这还不简单,上一张我们不是可以插入图片了吗?那还不是分分钟钟就搞定的事。来看源代码
import tkinter
from tkinter import *
tk=tkinter.Tk()
def window():
tk.title("一个窗口") # 设置窗口名称
tk.geometry("300x300+500+300")
tk.iconbitmap('favicon.ico')
tk["background"] = "#7AC5CD"
photo = tkinter.PhotoImage(file="Figure_1.jpg")
tkinter.Label(tk, image=photo).grid(column=0, row=0) # 把图片整合到标签类中
tk.mainloop()
if __name__ == '__main__':
window()
需求是满足了,桃心也显示了,但是,jpg格式,不支持。
然后图片大小可以自动缩放,不行,图片它有自己的想法,它要做自己。
再来改这个bug。于是,我们引入了另外一个模块来解决。
import tkinter
from tkinter import *
from PIL import Image, ImageTk
tk=tkinter.Tk()
def window():
tk.title("一个窗口") # 设置窗口名称
tk.geometry("300x300+500+300")
tk.iconbitmap('favicon.ico')
tk["background"] = "#7AC5CD"
image=Image.open("Figure_1.jpg")#打开图片
image=image.resize((300,300))#设置图片大小
photo = ImageTk.PhotoImage(image)#引入图片
tkinter.Label(tk, image=photo).grid(column=0, row=0) # 把图片整合到标签类中
tk.mainloop()
if __name__ == '__main__':
window()
第三步:实现启动多个窗口
好了,经过前面的学习,我们已经掌握了一个弹窗的生成诀窍,然后我们来学习打开多个弹窗。
可能有的小伙伴就会说了,一个都解决了,多个那我们直接循环一下。
代码:
if __name__ == '__main__':
for i in range(1,3):
window()
然而实际上,不管理循环多少次,页面都只有一个弹框,这是一个新手都会出现的问题。
如果按照上面的运行,你就会发现,当你关闭一个之后,又有一个弹框弹出来,直到循环结束,就问你慌不慌,庆幸你只写了两个。
这时候,就需要用到多线程了。
通俗点来说,就比如你一个人在干活,又有一堆活需要做,但你又分不开,怎么办,再叫个人来呀。这就是多线程。本来要你一个人做一天的,现在两个人只需要半天。
代码实现:
import threading,time
#不传参数
def run_threaded(func):
threads = []
for i in range(2):#线程数量(窗口数量)
t = threading.Thread(target=func) # 这里的0表示的是列表中需要展示的数据,当然这里你可以在列表中增加字段数量,这里也可以替换为i
threads.append(t) # 将函数加入到线程中
time.sleep(0.1) # 加上停顿时间,防止太快,卡死。
threads[i].start() # 启动线程
#传参数
def run_threaded2(func,text):
threads = []
for i in range(2): # 线程数量
t = threading.Thread(target=func, args=(text,)) # 多个参数args=(text,name,sex,)
threads.append(t) # 将函数加入到线程中
time.sleep(0.1) # 加上停顿时间,防止太快,卡死。
threads[i].start() # 启动线程
接着,我们启动程序,运行,结果发现,一个窗口有文字,一个窗口没文字,这是怎么回事呢?
if __name__ == '__main__':
run_threaded(window)
原来,这是我们在之前写程序所埋下的坑,问题出在之前我们定义的标签上。
原代码:
Label(text="祝福弹窗",bg="#7AC5CD",width=25,height=5,font=60).pack()
修改之后:
Label(master=tk,text="祝福弹窗",bg="#7AC5CD",width=25,height=5,font=60).pack()
#master=tk指定窗口显示,框架的父容器,不填写则会全部写入到第一个窗口中
多窗口完整代码:
import tkinter
from tkinter import *
from PIL import Image, ImageTk
import threading,time
def window():
tk = Tk()
tk.title("一个窗口") # 设置窗口名称
tk.geometry("180x80+500+300")
tk.iconbitmap('favicon.ico')
tk["background"] = "#7AC5CD"
tk.maxsize(180, 80)
tk.minsize(180, 80)
tk.attributes("-toolwindow", True)#隐藏顶部工具栏之后,icon不会显示
Label(master=tk,text="祝福弹窗",bg="#7AC5CD",width=25,height=5,font=60).pack()
#master=tk指定窗口显示,框架的父容器,不填写则会全部写入到第一个窗口中
tk.mainloop()
#不传参数
def run_threaded(func):
threads = []
for i in range(2):#线程数量(窗口数量)
t = threading.Thread(target=func) # 这里的0表示的是列表中需要展示的数据,当然这里你可以在列表中增加字段数量,这里也可以替换为i
threads.append(t) # 将函数加入到线程中
time.sleep(0.1) # 加上停顿时间,防止太快,卡死。
threads[i].start() # 启动线程
if __name__ == '__main__':
run_threaded(window)
第四步:每隔一段时间弹出一个骚扰窗口
多个弹窗已经搞定了,那我们继续来弹窗,说明需求:
- 需要弹出多个窗口
- 每隔多长时间就会自动弹出一个
- 关闭一个弹窗之后,依然不影响继续弹窗。
这里我们可以采用定时任务的的方式,也可以直接使用等待。定时任务,可以看这篇。
import threading,time
#不传参数
def run_threaded(func):
threads = []
for i in range(1):#线程数量(窗口数量)
t = threading.Thread(target=func) # 这里的0表示的是列表中需要展示的数据,当然这里你可以在列表中增加字段数量,这里也可以替换为i
threads.append(t) # 将函数加入到线程中
time.sleep(0.1) # 加上停顿时间,防止太快,卡死。
threads[i].start() # 启动线程
if __name__ == '__main__':
while True:
time.sleep(3)
run_threaded(window)
是不是很简单,只需要加上一个等待,每次启动一个线程。
注:千万不要把这个发给不太懂电脑的人,不然他可能会因为无法阻止窗口的弹窗,而重启电脑
第五步:随机的窗口
我们继续来看随机弹窗,先来说明需求:
- 需要弹出很多的弹窗
- 需要在不同位置上弹出窗口
在上面,我们已经看出来了,这些窗口弹出的位置,都是固定的,那我们这次来搞定随机的窗口。在不同位置出现。
要实现不同位置,首先要想到的是创建窗口时的函数。
我们只需要修改后面的坐标位置就可以了,那要如何实现随机呢,我们需要用到random模块
import random
print( random.randint(1,10) ) # 产生 1 到 10 的一个整数型随机数
print( random.random() ) # 产生 0 到 1 之间的随机浮点数
print( random.uniform(1.1,5.4) ) # 产生 1.1 到 5.4 之间的随机浮点数,区间可以不是整数
print( random.choice('tomorrow') ) # 从序列中随机选取一个元素
print( random.randrange(1,100,2) ) # 生成从1到100的间隔为2的随机整数
这里,我们用到 random.randint(1,10),我们来选定一个范围,并写入代码:
from tkinter import *
import random
import threading,time
def window():
tk = Tk()
tk.title("一个窗口") # 设置窗口名称
tk.geometry("180x80+%s+%s"%(random.randint(500,1000),random.randint(300,500)))
tk.iconbitmap('favicon.ico')
tk["background"] = "#7AC5CD"
tk.maxsize(180, 80)
tk.minsize(180, 80)
tk.attributes("-toolwindow", True)#隐藏顶部工具栏之后,icon不会显示
Label(master=tk,text="祝福弹窗",bg="#7AC5CD",width=25,height=5,font=60).pack()
#master=tk指定窗口显示,框架的父容器,不填写则会全部写入到第一个窗口中
tk.mainloop()
#不传参数
def run_threaded(func):
threads = []
for i in range(1):#线程数量(窗口数量)
t = threading.Thread(target=func) # 这里的0表示的是列表中需要展示的数据,当然这里你可以在列表中增加字段数量,这里也可以替换为i
threads.append(t) # 将函数加入到线程中
time.sleep(0.1) # 加上停顿时间,防止太快,卡死。
threads[i].start() # 启动线程
if __name__ == '__main__':
while True:
time.sleep(3)
run_threaded(window)