- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Python趣味挑战之pygame实现无敌好看的百叶窗动态效果由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
(一)使用到的python库 。
使用pygame库、random库和os、sys等系统库.
其中: pygame库实现主体功能,提供窗口界面显示、动态效果展示等 random库实现随机数的生成,通过随机数实现动态百叶窗的上下左右选择、百叶窗的数量选择等功能。 os库实现图片资源的装载和读取。 sys库实现退出操作等.
(二) 整体实现逻辑 。
通过WIDTH = 600 和 HEIGHT = 600设置窗口的高度和宽度 通过runimage 和 nextimage 设置当前显示的图像和下一张要显示的图像 通过num_part = random.randint(3,8)来设置要显示的百叶窗的数量 通过num_list = []保存当前runimage拆分出来的百叶窗的surface资源,用于在百叶窗动态效果过程中显示。 通过choose来设置是上下运动还是左右运动.
(一)实现pygame的主窗口 。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
import
pygame,sys
pygame.init()
screen
=
pygame.display.set_mode((
500
,
500
))
pygame.display.set_caption(
'大小框展示'
)
fcclock
=
pygame.time.Clock()
while
True
:
for
event
in
pygame.event.get():
if
event.
type
=
=
pygame.QUIT
or
event.
type
=
=
pygame.K_F1:
pygame.quit()
sys.exit()
fcclock.tick(
60
)
pygame.display.flip()
# 刷新窗口
|
黑黑的框,不截图了。大家都懂.
(二)贴个图显示得好看点 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
import
pygame,sys
pygame.init()
screen
=
pygame.display.set_mode((
500
,
500
))
pygame.display.set_caption(
'大小框展示'
)
fcclock
=
pygame.time.Clock()
img
=
pygame.image.load(
'./image/aerial-alpine-ceresole-reale-desktop-backgrounds-1562.jpg'
).convert_alpha()
img
=
pygame.transform.scale(img, (
500
,
500
))
while
True
:
for
event
in
pygame.event.get():
if
event.
type
=
=
pygame.QUIT
or
event.
type
=
=
pygame.K_F1:
pygame.quit()
sys.exit()
screen.blit(img,(
0
,
0
))
fcclock.tick(
60
)
pygame.display.flip()
# 刷新窗口
|
(三)图片从哪里来 。
这里建议直接通过网络上下载免费的、好看的图片,并保存在指定的文件夹,用于过程中展现.
我认为有三种方法:
其一:使用爬虫技术从网上下载图片,可以开一个子线程负责采集网上图片,然后加载到list列表中; 其二:可以直接对电脑中所有的盘进行自动检索,然后加载到list列表中; 其三:指定目录,然后加载到list列表中; 我这里偷个懒,选择第三种方法实现.
具体实现代码如下:
1
2
3
4
5
|
path
=
'./image/'
files
=
[]
dirs
=
os.listdir(path)
for
diretion
in
dirs:
files.append(path
+
diretion)
|
(四)图片装载 。
我为什么在初始化的时候就进行装载呢?
原因是:解决效率问题,无需每次使用时重复加载,而且在初始化的时候就适配屏幕大小进行图片缩放.
因此,我把这个过程打包成一个函数,方便后续调用,而且参数传递为:屏幕的大小。然后返回bglist对象.
1
2
3
4
5
|
for
file
in
files:
picture
=
pygame.transform.scale(pygame.image.load(
file
), (
1440
,
900
))
dSurface
=
picture
# dSurface = pygame.image.load(file).convert()
bglist.append(dSurface)
|
OK,图片有了,窗口有了,那么就开始实现我们的业务逻辑吧.
(一)实现init_image函数初始化加载图片到surface对象 。
1
2
3
4
5
6
7
8
9
10
11
12
|
def
init_image():
path
=
'./image/'
files
=
[]
dirs
=
os.listdir(path)
for
diretion
in
dirs:
files.append(path
+
diretion)
for
file
in
files:
picture
=
pygame.transform.scale(pygame.image.load(
file
), (WIDTH, HEIGHT))
dSurface
=
picture
# dSurface = pygame.image.load(file).convert()
bglist.append(dSurface)
|
(二)初始化相关变量 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
runimage
=
None
nextimage
=
None
flag
=
False
# FALSE没有切屏 TRUE 切屏
flag2
=
False
choose
=
6
num_part
=
random.randint(
3
,
8
)
# 记录分成多少块矩形框
num_list
=
[]
num_increse
=
1
inc
=
random.choice([
-
1
,
1
])
while
num_increse<
=
num_part:
inc
=
-
inc
num_list.append(inc)
num_increse
+
=
1
|
这里,建议大家思考一下为什么要引入变量flag和flag2 。
(三)每次百叶窗切换完之后重置 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
def
reset():
global
flag,runimage,nextimage,flag2,i,j,choose,num_part,num_list
flag
=
False
# FALSE没有切屏 TRUE 切屏
flag2
=
False
choose
=
random.randint(
6
,
7
)
if
nextimage
is
None
:
nextimage
=
random.choice(bglist)
if
runimage
is
None
:
runimage
=
random.choice(bglist)
else
:
runimage
=
nextimage
nextimage
=
random.choice(bglist)
num_part
=
random.randint(
3
,
8
)
# 记录分成多少块矩形框
num_list
=
[]
num_increse
=
1
inc
=
random.choice([
-
1
,
1
])
while
num_increse <
=
num_part:
inc
=
-
inc
num_list.append(inc)
num_increse
+
=
1
|
(四)实现百叶窗动态切换的run函数 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
def
run():
global
flag,runimage,flag2,nextimage,i,j,choose,num_part,num_list
reset()
while
True
:
for
event
in
pygame.event.get():
if
event.
type
=
=
pygame.QUIT
or
event.
type
=
=
pygame.K_F1:
pygame.quit()
sys.exit()
if
event.
type
=
=
pygame.KEYDOWN:
if
event.key
=
=
pygame.K_ESCAPE:
pygame.quit()
sys.exit()
if
event.key
=
=
pygame.K_SPACE:
if
flag
is
False
:
# FALSE没有切屏 TRUE 切屏
flag
=
True
flag2
=
False
screen.fill((
255
,
255
,
255
))
# 设置背景为白色
if
flag:
if
choose
=
=
6
:
select_rect
=
[]
kk
=
0
while
kk < num_part:
tmp_rect
=
pygame.Rect(kk
*
WIDTH
/
num_part,
0
,WIDTH
/
num_part,HEIGHT)
select_rect.append(runimage.subsurface(tmp_rect).copy())
kk
+
=
1
screen.blit(nextimage, (
0
,
0
))
mm
=
0
for
each
in
zip
(select_rect,num_list):
if
each[
1
]
=
=
1
:
screen.blit(each[
0
], (i
+
mm
*
WIDTH
/
num_part,
-
j))
else
:
screen.blit(each[
0
], (i
+
mm
*
WIDTH
/
num_part, j))
mm
+
=
1
j
+
=
step
if
j >
=
HEIGHT:
flag2
=
True
elif
choose
=
=
7
:
select_rect
=
[]
kk
=
0
while
kk < num_part:
tmp_rect
=
pygame.Rect(
0
,kk
*
HEIGHT
/
num_part,WIDTH,HEIGHT
/
num_part)
select_rect.append(runimage.subsurface(tmp_rect).copy())
kk
+
=
1
screen.blit(nextimage, (
0
,
0
))
mm
=
0
for
each
in
zip
(select_rect,num_list):
if
each[
1
]
=
=
1
:
screen.blit(each[
0
], (
-
i, j
+
mm
*
HEIGHT
/
num_part))
else
:
screen.blit(each[
0
], (i, j
+
mm
*
HEIGHT
/
num_part))
mm
+
=
1
i
+
=
step
if
i >
=
WIDTH:
flag2
=
True
else
:
screen.blit(nextimage, (
0
,
0
))
screen.blit(runimage, (
0
,
0
))
if
flag2:
reset()
fcclock.tick(fps)
pygame.display.flip()
# 刷新窗口
|
(五)主函数 。
1
2
3
|
if
__name__
=
=
'__main__'
:
init_image()
run()
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
import
sys, pygame
import
os
import
random
pygame.init()
# 初始化pygame类
WIDTH
=
600
HEIGHT
=
600
screen
=
pygame.display.set_mode((WIDTH, HEIGHT))
# 设置窗口大小
pygame.display.set_caption(
'美丽的屏保'
)
# 设置窗口标题
tick
=
pygame.time.Clock()
fps
=
60
# 设置刷新率,数字越大刷新率越高
fcclock
=
pygame.time.Clock()
runimage
=
None
nextimage
=
None
flag
=
False
# FALSE没有切屏 TRUE 切屏
flag2
=
False
choose
=
6
num_part
=
random.randint(
3
,
8
)
# 记录分成多少块矩形框
num_list
=
[]
num_increse
=
1
inc
=
random.choice([
-
1
,
1
])
while
num_increse<
=
num_part:
inc
=
-
inc
num_list.append(inc)
num_increse
+
=
1
def
init_image():
path
=
'./image/'
files
=
[]
dirs
=
os.listdir(path)
for
diretion
in
dirs:
files.append(path
+
diretion)
for
file
in
files:
picture
=
pygame.transform.scale(pygame.image.load(
file
), (WIDTH, HEIGHT))
dSurface
=
picture
bglist.append(dSurface)
def
reset():
global
flag,runimage,nextimage,flag2,i,j,choose,num_part,num_list
flag
=
False
# FALSE没有切屏 TRUE 切屏
flag2
=
False
i
=
0
j
=
0
choose
=
random.randint(
6
,
7
)
if
nextimage
is
None
:
nextimage
=
random.choice(bglist)
if
runimage
is
None
:
runimage
=
random.choice(bglist)
else
:
runimage
=
nextimage
nextimage
=
random.choice(bglist)
num_part
=
random.randint(
3
,
8
)
# 记录分成多少块矩形框
num_list
=
[]
num_increse
=
1
inc
=
random.choice([
-
1
,
1
])
while
num_increse <
=
num_part:
inc
=
-
inc
num_list.append(inc)
num_increse
+
=
1
def
run():
global
flag,runimage,flag2,nextimage,i,j,choose,num_part,num_list
reset()
while
True
:
for
event
in
pygame.event.get():
if
event.
type
=
=
pygame.QUIT
or
event.
type
=
=
pygame.K_F1:
pygame.quit()
sys.exit()
if
event.
type
=
=
pygame.KEYDOWN:
if
event.key
=
=
pygame.K_ESCAPE:
pygame.quit()
sys.exit()
if
event.key
=
=
pygame.K_SPACE:
if
flag
is
False
:
# FALSE没有切屏 TRUE 切屏
flag
=
True
flag2
=
False
screen.fill((
255
,
255
,
255
))
# 设置背景为白色
if
flag:
if
choose
=
=
6
:
select_rect
=
[]
kk
=
0
while
kk < num_part:
tmp_rect
=
pygame.Rect(kk
*
WIDTH
/
num_part,
0
,WIDTH
/
num_part,HEIGHT)
select_rect.append(runimage.subsurface(tmp_rect).copy())
kk
+
=
1
screen.blit(nextimage, (
0
,
0
))
mm
=
0
for
each
in
zip
(select_rect,num_list):
if
each[
1
]
=
=
1
:
screen.blit(each[
0
], (i
+
mm
*
WIDTH
/
num_part,
-
j))
else
:
screen.blit(each[
0
], (i
+
mm
*
WIDTH
/
num_part, j))
mm
+
=
1
j
+
=
step
if
j >
=
HEIGHT:
flag2
=
True
elif
choose
=
=
7
:
select_rect
=
[]
kk
=
0
while
kk < num_part:
tmp_rect
=
pygame.Rect(
0
,kk
*
HEIGHT
/
num_part,WIDTH,HEIGHT
/
num_part)
select_rect.append(runimage.subsurface(tmp_rect).copy())
kk
+
=
1
screen.blit(nextimage, (
0
,
0
))
mm
=
0
for
each
in
zip
(select_rect,num_list):
if
each[
1
]
=
=
1
:
screen.blit(each[
0
], (
-
i, j
+
mm
*
HEIGHT
/
num_part))
else
:
screen.blit(each[
0
], (i, j
+
mm
*
HEIGHT
/
num_part))
mm
+
=
1
i
+
=
step
if
i >
=
WIDTH:
flag2
=
True
else
:
screen.blit(nextimage, (
0
,
0
))
screen.blit(runimage, (
0
,
0
))
if
flag2:
reset()
fcclock.tick(fps)
pygame.display.flip()
# 刷新窗口
if
__name__
=
=
'__main__'
:
init_image()
run()
|
OK,写完,其实还是蛮有趣的,大家可以自动动手敲敲,也许比我写的更好.
到此这篇关于Python趣味挑战之pygame实现无敌好看的百叶窗动态效果的文章就介绍到这了,更多相关pygame实现百叶窗动态效果内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://blog.csdn.net/dhjabc_1/article/details/117296159 。
最后此篇关于Python趣味挑战之pygame实现无敌好看的百叶窗动态效果的文章就讲到这里了,如果你想了解更多关于Python趣味挑战之pygame实现无敌好看的百叶窗动态效果的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我可以使用 javascript 和其他所有东西,但在重新发明轮子之前,我想知道是否已经有一个类似的 jquery 插件,因为我想使用那个框架而不是 mootools。 我没有钱的问题,特别是 5 欧
我正在 React 应用程序中处理动画。我需要动画在悬停 后开始工作。我尝试了 :hover:after css 但不起作用。将鼠标悬停在图像上后动画可以工作,但我需要在悬停后开始。将鼠标悬停在图像上
我正在使用 jQuery 在按钮单击时实现 slider 效果。我的代码是: $(document).ready(function() { $("#mybutton").click(functio
我需要一个div标签在屏幕右侧滑出,如何使用jQuery获得这种效果?我一直在看这里:http://api.jquery.com/category/effects/sliding/而且这似乎不是我要找
我正在使用此代码实现页面 curl 效果......它在模拟器和设备中工作正常......但它不是(setType:@“pageCurl”)苹果记录的api,这导致它被iPhone拒绝App Stor
我见过各种关于 WPF 效果的引用,但它们似乎是针对位图的,而不是针对文本的。是否可以将除模糊或投影以外的效果应用于XAML中的TextBlock对象? 我想要做的示例可能是轮廓笔划,或斜角/浮雕效果
我见过各种关于 WPF 效果的引用,但它们似乎是针对位图的,而不是针对文本的。是否可以将除模糊或投影以外的效果应用于XAML中的TextBlock对象? 我想要做的示例可能是轮廓笔划,或斜角/浮雕效果
我正在尝试模拟这种效果:http://meyerweb.com/eric/css/edge/complexspiral/demo.html在我的博客上:http://segment6.blogspot
我尝试将样式应用到 Accordion Pane ,但遇到了问题。 这行不通。 accordion.setEffect(new DropShadow(BlurType.ONE_PASS_BOX, Co
关于 Datatables website 的教程足够清楚了: 在我告诉 Datatables 我正在谈论哪一列后,我只需将切换按钮放入: column.visible( ! column.visib
我正在寻找 scratchOut 效果,随便叫它什么。 这是从前景中删除图像的效果,因此背景图像变得可见。 我曾尝试使用 jquery 插件重新创建此效果,但它并不像我希望的那样流畅。 有没有人有这种
本文实例讲述了android实现文字和图片混排(文字环绕图片)效果。分享给大家供大家参考,具体如下: 在平时我们做项目中,或许有要对一张图片或者某一个东西进行文字和图片说明,这时候要求排版美观,所
本文实例讲述了Javafx简单实现【我的电脑资源管理器】效果。分享给大家供大家参考。具体如下: 1. java代码: ?
我是 ngrx 的新手,正在尝试让我的 ngrx 商店的 @Effect 函数正常工作。下面的代码显示了如果我没有使用 ngrx 商店,服务是如何工作的。我首先调用 http.get 来获取列表,然后
基本上我搜索了很多,解决方案建议应用一些 PNG 掩码或不提供所需的解决方案。 我发现了什么。 ffmpeg -i main.mkv -i facecloseup.mkv -filter_compl
有关使用从商店中选择的状态的效果的 Ngrx 文档状态(没有双关语意) Note: For performance reasons, use a flattening operator like co
我有一个数据网格控件,我在其中使用名为 FastShadow 的自定义效果,它就像一个光晕。 我希望效果在其边界之外发光,这样很好,但是当我在顶部绘制另一个形状时,我不希望这个形状受到影响。在本例中,
除了子 div.exception 中的所有内容,我想将 div.main 中的所有文本设为灰色。 div.exception 应该看起来好像类 main 从未添加到父 div。 这可能吗?如果是这样
我有一个 PDF 文件,我想重现此包页面中的页面 curl 效果: https://pub.flutter-io.cn/packages/page_turn 我试过用这个 page_turn插件,它需
我想测试一个效果如下: 如果调度了 LoadEntriesSucces 操作,则效果开始 等待 5 秒 5 秒后发送 http 请求 当响应到达时,将分派(dispatch)新的操作(取决于响应是成功
我是一名优秀的程序员,十分优秀!