261 lines
8.4 KiB
Python
261 lines
8.4 KiB
Python
#!/usr/bin/env python3
|
||
# -*- coding: utf-8 -*-
|
||
|
||
"""
|
||
PANDA3D 中文GUI支持测试
|
||
解决中文字体显示问题的示例
|
||
"""
|
||
|
||
from direct.showbase.ShowBase import ShowBase
|
||
from direct.gui.DirectGui import *
|
||
from direct.gui.OnscreenText import OnscreenText
|
||
from panda3d.core import *
|
||
import os
|
||
|
||
class ChineseGUITest(ShowBase):
|
||
def __init__(self):
|
||
ShowBase.__init__(self)
|
||
|
||
# 设置窗口属性
|
||
wp = WindowProperties()
|
||
wp.setTitle("PANDA3D Chinese GUI Test")
|
||
self.win.requestProperties(wp)
|
||
self.setBackgroundColor(0.1, 0.2, 0.4)
|
||
|
||
# 尝试加载中文字体
|
||
self.chinese_font = self.loadChineseFont()
|
||
|
||
# 创建GUI组件
|
||
self.createGUI()
|
||
|
||
print("="*50)
|
||
print("PANDA3D 中文GUI测试程序启动")
|
||
print(f"中文字体加载状态: {'成功' if self.chinese_font else '失败,使用默认字体'}")
|
||
print("="*50)
|
||
|
||
def loadChineseFont(self):
|
||
"""尝试加载中文字体"""
|
||
# 常见的中文字体路径列表
|
||
font_paths = [
|
||
# Ubuntu/Debian系统的中文字体
|
||
'/usr/share/fonts/truetype/wqy/wqy-microhei.ttc',
|
||
'/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc',
|
||
'/usr/share/fonts/truetype/arphic/ukai.ttc',
|
||
'/usr/share/fonts/truetype/arphic/uming.ttc',
|
||
'/usr/share/fonts/truetype/droid/DroidSansFallbackFull.ttf',
|
||
'/usr/share/fonts/truetype/noto/NotoSansCJK-Regular.ttc',
|
||
'/usr/share/fonts/truetype/liberation/LiberationSans-Regular.ttf',
|
||
# 其他可能的字体路径
|
||
'/System/Library/Fonts/PingFang.ttc', # macOS
|
||
'C:/Windows/Fonts/msyh.ttc', # Windows
|
||
'C:/Windows/Fonts/simhei.ttf', # Windows
|
||
]
|
||
|
||
print("正在尝试加载中文字体...")
|
||
|
||
for font_path in font_paths:
|
||
if os.path.exists(font_path):
|
||
try:
|
||
print(f"尝试加载字体: {font_path}")
|
||
font = self.loader.loadFont(font_path)
|
||
if font:
|
||
print(f"成功加载字体: {font_path}")
|
||
return font
|
||
else:
|
||
print(f"字体文件存在但加载失败: {font_path}")
|
||
except Exception as e:
|
||
print(f"加载字体时出错: {font_path}, 错误: {e}")
|
||
|
||
print("未找到可用的中文字体,将使用默认字体")
|
||
print("如果中文显示为方块,请安装中文字体:")
|
||
print("sudo apt-get install fonts-wqy-microhei fonts-wqy-zenhei")
|
||
return None
|
||
|
||
def createText(self, text, pos, scale=0.06, fg=(1, 1, 1, 1)):
|
||
"""创建文本,优先使用中文字体"""
|
||
if self.chinese_font:
|
||
return OnscreenText(
|
||
text=text,
|
||
pos=pos,
|
||
scale=scale,
|
||
fg=fg,
|
||
align=TextNode.ALeft,
|
||
font=self.chinese_font
|
||
)
|
||
else:
|
||
return OnscreenText(
|
||
text=text,
|
||
pos=pos,
|
||
scale=scale,
|
||
fg=fg,
|
||
align=TextNode.ALeft
|
||
)
|
||
|
||
def createButton(self, text, pos, scale=0.06, command=None, frameColor=(0.5, 0.5, 0.5, 1)):
|
||
"""创建支持中文字体的按钮"""
|
||
return DirectButton(
|
||
text=text,
|
||
pos=pos,
|
||
scale=scale,
|
||
command=command,
|
||
frameColor=frameColor,
|
||
text_fg=(1, 1, 1, 1),
|
||
text_font=self.chinese_font if self.chinese_font else None
|
||
)
|
||
|
||
def createGUI(self):
|
||
"""创建GUI组件"""
|
||
# 标题
|
||
self.title = self.createText(
|
||
"PANDA3D 中文GUI测试",
|
||
(0, 0.85),
|
||
0.08,
|
||
(1, 1, 0, 1)
|
||
)
|
||
self.title.setAlign(TextNode.ACenter)
|
||
|
||
# 说明文本
|
||
self.info = self.createText(
|
||
"这个程序测试中文字体在PANDA3D中的显示效果",
|
||
(-0.95, 0.7),
|
||
0.05,
|
||
(0.8, 0.8, 0.8, 1)
|
||
)
|
||
|
||
# 创建测试按钮 - 支持中文字体
|
||
self.testButton = self.createButton(
|
||
text="Test Button (测试按钮)",
|
||
pos=(-0.6, 0, 0.5),
|
||
scale=0.08,
|
||
command=self.onTestClick,
|
||
frameColor=(0.2, 0.7, 0.2, 1)
|
||
)
|
||
|
||
# 创建标签显示区域
|
||
self.statusLabel = self.createText(
|
||
"状态: 程序就绪",
|
||
(-0.95, 0.3),
|
||
0.06,
|
||
(0, 1, 0, 1)
|
||
)
|
||
|
||
# 创建功能测试区域
|
||
self.createTestArea()
|
||
|
||
# 创建字体信息显示
|
||
self.createFontInfo()
|
||
|
||
# 退出按钮 - 支持中文字体
|
||
self.exitButton = self.createButton(
|
||
text="Exit (退出)",
|
||
pos=(0.7, 0, -0.7),
|
||
scale=0.06,
|
||
command=self.exitProgram,
|
||
frameColor=(0.8, 0.2, 0.2, 1)
|
||
)
|
||
|
||
def createTestArea(self):
|
||
"""创建测试区域"""
|
||
# 中文测试文本
|
||
chinese_texts = [
|
||
"简体中文测试:你好世界!",
|
||
"常用汉字:一二三四五六七八九十",
|
||
"标点符号:,。!?;:""''()",
|
||
"数字混合:2023年12月25日",
|
||
"英中混合:Hello 世界 World 中国"
|
||
]
|
||
|
||
self.test_texts = []
|
||
for i, text in enumerate(chinese_texts):
|
||
text_obj = self.createText(
|
||
text,
|
||
(-0.95, 0.1 - i*0.08),
|
||
0.05,
|
||
(1, 1, 1, 1)
|
||
)
|
||
self.test_texts.append(text_obj)
|
||
|
||
# 计数器
|
||
self.clickCount = 0
|
||
self.counterText = self.createText(
|
||
f"点击次数: {self.clickCount}",
|
||
(-0.95, -0.5),
|
||
0.06,
|
||
(1, 0.5, 0, 1)
|
||
)
|
||
|
||
def createFontInfo(self):
|
||
"""创建字体信息显示"""
|
||
font_status = "已加载中文字体" if self.chinese_font else "使用默认字体"
|
||
|
||
self.fontInfo = self.createText(
|
||
f"字体状态: {font_status}",
|
||
(0.2, 0.7),
|
||
0.05,
|
||
(0.8, 0.8, 0.2, 1)
|
||
)
|
||
|
||
# 显示字体路径信息
|
||
if self.chinese_font:
|
||
# 尝试获取字体信息
|
||
try:
|
||
font_name = self.chinese_font.getName()
|
||
self.fontPath = self.createText(
|
||
f"字体名称: {font_name}",
|
||
(0.2, 0.6),
|
||
0.04,
|
||
(0.6, 0.6, 0.6, 1)
|
||
)
|
||
except:
|
||
self.fontPath = self.createText(
|
||
"字体信息: 无法获取",
|
||
(0.2, 0.6),
|
||
0.04,
|
||
(0.6, 0.6, 0.6, 1)
|
||
)
|
||
else:
|
||
self.fontPath = self.createText(
|
||
"建议安装: fonts-wqy-microhei",
|
||
(0.2, 0.6),
|
||
0.04,
|
||
(1, 0.5, 0.5, 1)
|
||
)
|
||
|
||
def onTestClick(self):
|
||
"""测试按钮点击事件"""
|
||
self.clickCount += 1
|
||
|
||
# 更新状态和计数器
|
||
self.statusLabel.setText(f"状态: 按钮被点击了 {self.clickCount} 次")
|
||
self.counterText.setText(f"点击次数: {self.clickCount}")
|
||
|
||
# 循环变换测试文本
|
||
test_messages = [
|
||
"第一次点击:欢迎使用PANDA3D!",
|
||
"第二次点击:中文显示测试正常",
|
||
"第三次点击:功能运行良好",
|
||
"继续点击:一切正常运行中..."
|
||
]
|
||
|
||
if self.clickCount <= len(test_messages):
|
||
message = test_messages[self.clickCount - 1]
|
||
else:
|
||
message = f"第{self.clickCount}次点击:持续测试中..."
|
||
|
||
# 更新第一行测试文本
|
||
if self.test_texts:
|
||
self.test_texts[0].setText(message)
|
||
|
||
print(f"按钮点击: {self.clickCount} 次, 消息: {message}")
|
||
|
||
def exitProgram(self):
|
||
"""退出程序"""
|
||
print("用户选择退出程序")
|
||
print("再见!Goodbye!")
|
||
self.userExit()
|
||
|
||
if __name__ == "__main__":
|
||
print("启动PANDA3D中文GUI测试程序...")
|
||
print("如果看到方块字符,说明需要安装中文字体")
|
||
app = ChineseGUITest()
|
||
app.run() |