I have a software package that has a very cumbersome GUI written in tclsh/wish. I would like to control the software via terminal and make some scripts to run it. The wish GUI is quite long (over 37000 lines) so I would like to avoid reading it in detail and writing a respective command-line interface. Suppose I already know the sequence of buttons which I want to press and entry-fields to fill. Is there a way I can control this wish GUI monster via terminal?
The GUI is called via:
exec wish -f $PROGRAM_PATH/program.tcl -n program wish $PROGRAM_PATH $*
Even if I remove the -f flag it wouldn't take any terminal input or display the % prompt. I don't understand the part following the -n flag. The programs runs the same if I remove it.
i.e. calling simply
wish $PROGRAM_PATH/program.tcl
does the same thing.
I tried the -file flag as well and supply external file with commands, but wish tried to input these commands before all the internal variables and routines were defines, so it resulted in an unrecognized command.
Can anybody point me to some useful source about wish scripting?
If you had a program prog.tcl
, which has an entry field .e, and a button .b:
#!/usr/bin/tclsh
package require Tk
set e {}
proc dump { } {
global e
puts $e
}
ttk::label .l -text Entry:
ttk::entry .e -textvariable e
grid .l .e
ttk::button .b -text button -command dump
grid .b -column 2
You can use a script like this to run it:
#!/usr/bin/tclsh
package require Tk
source prog.tcl
set tv [.e cget -textvariable]
set $tv mydata
.b invoke
update
This only works if you have the source, which it appears you do.
Instead of generating events to enter data in the entry field, it is much easier to just get the associated variable and set it to the required value. Buttons are easy. There are also comboboxes (drop-downs), checkboxes, scales and radio buttons to work with. I use these methods extensively for my automated testing and it works.
You will still have to read the code to find out the entry and button names.
If you are on Windows, you could also try the autohotkey program.