2010年2月17日 星期三

聊天室練習 - VI. GUI

Panda3D提供一些基本2d gui模組,稱做Direct GUI,參考這裡
Login 畫面(LoginFrame.py)是由DirectLabel、DirectEntry、DirectRadioButton、 DirectButton等元件組成,如下圖所示。在需要取得文字輸入之處使用DirectEntry,如輸入使用者暱稱以及輸入server ip 位址。需要多選一之處使用DirectRadioButton,如選擇開啟聊天室或加入。需要取得按鈕動作之處使用DirectButton,如按下 Login按鈕表示以這些輸入資料進行連線動作。而DirectLabel用在表示提示文字。其他gui介紹請參考panda3d網頁。



ChatRoom 畫面(ChatRoomFrame.py)是由DirectEntry、DirectButton與自定義的ScrolledTextFrame組成,如 下圖所示。按鈕Host IP按下後會跳出個對話框,用以顯示server端ip位址。聊天室對話的文字輸入以DirectEntry處理。

顯 示聊天室文字與顯示目前聊天室成員清單,需要可捲動的文字顯示gui,雖然可以由DirectScrolledList內嵌DirectLabel實作, 但處理捲動的部份個人覺得不夠好,因此嘗試以DirectScrolledFrame內嵌OnscreenText來實作。 DirectScrolledFrame的捲動部份比較類似一般在視窗上看到的捲動棒(scrolled bar),而OnscreenText也提供appendText函數用來新增文字。美中不足的,DirectScrolledFrame並不會自動調整 捲動機制以符合內嵌物件大小,因此必須在每次OnscreenText因為新增文字而使大小改變時,重新設定DirectScrolledFrame捲動 大小(ScrolledTextFrame.py,第68行。 ScrolledTextFrame.resetCanvasSizeByTextBoard函數)。其中,mySetCanvasSize函數指向 ScrolledTextFrame.guiItem.setVirtualFrame函數,setVirtualFrame可用來設定 DirectScrolledFrame的內嵌物件大小,以改變捲動棒行為。



Direct GUI功能有限,行為比較複雜的gui元件可嘗試用基本元件組合,例如此練習中的可捲動的文字顯示組合自DirectScrolledFrame與 OnscreenText。另外,有些函數並不直接提供,藏在gui 內部物件的函數中,如DirectScrolledFrame 中用以改變內嵌物件大小的函數setVirtualFrame 藏在其內部物件guiItem 中。因此,翻翻原始碼(py檔)也許可以找到些gui 元件不直接提供的功能。
再者,Direct GUI對於gui元件擺設位置,大小的設定不是很直覺,它是以視窗大小的寬當成1,如像素800x600視窗,大小是(1.333, 1),因此像素300x300的gui 物件大小是(0.5, 0.5)。某些物件的擺設位置(0,0,0) 表示視窗正中央,而某些物件擺設位置的(0,0,0) 卻是相對另外一個物件的相對位置。

除了Direct GUI,也有其他使用者貢獻的gui模組,如TreeGUI,甚至還提供可拖曳的視窗。



----

  1. 操作方式
  2. 程式架構
  3. 網路設定、接收與傳送
  4. Server - Client 間的傳輸協定
  5. 傳輸命令格式
  6. GUI
  7. 中文輸入與顯示
  8. 事件驅動

沒有留言: