EG/demo/simple_gui_test.py
2025-07-02 09:49:59 +08:00

299 lines
8.7 KiB
Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
PANDA3D 简化版GUI功能测试
演示DirectGUI基本组件的使用
"""
from direct.showbase.ShowBase import ShowBase
from direct.gui.DirectGui import *
from direct.gui.OnscreenText import OnscreenText
from panda3d.core import *
class SimpleGUITest(ShowBase):
def __init__(self):
ShowBase.__init__(self)
# 设置窗口属性和背景
wp = WindowProperties()
wp.setTitle("PANDA3D 简化GUI测试")
self.win.requestProperties(wp)
self.setBackgroundColor(0.1, 0.2, 0.4)
# 标题文本
self.title = OnscreenText(
text="PANDA3D DirectGUI 基础测试",
pos=(0, 0.85),
scale=0.08,
fg=(1, 1, 1, 1),
align=TextNode.ACenter
)
# 创建GUI组件
self.setupGUI()
# 尝试加载中文字体
self.chinese_font = self.loadChineseFont()
# 变量用于存储状态
self.clickCount = 0
print("="*50)
print("PANDA3D GUI测试程序启动")
print(f"中文字体加载状态: {'成功' if self.chinese_font else '失败,使用默认字体'}")
print("尝试点击不同的GUI组件来测试功能")
print("="*50)
def setupGUI(self):
"""设置所有GUI组件"""
# 1. 按钮测试
self.createButtons()
# 2. 文本输入框测试
self.createTextEntry()
# 3. 滑块测试
self.createSlider()
# 4. 复选框测试
self.createCheckbox()
# 5. 选项菜单测试
self.createOptionMenu()
# 6. 状态显示
self.createStatusDisplay()
def createButtons(self):
"""创建按钮组件"""
# 主要测试按钮
self.testButton = DirectButton(
text="点击测试",
pos=(-0.6, 0, 0.5),
scale=0.08,
command=self.onTestButtonClick,
frameColor=(0.2, 0.7, 0.2, 1),
text_fg=(1, 1, 1, 1),
text_font=self.chinese_font if self.chinese_font else None
)
# 重置按钮
self.resetButton = DirectButton(
text="重置",
pos=(0, 0, 0.5),
scale=0.08,
command=self.onResetClick,
frameColor=(0.7, 0.7, 0.2, 1),
text_fg=(1, 1, 1, 1),
text_font=self.chinese_font if self.chinese_font else None
)
# 退出按钮
self.exitButton = DirectButton(
text="退出",
pos=(0.6, 0, 0.5),
scale=0.08,
command=self.exitProgram,
frameColor=(0.7, 0.2, 0.2, 1),
text_fg=(1, 1, 1, 1),
text_font=self.chinese_font if self.chinese_font else None
)
def createTextEntry(self):
"""创建文本输入框"""
# 输入框标签
self.entryLabel = DirectLabel(
text="文本输入:",
pos=(-0.8, 0, 0.2),
scale=0.06,
frameColor=(0, 0, 0, 0),
text_fg=(1, 1, 1, 1)
)
# 文本输入框
self.textEntry = DirectEntry(
text="",
pos=(-0.3, 0, 0.2),
scale=0.06,
command=self.onTextSubmit,
initialText="在此输入...",
numLines=1,
width=15,
focus=0
)
def createSlider(self):
"""创建滑块"""
# 滑块标签
self.sliderLabel = DirectLabel(
text="滑块:",
pos=(-0.8, 0, 0),
scale=0.06,
frameColor=(0, 0, 0, 0),
text_fg=(1, 1, 1, 1)
)
# 滑块控件
self.slider = DirectSlider(
range=(0, 100),
value=50,
pos=(-0.2, 0, 0),
scale=0.5,
command=self.onSliderChange,
orientation=DGG.HORIZONTAL
)
# 滑块值显示
self.sliderValueLabel = DirectLabel(
text="值: 50",
pos=(0.4, 0, 0),
scale=0.06,
frameColor=(0, 0, 0, 0),
text_fg=(0, 1, 1, 1)
)
def createCheckbox(self):
"""创建复选框"""
self.checkbox = DirectCheckButton(
text="启用特殊模式",
pos=(-0.6, 0, -0.2),
scale=0.06,
command=self.onCheckboxToggle
)
def createOptionMenu(self):
"""创建选项菜单"""
# 选项菜单标签
self.menuLabel = DirectLabel(
text="选择:",
pos=(-0.8, 0, -0.4),
scale=0.06,
frameColor=(0, 0, 0, 0),
text_fg=(1, 1, 1, 1)
)
# 选项列表
options = ["选项1", "选项2", "选项3", "高级选项"]
self.optionMenu = DirectOptionMenu(
text="请选择",
pos=(-0.3, 0, -0.4),
scale=0.06,
items=options,
initialitem=0,
command=self.onOptionSelect
)
def createStatusDisplay(self):
"""创建状态显示区域"""
# 状态标题
self.statusTitle = DirectLabel(
text="状态信息:",
pos=(-0.95, 0, -0.7),
scale=0.05,
frameColor=(0, 0, 0, 0),
text_fg=(1, 1, 0, 1),
text_align=TextNode.ALeft
)
# 状态显示文本
self.statusText = OnscreenText(
text="程序就绪",
pos=(-0.95, -0.8),
scale=0.05,
fg=(0, 1, 0, 1),
align=TextNode.ALeft
)
# 计数器显示
self.counterText = OnscreenText(
text="点击次数: 0",
pos=(0.5, -0.8),
scale=0.05,
fg=(1, 0.5, 0, 1),
align=TextNode.ALeft
)
# 事件处理函数
def onTestButtonClick(self):
"""测试按钮点击事件"""
self.clickCount += 1
self.updateStatus(f"按钮被点击! 第{self.clickCount}")
self.counterText.setText(f"点击次数: {self.clickCount}")
print(f"测试按钮被点击,当前点击次数: {self.clickCount}")
def onResetClick(self):
"""重置按钮点击事件"""
self.clickCount = 0
self.slider['value'] = 50
self.sliderValueLabel['text'] = "值: 50"
self.textEntry.enterText("")
self.textEntry.set("在此输入...")
self.checkbox['indicatorValue'] = 0
self.optionMenu.set(0)
self.updateStatus("所有设置已重置")
self.counterText.setText("点击次数: 0")
print("界面已重置")
def loadChineseFont(self):
"""尝试加载中文字体"""
import os
font_paths = [
'/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',
]
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 onTextSubmit(self, text):
"""文本提交事件"""
if text.strip():
self.updateStatus(f"输入文本: {text}")
print(f"用户输入: {text}")
else:
self.updateStatus("输入为空")
def onSliderChange(self):
"""滑块变化事件"""
value = int(self.slider['value'])
self.sliderValueLabel['text'] = f"值: {value}"
self.updateStatus(f"滑块值: {value}")
print(f"滑块值变更为: {value}")
def onCheckboxToggle(self, status):
"""复选框切换事件"""
state = "开启" if status else "关闭"
self.updateStatus(f"特殊模式: {state}")
print(f"复选框状态: {state}")
def onOptionSelect(self, selectedOption):
"""选项菜单选择事件"""
self.updateStatus(f"选择: {selectedOption}")
print(f"选项变更为: {selectedOption}")
def updateStatus(self, message):
"""更新状态显示"""
self.statusText.setText(message)
def exitProgram(self):
"""退出程序"""
print("用户点击退出按钮")
print("程序即将关闭...")
self.userExit()
# 程序入口
if __name__ == "__main__":
print("启动PANDA3D GUI测试程序...")
app = SimpleGUITest()
app.run()