目次

インタプリタソースコード(Python)

 PythonでGUIを扱う場合、フレームワークが必要です。

 Python用フレームワークとして、Tkinterを利用。

 Tkinterを利用すると、GUI画面のオブジェクトをTcl/Tkと
 同じコマンドで操作できます。

button .btnRun -text "Run" -command "xrun" -width 12 -bg green

     ↓

Button(btnRun,text = 'Run',command = lambda : xrun(),width = 12,bg = green)

 Tcl/Tkのコマンド名とPythonのTkinterで使うメソッド名が
 同じなので、オブジェクト名を指定し、固有のプロパティを
 続けると機械的に変換可能。

 Tkinterに関係するライブラリは、Pinguinoの開発環境を
 インストールしたときに、同時にダウンロードされて
 パスを通されていました。

 GUIのテストに最初に利用したPythonスクリプトは、以下。

import Tkinter as Tk

tla = Tk.Label(None, text = 'Hello World!', font = ('Times', '20') )
tla.pack()
tla.mainloop()

 ダブルクリックすると、次のようなイメージが表示されます。



 Tkinterで利用できるwidgetに、どんなものがあるかを
 確認してみます。

 Basicインタプリタのシミュレータ画面で、どんな
 GUIのwidgetが使われているかをチェックします。



 ボタンは6種あり、オブジェクトで指定すると以下。

 これらのオブジェクトの生成は、次のPythonコードでよいはず。


#! /usr/bin/env python

import Tkinter as Tk

class Frame(Tk.Frame):
  """ Basic Interpreter """

  def __init__(self, master=None): 
    Tk.Frame.__init__(self,master)
    self.master.title('Basic interpreter')

    btnLoad   = Tk.Button(self, text = 'Load'  )
    btnSave   = Tk.Button(self, text = 'Save'  )
    btnRun    = Tk.Button(self, text = 'Run'   )
    btnStep   = Tk.Button(self, text = 'Step'  )
    btnCancel = Tk.Button(self, text = 'Cancel')
    btnExit   = Tk.Button(self, text = 'Exit'  )

if __name__ == '__main__':
  f = Frame()
  f.pack()
  f.mainloop()


 オブジェクトの位置指定はgridを使えばよいので
 Tcl/Tkのスクリプトから切り出して、配置することに。

 AWKスクリプトで生成します。スクリプトは、以下。

{
  if ( $1 == "grid" ) {
    xobj = substr($2,2)
    # sticky
    if ( $7 == "-sticky" ) {
      printf("%s.grid(column = %d , row = %d , sticky = %s)\n",xobj,$4,$6,$8)
    } else {
      printf("%s.grid(column = %d , row = %d)\n",xobj,$4,$6)
    }
  }
}

 Tcl/Tkでは、gridコマンドで指定してあるので
 スクリプトから、変換できます。

 元のスクリプト内容は、以下。

grid .lblFileName -column 1 -row 0
grid .lblCode     -column 0 -row 2

grid .lblInputs  -column 3 -row 4
grid .entInputs  -column 4 -row 4

grid .lblOutputs  -column 3 -row 6
grid .lblOutputsV -column 4 -row 6

grid .lsbCode -column 1 -row 2
grid .sv      -column 2 -row 2 -sticky ns
grid .sh      -column 1 -row 3 -sticky ew

grid .lblBeginLine     -column 1 -row 4
grid .entBeginLine     -column 1 -row 5
grid .lblCurrentLine   -column 1 -row 6
grid .lblCurrentResult -column 1 -row 7

grid .entFileName -column 1 -row 1

grid .btnLoad   -column 4 -row 0
grid .btnSave   -column 4 -row 1
grid .btnRun    -column 0 -row 4
grid .btnStep   -column 0 -row 5
grid .btnCancel -column 0 -row 6
grid .btnExit   -column 4 -row 9

 変換すると、次のようになります。

lblFileName.grid(column = 1 , row = 0)
lblCode.grid(column = 0 , row = 2)
lblInputs.grid(column = 3 , row = 4)
entInputs.grid(column = 4 , row = 4)
lblOutputs.grid(column = 3 , row = 6)
lblOutputsV.grid(column = 4 , row = 6)
lsbCode.grid(column = 1 , row = 2)
sv.grid(column = 2 , row = 2 , sticky = ns)
sh.grid(column = 1 , row = 3 , sticky = ew)
lblBeginLine.grid(column = 1 , row = 4)
entBeginLine.grid(column = 1 , row = 5)
lblCurrentLine.grid(column = 1 , row = 6)
lblCurrentResult.grid(column = 1 , row = 7)
entFileName.grid(column = 1 , row = 1)
btnLoad.grid(column = 4 , row = 0)
btnSave.grid(column = 4 , row = 1)
btnRun.grid(column = 0 , row = 4)
btnStep.grid(column = 0 , row = 5)
btnCancel.grid(column = 0 , row = 6)
btnExit.grid(column = 4 , row = 9)

 gridで配置を決めると、Pythonスクリプトは以下となります。

#! /usr/bin/env python

import Tkinter as Tk

