使用Python的Raylib 模块制作一个桌面悬浮窗逐行显示文本

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)

  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值