Raylib 5.0的Python静态绑定详见:Raylib 5.0 的Python静态绑定(显示中文)-CSDN博客
突发奇想,可以使用Raylib在桌面制作一个桌面悬浮窗,逐行显示文本学习英语^_^。初步代码如下:
# -*- coding: UTF-8 -*-
import pyray as pr
import time
Englishfile = open("E:\\Python_Program\\flywords\\English_Phrase-8.txt",'r',encoding='utf-8')
lineslist = Englishfile.readlines()
lines = len(lineslist)
shownum = 0
start_time = time.time()
#pr.set_config_flags(pr.FLAG_WINDOW_TRANSPARENT|pr.FLAG_WINDOW_RESIZABLE)
pr.set_config_flags(pr.FLAG_WINDOW_TRANSPARENT|pr.FLAG_WINDOW_RESIZABLE|pr.FLAG_WINDOW_TOPMOST)
pr.init_window(1500, 80, "我爱背单词")
pr.set_target_fps(60)
pr.set_window_position(0,5)
#加载字体文件,9753388为文件大小(字节)
fontfiledata = pr.load_file_data("c:\\windows\\fonts\\simhei.ttf",9753388)
text = "YislWll"
CLEAR = [0] * 4
HCLEAR = [50] * 4
transform =pr.matrix_rotate(pr.Vector3(1,1,1), 60)
'pyray.matrix_rotate(Vector3_0: Vector3, float_1: float)'
mesh = pr.gen_mesh_cube(10,10,10)
'pyray.gen_mesh_cube(width: float, height: float, length: float)'
camera = pr.Camera3D([10.0, 10.0, 10.0], [0.0,0.0, 0.0], [0.0, 1.0, 0.0], 60.0, pr.CAMERA_PERSPECTIVE)
'''
pyray.Camera3D(position, target, up, fovy, projection)
camera.position = (Vector3){ 40.0f, 20.0f, 0.0f }; //相机所在位置{x,y,z}
camera.target = (Vector3){ 0.0f, 0.0f, 0.0f }; //相机朝向目标点的位置{x,y,z}
camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; //相机正上方朝向矢量
camera.fovy = 70.0f; //相机视野宽度
camera.projection = pr.CAMERA_PERSPECTIVE; //采用透视投影
'''
#codepointCount,码点数,一个UTF-8汉字两个码点数
codepointsCount = 256
#text_zh = u"我是中国人!"
colorHue = 0
while not pr.window_should_close():
text_zh = lineslist[shownum]
#加载字符串的码点表
codepoints = pr.load_codepoints(text_zh,codepointsCount)
#pyray.load_font_from_memory(fileType: str, fileData: str, dataSize: int, fontSize: int, codepoints: Any, codepointCount: int)
font = pr.load_font_from_memory('.ttf',fontfiledata,9753388,32, codepoints, codepointsCount)
pr.update_camera(camera, pr.CAMERA_ORBITAL)
pr.begin_drawing()
pr.clear_background(CLEAR)
pr.begin_mode_3d(camera)
#pr.draw_cube(pr.Vector3(0,0,0),10,10,10,pr.VIOLET)
pr.draw_cube_wires(pr.Vector3(0,0,0),10,10,10,pr.LIGHTGRAY)
pr.draw_grid(30, 0.5)
colorHue+=1
#对360求余数
colorHue%=360
material = pr.load_material_default()
checked = pr.gen_image_checked(2,2,1,1,pr.color_from_hsv(colorHue,1,1),pr.color_from_hsv(360-colorHue,1,1));
texture = pr.load_texture_from_image(checked)
material.maps[pr.MATERIAL_MAP_DIFFUSE].texture = texture
pr.draw_mesh(mesh,material,transform)
#卸载纹理,否则会导致内存消耗持续增加
pr.unload_texture(texture)
pr.end_mode_3d()
#pyray.draw_text_ex(font: Font, text: str, position: Vector2, fontSize: float, spacing: float, tint: Color)
pr.draw_text_ex(font, text_zh, pr.Vector2(50, 15), 32, 2, pr.RED)
#pyray.draw_text(text: str, posX: int, posY: int, fontSize: int, color: Color)
pr.draw_text(text, 1400, 0, 30, pr.VIOLET)
pr.end_drawing()
if time.time()-start_time >= 5:
start_time = time.time()
if int(shownum) == int(lines -1):
shownum = 0
else:
shownum += 1
print(shownum)
#卸载加载项,否则会导致内存消耗持续增加
pr.unload_font(font)
pr.unload_codepoints(codepoints)
pr.close_window()
pr.unload_file_data(fontfiledata)
Englishfile.close()
桌面效果如下:
前面的代码把pyray.load_font_from_memory和pyray.unload_font(font)放在了窗口while循环内,频繁加载和卸载字体,导致CPU占用偏高,还会出现莫名其妙的闪退。所以修改程序,在窗口while循环外再嵌套一个while循环,把pyray.load_font_from_memory 和 pyray.unload_font(font)放在该循环内,利用计时器和变量changeitem,每5秒钟中断窗口while循环一次,让外面的while循环运行一次,这样有效降低了CPU占用,无缘无故闪退的问题没再出现。
同时将文本文件读写放在外循环,一次读取一行,避免一次加载占用过多内存。
修改后的具体代码如下:
# -*- coding: UTF-8 -*-
import pyray as pr
import time
file_path = "E:\\Python_Program\\flywords\\English_Phrase-8.txt"
#统计文件总行数
Englishfile = open(file_path,'r',encoding='utf-8')
linenums = 0
for line in Englishfile:
linenums += 1
Englishfile.close()
#读取文件的某一行
def read_one_line(file_path, line_num, linenums):
if line_num >= linenums:
line_num = 1
with open(file_path, 'r', encoding='utf-8') as file:
for current_line, text_zh in enumerate(file, start=1):
if current_line == line_num:
return text_zh
#pr.set_config_flags(pr.FLAG_WINDOW_TRANSPARENT|pr.FLAG_WINDOW_RESIZABLE)
pr.set_config_flags(pr.FLAG_WINDOW_TRANSPARENT|pr.FLAG_WINDOW_RESIZABLE|pr.FLAG_WINDOW_TOPMOST)
pr.init_window(1500, 80, "我爱背单词")
pr.set_target_fps(60)
pr.set_window_position(0,5)
#加载字体文件,9753388为文件大小(字节)
fontfiledata = pr.load_file_data("c:\\windows\\fonts\\simhei.ttf",9753388)
text = "YislWll"
CLEAR = [0] * 4
HCLEAR = [50] * 4
transform =pr.matrix_rotate(pr.Vector3(1,1,1), 60)
'pyray.matrix_rotate(Vector3_0: Vector3, float_1: float)'
mesh = pr.gen_mesh_cube(10,10,10)
'pyray.gen_mesh_cube(width: float, height: float, length: float)'
camera = pr.Camera3D([10.0, 10.0, 10.0], [0.0,0.0, 0.0], [0.0, 1.0, 0.0], 60.0, pr.CAMERA_PERSPECTIVE)
'''
pyray.Camera3D(position, target, up, fovy, projection)
camera.position = (Vector3){ 40.0f, 20.0f, 0.0f }; //相机所在位置{x,y,z}
camera.target = (Vector3){ 0.0f, 0.0f, 0.0f }; //相机朝向目标点的位置{x,y,z}
camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; //相机正上方朝向矢量
camera.fovy = 70.0f; //相机视野宽度
camera.projection = pr.CAMERA_PERSPECTIVE; //采用透视投影
'''
#codepointCount,码点数,一个UTF-8汉字两个码点数
codepointsCount = 256
#text_zh = u"我是中国人!"
colorHue = 0
material = pr.load_material_default()
changeitem = False
shownum = 1
start_time = time.time()
while True and (not pr.window_should_close()):
text_zh = read_one_line(file_path, shownum, linenums)
changeitem = False
#加载字符串的码点表
codepoints = pr.load_codepoints(text_zh,codepointsCount)
#pyray.load_font_from_memory(fileType: str, fileData: str, dataSize: int, fontSize: int, codepoints: Any, codepointCount: int)
font = pr.load_font_from_memory('.ttf',fontfiledata,9753388,32, codepoints, codepointsCount)
while (not changeitem) and (not pr.window_should_close()):
pr.update_camera(camera, pr.CAMERA_ORBITAL)
pr.begin_drawing()
pr.clear_background(CLEAR)
pr.begin_mode_3d(camera)
#pr.draw_cube(pr.Vector3(0,0,0),10,10,10,pr.VIOLET)
pr.draw_cube_wires(pr.Vector3(0,0,0),10,10,10,pr.LIGHTGRAY)
pr.draw_grid(30, 0.5)
colorHue+=1
#对360求余数
colorHue%=360
checked = pr.gen_image_checked(2,2,1,1,pr.color_from_hsv(colorHue,1,1),pr.color_from_hsv(360-colorHue,1,1));
texture = pr.load_texture_from_image(checked)
material.maps[pr.MATERIAL_MAP_DIFFUSE].texture = texture
pr.draw_mesh(mesh,material,transform)
#卸载纹理,否则会导致内存消耗持续增加
pr.unload_texture(texture)
pr.end_mode_3d()
#pyray.draw_text_ex(font: Font, text: str, position: Vector2, fontSize: float, spacing: float, tint: Color)
pr.draw_text_ex(font, text_zh, pr.Vector2(50, 15), 32, 2, pr.RED)
#pyray.draw_text(text: str, posX: int, posY: int, fontSize: int, color: Color)
pr.draw_text(text, 1400, 0, 30, pr.VIOLET)
pr.end_drawing()
if colorHue >= 4294967295:
colorHue = 0
if time.time()-start_time >= 5:
changeitem = True
start_time = time.time()
if int(shownum) == int(linenums):
shownum = 1
else:
shownum += 1
#卸载加载项,否则会导致内存消耗持续增加
pr.unload_font(font)
pr.unload_codepoints(codepoints)
pr.close_window()
pr.unload_file_data(fontfiledata)