2010年10月5日 星期二

在視窗中嵌入shell介面

shell介面可以以文字形式,以直接鍵入函數與參數的方式控制應用程式,甚至執行一段script。

wxPython提供一個shell的應用程式,稱做PyShell,可以在
Python26\Lib\site-packages\wx-2.8-msw-unicode\wx\py目錄下
執行PyShell.py。

目錄下的shell.py中的Shell類別是此shell程式的核心,放到應用程式中即是一個現成的shell介面。此shell介面還支援自動完成與函數提示。


以下是簡單的嵌入範例,將Shell類別置入一個wx.Panel中。
"""
ShellPanel provides a shell interface in a panel.

# put shell in a frame
self.myShellPanel = ShellPanel(objDict = {'win':self}, parent = self)
"""

import wx
import wx.py as  py

class ShellPanel(wx.Panel):
    def __init__(self, objDict, *args, **kwds):
        """\
ShellPanel(objectDict, parent, ...)
    Create a Shell panel and put some object into this shell;
    Assign "myHelpInfo" object for default help text."""
        # format of objdict: { Name:object }

        kwds["style"] = wx.TAB_TRAVERSAL
        wx.Panel.__init__(self, *args, **kwds)

        self.objectDict = objDict
        self.myShell = py.shell.Shell(self, -1, locals = self.objectDict )

        sizer_Shell = wx.BoxSizer(wx.HORIZONTAL)
        sizer_Shell.Add(self.myShell, 1, wx.EXPAND, 0)
        self.SetSizer(sizer_Shell)

self.myShell = py.shell.Shell(self, -1, locals = objDict)
參數locals接收一個{名稱字串:物件}的字典,可將物件以對應的名稱字串在shell介面中操作。如果將應用程式(視窗)本身傳入,即可在shell介面中控制視窗,如上例將視窗物件以"win"命名,並在shell介面下輸入"win.SetTitle('Hello World')",便可改變視窗Title顯示。

此shell介面比起python內建的IDLE仍有些缺點。如下程式碼:
from time import sleep
for i in range(10): sleep(1)
無法如同在IDLE中,以鍵盤方式中斷。
(參考網頁:命令行的 Python shell 保留了處理鍵盤中斷( Ctrl +C)的能力...)

更多的Shell類別建構參數使用,請參考shell.py原始碼。

沒有留言: