Skip to content

Commit bf269c0

Browse files
committed
finish douyin_biaobai programmer
1 parent 043ceba commit bf269c0

File tree

8 files changed

+295
-0
lines changed

8 files changed

+295
-0
lines changed
+160
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
# python实现抖音表白神器
2+
3+
国庆节快要到了,7天大长假大家准备去哪里玩呢?宅在家里打游戏?还是和女朋友出去浪啊?
4+
5+
什么,你说你没有女朋友?
6+
7+
当时我就不乐意了,马上用python写了一个抖音表白神器,快拿去表白吧。
8+
9+
### 演示环境
10+
* 操作系统:windows10
11+
* python版本:python 3.7
12+
* 代码编辑器:pycharm 2018.2
13+
* 使用模块:pygame, random
14+
* tips: pygame需要单独安装,pip install 一下就好了
15+
16+
### 具体实现
17+
18+
1. 首先我们得放一张可爱的图片上去是吧.
19+
```python
20+
import pygame
21+
22+
def main():
23+
# 初始化pygame
24+
pygame.init()
25+
26+
# 规定窗口的大小
27+
size = 300, 480
28+
# 得到一这个窗口
29+
screen = pygame.display.set_mode(size)
30+
# 设置窗口的标题
31+
pygame.display.set_caption('表白神器')
32+
33+
# 加载图片
34+
image = pygame.image.load('./images/biaobai.png').convert_alpha()
35+
# 得到图片的尺寸
36+
image_size = image.get_size()
37+
38+
# 计算图片的放置位置, 在窗口中间
39+
position_x = (size[0]-image_size[0]) / 2
40+
position_y = (size[1]-image_size[1]) / 2
41+
42+
while True:
43+
# 遍历所有的事件
44+
for event in pygame.event.get():
45+
# 如果点击关闭窗口, 程序结束
46+
if event.type == pygame.QUIT:
47+
pygame.quit()
48+
exit(0)
49+
50+
# 填充整个窗口为白色
51+
screen.fill((255,255,255))
52+
# 将图片绘制到窗口中
53+
screen.blit(image, (position_x, position_y))
54+
# 刷新页面内容
55+
pygame.display.update()
56+
```
57+
58+
![小姐姐](images/1.png)
59+
60+
这样,我们就将一张图片放到窗口的中间位置了。
61+
62+
2. 绘制按钮
63+
64+
光有图片还不够,我们还得增加按钮来让小姐姐点击是吧。
65+
66+
所以我们编写一个绘制按钮的函数
67+
```python
68+
def draw_button(screen, text, position):
69+
'''
70+
绘制文本按钮
71+
:param screen: 绘制在哪一个屏幕上
72+
:param text: 绘制的文本
73+
:param position: 绘制的位置
74+
:return: 返回一个4个元素的元祖,即button的开始位置,结束位置
75+
'''
76+
# 得到系统文件中的 '华文中宋' 字体, 设置字体大小为30px
77+
font = pygame.font.SysFont('华文中宋', 30)
78+
# 得到一个pygame.Surface对象, 绘制的时候需要这个对象
79+
# text:绘制的文本
80+
# antialias: True or False 是否为锯齿状
81+
# color: 字体颜色
82+
# background:背景颜色
83+
button = font.render(text, True, (0,0,0),(96,96,96))
84+
# 得到button的大小,width和height,返回的是一个两个元素的元祖
85+
button_size = button.get_size()
86+
# 在position位置处绘制button, position是一个两个元素的元祖, button是一个pygame.Surface对象
87+
screen.blit(button, position)
88+
# 返回一个4个元素的元祖,即button的开始位置,结束位置
89+
return (position[0], position[1], position[0]+button_size[0], position[1]+button_size[1])
90+
```
91+
92+
这里说一下怎样查看系统中可用的字体文件吧。
93+
```python
94+
pygame.font.get_fonts()
95+
```
96+
上面这个函数就能够得到系统中所有的字体文件的名字,需要注意的是,如果我们要写中文,那么选取的字体文件也要支持中文才行,否则的话会出现乱码。
97+
98+
上面这个函数我们还返回了一个4个元素的元祖,主要是为了后面我们判断鼠标点击位置的时候使用的。
99+
100+
我们先来看一下展示效果吧
101+
102+
![小姐姐](images/2.png)
103+
104+
3. 接下来我们就需要给按钮增加点击事件了
105+
```python
106+
def mouse_click_event():# 初始化pygame
107+
pygame.init()
108+
109+
# 规定窗口的大小
110+
size = 300, 480
111+
# 得到一这个窗口
112+
screen = pygame.display.set_mode(size)
113+
# 设置窗口的标题
114+
pygame.display.set_caption('表白神器')
115+
116+
# 加载图片
117+
image = pygame.image.load('./images/biaobai.png').convert_alpha()
118+
# 得到图片的尺寸
119+
image_size = image.get_size()
120+
121+
# 计算图片的放置位置, 在窗口中间
122+
position_x = (size[0] - image_size[0]) / 2
123+
position_y = (size[1] - image_size[1]) / 2
124+
125+
while True:
126+
# 遍历所有的事件
127+
for event in pygame.event.get():
128+
# 如果点击关闭窗口, 程序结束
129+
if event.type == pygame.QUIT:
130+
pygame.quit()
131+
exit(0)
132+
133+
# 监听鼠标单击事件
134+
if event.type == pygame.MOUSEBUTTONDOWN:
135+
# 得到鼠标点击位置
136+
click_position = pygame.mouse.get_pos()
137+
print(click_position)
138+
139+
# 填充整个窗口为白色
140+
screen.fill((255, 255, 255))
141+
# 将图片绘制到窗口中
142+
screen.blit(image, (position_x, position_y))
143+
# 刷新页面内容
144+
pygame.display.update()
145+
```
146+
147+
pygame.MOUSEBUTTONDOWN就是鼠标点击事件,当我们监听到鼠标点击的时候,我们就使用pygame.mouse.get_pos()来获取鼠标的位置。
148+
149+
这里我们只是打印一下鼠标位置就可以了,主要是让大家明白怎样监听鼠标点击事件。
150+
151+
完整代码请查看github ``
152+
153+
最后附上效果图片
154+
![](images/2.png)
155+
![](images/3.png)
156+
![](images/4.png)
157+
158+
159+
160+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
import pygame
2+
import random
3+
4+
def draw_button(screen, text, position, right=False):
5+
'''
6+
绘制文本按钮
7+
:param screen: 绘制在哪一个屏幕上
8+
:param text: 绘制的文本
9+
:param position: 绘制的位置
10+
:param right: 是否为右边
11+
:return: 返回一个4个元素的元祖,即button的开始位置,结束位置
12+
'''
13+
# 得到系统文件中的 '华文中宋' 字体, 设置字体大小为30px
14+
font = pygame.font.SysFont('华文中宋', 30)
15+
# 得到一个pygame.Surface对象, 绘制的时候需要这个对象
16+
# text:绘制的文本
17+
# antialias: True or False 是否为锯齿状
18+
# color: 字体颜色
19+
# background:背景颜色
20+
button = font.render(text, True, (0,0,0),(96,96,96))
21+
# 得到button的大小,width和height,返回的是一个两个元素的元祖
22+
button_size = button.get_size()
23+
# 如果right=Ture, 表示是绘制在右边的button,就让它的位置和背景图右对齐
24+
if right:
25+
position = position[0]-button_size[0], position[1]
26+
# 在position位置处绘制button, position是一个两个元素的元祖, button是一个pygame.Surface对象
27+
screen.blit(button, position)
28+
# 返回一个4个元素的元祖,即button的开始位置,结束位置
29+
return (position[0], position[1], position[0]+button_size[0], position[1]+button_size[1])
30+
31+
def position_is_in_rect(position, rect):
32+
'''
33+
检查position是否在一个矩形内区域内,
34+
:param position: 需要判断的position
35+
:param rect: 在哪一个矩形区域内?
36+
:return: True or False
37+
'''
38+
if position[0] >= rect[0] and position[0] <= rect[2]:
39+
if position[1] >= rect[1] and position[1] <= rect[3]:
40+
return True
41+
return False
42+
43+
def get_random_position(size=(300, 480)):
44+
'''
45+
得到随机位置
46+
:param size: 窗口的大小
47+
:return: 返回一个两个元素的元祖
48+
'''
49+
x = random.randint(0, size[0])
50+
y = random.randint(0, size[1]-50)
51+
return x, y
52+
53+
def main():
54+
# 初始化pygame
55+
pygame.init()
56+
57+
# 规定窗口的大小
58+
size = 300, 480
59+
# 得到一这个窗口
60+
screen = pygame.display.set_mode(size)
61+
# 设置窗口的标题
62+
pygame.display.set_caption('表白神器')
63+
64+
# 加载图片
65+
image = pygame.image.load('./images/biaobai.png').convert_alpha()
66+
# 得到图片的尺寸
67+
image_size = image.get_size()
68+
69+
# 计算图片的放置位置, 在窗口中间
70+
position_x = (size[0]-image_size[0]) / 2
71+
position_y = (size[1]-image_size[1]) / 2
72+
73+
# 存放所有的button的位置
74+
buttons_position = {}
75+
# 是否点击 yes按钮了
76+
yes = False
77+
# 是否改变否定按钮的位置
78+
change_position = False
79+
# 随机位置
80+
random_position = None
81+
82+
while True:
83+
# 遍历所有的事件
84+
for event in pygame.event.get():
85+
# 如果点击关闭窗口, 程序结束
86+
if event.type == pygame.QUIT:
87+
pygame.quit()
88+
exit(0)
89+
90+
# 鼠标点击事件
91+
if event.type == pygame.MOUSEBUTTONDOWN:
92+
# 得到鼠标点击位置
93+
click_position = pygame.mouse.get_pos()
94+
# 调用这个函数判断点击位置是否在yes按钮范围内
95+
if position_is_in_rect(click_position, buttons_position['yes']):
96+
# 加载另外一张图片
97+
image = pygame.image.load('./images/yes.jpg').convert_alpha()
98+
# 修改yes变量为True
99+
yes = True
100+
# 判断点击位置时候在no按钮区域内
101+
elif position_is_in_rect(click_position, buttons_position['no']):
102+
# 死循环
103+
while True:
104+
# 得到随机位置
105+
random_position = get_random_position()
106+
# 如果随机位置不在yes按钮内,退出死循环
107+
if not position_is_in_rect(random_position, buttons_position['yes']):
108+
break
109+
# 修改change_position变量为True
110+
change_position = True
111+
112+
# 填充整个窗口为白色
113+
screen.fill((255,255,255))
114+
# 将图片绘制到窗口中
115+
screen.blit(image, (position_x, position_y))
116+
117+
# 如果没有点击yes按钮
118+
if not yes:
119+
# 绘制yes按钮
120+
yes_rect_region = draw_button(screen, '好的', (position_x, position_y + image_size[1] + 10))
121+
# 如果change_position为True,说明需要开始随机获取no按钮的位置
122+
# 绘制no按钮
123+
if change_position:
124+
no_rect_region = draw_button(screen, '考虑一下', random_position)
125+
else:
126+
no_rect_region = draw_button(screen, '考虑一下', (position_x + image_size[0], position_y + image_size[1] + 10), right=True)
127+
# 将yes按钮和no按钮的所在区域(一个4各元素的元祖,也就是矩阵)存放到buttons_position字典中
128+
buttons_position['yes'] = yes_rect_region
129+
buttons_position['no'] = no_rect_region
130+
131+
# 刷新页面内容
132+
pygame.display.update()
133+
134+
if __name__ == '__main__':
135+
main()
55.2 KB
Loading
59.8 KB
Loading
59.9 KB
Loading
66.4 KB
Loading
Loading
9.04 KB
Loading

0 commit comments

Comments
 (0)