#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 简单的2D GUI测试 基于ShowBase直接测试2D GUI组件显示 """ import warnings warnings.filterwarnings("ignore", category=DeprecationWarning) from direct.showbase.ShowBase import ShowBase from direct.gui.DirectGui import * from panda3d.core import * import os class SimpleGUITest(ShowBase): def __init__(self): ShowBase.__init__(self) # 设置背景色 self.setBackgroundColor(0.2, 0.2, 0.3) # 尝试加载中文字体 self.chinese_font = self.loadChineseFont() # 创建测试GUI元素 self.createTestGUI() print("简单GUI测试启动成功!") print(f"中文字体加载状态: {'成功' if self.chinese_font else '失败,使用默认字体'}") def loadChineseFont(self): """尝试加载中文字体""" font_paths = [ '/usr/share/fonts/truetype/wqy/wqy-microhei.ttc', '/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc' ] for font_path in font_paths: if os.path.exists(font_path): try: font = self.loader.loadFont(font_path) if font: return font except: continue return None def createTestGUI(self): """创建测试GUI元素""" print("\n=== 创建2D GUI测试元素 ===") # 标题 self.title = OnscreenText( text="2D GUI 修复测试", pos=(0, 0.9), scale=0.08, fg=(1, 1, 1, 1), align=TextNode.ACenter, font=self.chinese_font if self.chinese_font else None ) # 测试修复后的坐标转换 test_positions = [ ("中心", (0, 0, 0)), ("左侧", (-5, 0, 0)), ("右侧", (5, 0, 0)), ("上方", (0, 0, 5)), ("下方", (0, 0, -5)) ] self.buttons = [] self.labels = [] for i, (name, logical_pos) in enumerate(test_positions): # 应用修复后的坐标转换 screen_pos = (logical_pos[0] * 0.1, 0, logical_pos[2] * 0.1) print(f"创建 {name} GUI元素:") print(f" 逻辑坐标: {logical_pos}") print(f" 屏幕坐标: {screen_pos}") # 创建按钮 button = DirectButton( text=f"{name}按钮", pos=screen_pos, scale=0.08, command=self.onButtonClick, extraArgs=[name], frameColor=(0.2, 0.6, 0.8, 1), text_font=self.chinese_font if self.chinese_font else None, rolloverSound=None, clickSound=None ) self.buttons.append(button) # 创建标签(偏移位置) label_pos = (screen_pos[0], 0, screen_pos[2] - 0.15) label = DirectLabel( text=f"{name}标签", pos=label_pos, scale=0.06, frameColor=(0, 0, 0, 0), text_fg=(1, 1, 0, 1), text_font=self.chinese_font if self.chinese_font else None ) self.labels.append(label) print(f" 按钮已创建在: {screen_pos}") print(f" 标签已创建在: {label_pos}") # 创建输入框 self.entry = DirectEntry( text="", pos=(0, 0, -0.7), scale=0.06, command=self.onEntrySubmit, initialText="测试输入框", numLines=1, width=15, focus=0 ) print(f"输入框已创建在: (0, 0, -0.7)") # 创建退出按钮 self.exitButton = DirectButton( text="退出测试", pos=(0, 0, -0.85), scale=0.06, command=self.exitTest, frameColor=(0.8, 0.2, 0.2, 1), text_font=self.chinese_font if self.chinese_font else None ) # 状态信息 self.statusText = OnscreenText( text="如果你能看到5个按钮和5个标签,说明2D GUI修复成功!", pos=(0, -0.95), scale=0.04, fg=(0, 1, 0, 1), align=TextNode.ACenter, font=self.chinese_font if self.chinese_font else None ) print("=== 所有GUI元素创建完成 ===") print("如果修复成功,你应该看到:") print("- 5个不同位置的按钮(中心、左侧、右侧、上方、下方)") print("- 5个对应的标签") print("- 1个输入框") print("- 1个退出按钮") def onButtonClick(self, name): """按钮点击事件""" print(f"✓ 按钮点击测试成功: {name}") self.statusText.setText(f"点击了 {name} 按钮 - 测试成功!") def onEntrySubmit(self, text): """输入框提交事件""" print(f"✓ 输入框测试成功: {text}") self.statusText.setText(f"输入框内容: {text}") def exitTest(self): """退出测试""" print("退出简单GUI测试") self.userExit() if __name__ == "__main__": print("启动简单2D GUI测试...") print("这个测试使用ShowBase基类,应该能正确显示2D GUI组件") app = SimpleGUITest() app.run()