class Frame(Tk.Frame):
  """ Basic Interpreter """

  def __init__(self, master=None): 
    Tk.Frame.__init__(self,master)
    self.master.title('Basic interpreter')

    btnLoad   = Tk.Button(self, text = 'Load'  )
    btnSave   = Tk.Button(self, text = 'Save'  )
    btnRun    = Tk.Button(self, text = 'Run'   )
    btnStep   = Tk.Button(self, text = 'Step'  )
    btnCancel = Tk.Button(self, text = 'Cancel')
    btnExit   = Tk.Button(self, text = 'Exit'  )

    # grid
    btnLoad.grid(column= 4,row=0)
    btnSave.grid(column= 4,row=1)
    btnRun.grid(column=0,row=4)
    btnStep.grid(column=0,row=5)
    btnCancel.grid(column=0,row=6)
    btnExit.grid(column=4,row=9)

if __name__ == '__main__':
  f = Frame()
  f.pack()
  f.mainloop()

 リストボックスとスクロールを除いて、どんなイメージが
 表示されるかを試してみます。



 スクリプトは、以下。

#! /usr/bin/env python

import Tkinter as Tk

class Frame(Tk.Frame):
  """ Basic interpreter GUI widgit """

  def __init__(self, master=None): 
    Tk.Frame.__init__(self,master)
    self.master.title('Basic interpreter')

    # variables
    fd_in  = ''
    fd_out = ''
    fName  = 'unknown'

    bline = 0
    currentLine = 10
    currentResult = ''
    rstack = ''
    loc_while = 0
    while_flag = 0
    loc_for = 0
    for_flag = 0
    for_cc = ''
    forb = -1
    fors = -1
    forl = -1
    fcnt = -1
    io_in_v = '00000000'
    io_out_v = '00000000'
    rflag =  0

    # initialize line number and statement
    ls = {}
    ss = {}
    for e in range(0,4096) :
      ls[e] = -1
      ss[e] = ''

    # make hash table (variable)
    xvar = {}
    # xvar['A'] = 0
    # xvar['B'] = 0

    # make hash table (array)
    xarray = {}
    # xarray['<0>'] = 0
    # xarray['<1>'] = 0

    lblCode          = Tk.Label(self, text = 'Code')
    lblFileName      = Tk.Label(self, text = 'File Name')
    lblBeginLine     = Tk.Label(self, text = 'Begin Line')
    lblCurrentLine   = Tk.Label(self, textvariable= currentLine)
    lblCurrentResult = Tk.Label(self, textvariable= currentResult)
    lblInputs        = Tk.Label(self, text = 'Inputs')
    lblOutputs       = Tk.Label(self, text = 'Outputs')
    lblOutputsV      = Tk.Label(self, textvariable= io_out_v)

    entFileName  = Tk.Entry(self, textvariable = fName , bg = 'green' )
    entBeginLine = Tk.Entry(self, textvariable = bline )
    entInputs    = Tk.Entry(self, textvariable = io_in_v , width = 8 )

    #lsbCode = Tk.Listbox( xscrollcommand = ".sh set" , yscrollcommand = ".sv set" , width = 32 )
    #lsbCode = Tk.Listbox( width = 32 )

    # scrollbar = Tk.Scrollbar( .sv , orient = vertical   , command = ".lsbCode yview" )
    # scrollbar = Tk.Scrollbar( .sh , orient = horizontal , command = ".lsbCode xview" )

    btnLoad   = Tk.Button(self, text = 'Load'  , width = 12 , bg = '#0000ff' )
    btnSave   = Tk.Button(self, text = 'Save'  , width = 12 , bg = '#ff0000' )
    btnRun    = Tk.Button(self, text = 'Run'   , width = 12 , bg = 'green' )
    btnStep   = Tk.Button(self, text = 'Step'  , width = 12 )
    btnCancel = Tk.Button(self, text = 'Cancel', width = 12 , bg = 'yellow')
    btnExit   = Tk.Button(self, text = 'Exit'  , width = 12 , bg = '#007f7f' )

    lblFileName.grid(column = 1 , row = 0)
    lblCode.grid(column = 0 , row = 2)
    lblInputs.grid(column = 3 , row = 4)
    entInputs.grid(column = 4 , row = 4)
    lblOutputs.grid(column = 3 , row = 6)
    lblOutputsV.grid(column = 4 , row = 6)
    #lsbCode.grid(column = 1 , row = 2)
    #sv.grid(column = 2 , row = 2 , sticky = ns)
    #sh.grid(column = 1 , row = 3 , sticky = ew)
    lblBeginLine.grid(column = 1 , row = 4)
    entBeginLine.grid(column = 1 , row = 5)
    lblCurrentLine.grid(column = 1 , row = 6)
    lblCurrentResult.grid(column = 1 , row = 7)
    entFileName.grid(column = 1 , row = 1)
    btnLoad.grid(column = 4 , row = 0)
    btnSave.grid(column = 4 , row = 1)
    btnRun.grid(column = 0 , row = 4)
    btnStep.grid(column = 0 , row = 5)
    btnCancel.grid(column = 0 , row = 6)
    btnExit.grid(column = 4 , row = 9)

if __name__ == '__main__':
  f = Frame()
  f.pack()
  f.mainloop()

 リストボックスとスクロールは、イベントを利用した
 プロシージャの組み合わせになるので、表示完成後に
 考えていきます。

(under construction)

目次

inserted by FC2 system