如何在Ursina的DropdownButton中修改字体与文本宽度?
一、修改字体
Ursina的DropdownMenuButton继承自Button,内部文本由Text组件渲染,你可以通过两种方式修改字体:
1. 单个按钮单独设置字体
创建DropdownMenuButton时,直接通过text_kwargs传递font参数,可指定内置字体名称或自定义字体文件路径:
from ursina import * from ursina.prefabs.dropdown_menu import DropdownMenu, DropdownMenuButton app = Ursina() def val_but(txt): print(txt) DropdownMenu(text='File', buttons=( # 用内置'consola'字体,也可传自定义路径如'assets/fonts/my_font.ttf' DropdownMenuButton('New', on_click=lambda: val_but('New'), text_kwargs={'font': 'consola'}), DropdownMenuButton('Open', text_kwargs={'font': 'consola'}), DropdownMenu('Reopen Project', buttons=( DropdownMenuButton('Project 1', text_kwargs={'font': 'consola'}), DropdownMenuButton('Project 2', text_kwargs={'font': 'consola'}), ), text_kwargs={'font': 'consola'}), DropdownMenuButton('Save', text_kwargs={'font': 'consola'}), DropdownMenu('Options', buttons=( DropdownMenuButton('Option a', text_kwargs={'font': 'consola'}), DropdownMenuButton('Option b', text_kwargs={'font': 'consola'}), ), text_kwargs={'font': 'consola'}), DropdownMenuButton('Exit', text_kwargs={'font': 'consola'}), ), scale=(.2,.05), text_origin=(0,0), position=(-.58,.37)) app.run()
2. 自定义子类统一设置字体
如果要给所有下拉按钮统一配置字体,可创建自定义子类避免重复代码:
from ursina import * from ursina.prefabs.dropdown_menu import DropdownMenu, DropdownMenuButton # 自定义下拉按钮类,默认使用指定字体 class CustomDropdownButton(DropdownMenuButton): def __init__(self, text='', **kwargs): super().__init__(text, **kwargs) self.text_entity.font = 'consola' # 替换为目标字体 app = Ursina() def val_but(txt): print(txt) DropdownMenu(text='File', buttons=( CustomDropdownButton('New', on_click=lambda: val_but('New')), CustomDropdownButton('Open'), DropdownMenu('Reopen Project', buttons=( CustomDropdownButton('Project 1'), CustomDropdownButton('Project 2'), ), text_kwargs={'font': 'consola'}), CustomDropdownButton('Save'), DropdownMenu('Options', buttons=( CustomDropdownButton('Option a'), CustomDropdownButton('Option b'), ), text_kwargs={'font': 'consola'}), CustomDropdownButton('Exit'), ), scale=(.2,.05), text_origin=(0,0), position=(-.58,.37)) app.run()
二、调整文本宽度
文本宽度调整分两种场景:自动换行适配按钮,或拉伸/压缩文本显示宽度:
1. 设置文本自动换行
通过text_kwargs传递wrap_width参数,文本长度超过指定值时自动换行:
# 根据按钮scale调整wrap_width数值,确保文本在按钮内换行 DropdownMenuButton('Long Text Example', text_kwargs={'wrap_width': 0.15})
2. 拉伸/压缩文本显示宽度
可修改文本实体的scale_x或直接设置width属性:
# 方式1:创建时通过text_kwargs设置横向拉伸 DropdownMenuButton('Stretched Text', text_kwargs={'scale_x': 1.5}) # 方式2:在自定义子类中全局修改 class CustomDropdownButton(DropdownMenuButton): def __init__(self, text='', **kwargs): super().__init__(text, **kwargs) self.text_entity.scale_x = 1.5 # 横向拉伸文本 # 也可设置固定宽度:self.text_entity.width = 0.2
3. 调整按钮本身宽度
若要让按钮适配文本长度,可修改DropdownMenuButton的scale_x或width:
# 增大按钮宽度以适配长文本 DropdownMenuButton('Wide Button', scale=(0.3, 0.05))
注意点
- 你的代码中
on_click = val_but('New')会在初始化时直接执行函数,需改成on_click=lambda: val_but('New')才能实现点击触发。 - 使用自定义字体时,需确保字体文件路径正确,Ursina默认优先从项目根目录的
assets/fonts文件夹查找。
内容的提问来源于stack exchange,提问作者EMILIO
相关产品推荐
相关产品推荐

