目次
前
次
インタプリタソースコード(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に、どんなものがあるかを
確認してみます。
- button
- canvas
- checkbutton
- combobox
- entry
- frame
- label
- labelframe
- listbox
- menu
- menubutton
- message
- notebook
- tk_optionMenu
- panedwindow
- progressbar
- radiobutton
- scale
- scrollbar
- separator
- sizegrip
- spinbox
- text
- treeview
Basicインタプリタのシミュレータ画面で、どんな
GUIのwidgetが使われているかをチェックします。
ボタンは6種あり、オブジェクトで指定すると以下。
- btnLoad
- btnSave
- btnRun
- btnStep
- btnCancel
- btnExit
これらのオブジェクトの生成は、次の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)
目次
前
次