TkInter wrapper for tcl/tk GUI
This is a guide how you can check out the oldschool 90s tcl/tk interface of ASCEND which is part of engineering history and worth conserving.
The TkInter wrapper is used to call the tcl legacy code:
https://wiki.python.org/moin/TkInter
https://en.wikipedia.org/wiki/Tkinter
Here are notes which are going to be formulated in detail over time:
Python script to wrap the legacy tcl code with TkInter
Environment variables have to be set in the Python script.
See http://ascend4.org/Environment_variables_for_ASCEND for more information.
Locate the following script in the ascend/tcltk/tk/ folder and call it from the command line.
import tkinter gui = tkinter.Tk() #Variables ASCENDTK = tkinter.StringVar() ASCENDTK.set("./") ASCENDBITMAPS = tkinter.StringVar() ASCENDBITMAPS.set("./bitmaps") ASCENDDIST = tkinter.StringVar() ASCENDDIST.set("../../") TKTABLE_LIBRARY = tkinter.StringVar() TKTABLE_LIBRARY.set("/usr/lib/tcltk/x86_64-linux-gnu/Tktable2.10") asc_swap_del_backspace = tkinter.StringVar() asc_swap_del_backspace.set("1") # for UNIX systems argc = tkinter.IntVar() argc.set(0) #Evaluation gui.tk.eval('lappend auto_path {%s}' % './') gui.tk.eval('lappend auto_path {%s}' % '../interface') gui.tk.eval('lappend auto_path {%s}' % '../../ascend/compiler') gui.tk.eval('lappend auto_path {%s}' % '../../ascend/general') gui.tk.eval('lappend auto_path {%s}' % '../../ascend/system') gui.tk.eval('lappend auto_path {%s}' % '../../ascend/utilities') gui.tk.eval('package require color 1.0') gui.tk.eval('package require block 1.0') gui.tk.eval('package require error 1.0') gui.tk.eval('package require module 1.0') gui.tk.eval('package require LibraryProc 1.0') gui.tk.eval('set env(ASCENDTK) %s' % (ASCENDTK.get())) gui.tk.eval('set env(ASCENDBITMAPS) %s' % (ASCENDBITMAPS.get())) gui.tk.eval('set env(ASCENDDIST) %s' % (ASCENDDIST.get())) gui.tk.eval('set asc_swap_del_backspace %s' % (asc_swap_del_backspace.get())) gui.tk.eval('set argc %s' % (argc.get())) #gui.tk.eval('package require Tktable') gui.tk.eval('source {ascend.tcl}') #Mainloop gui.mainloop()
The GUI starts if one comments all the lines loading the packages out (package require).
Shared libraries can be compiled and then provided as a package via pkgIndex.tcl in the respective folder for the shared libraries.
Example for ascend/tcltk/interface/LibraryProc.c:
$ gcc -fPIC -shared -DUSE_TCL_STUBS -I /usr/include/tcl8.5/ -I ../../ -o LibraryProc.so LibraryProc.c -L /usr/share/tcltk/tcl8.5 -ltclstub8.5
Create pkgIndex.tcl (case-sensitive!) in the same folder:
package ifneeded LibraryProc 1.0 \ [list load [file join $dir LibraryProc[info sharedlibextension]]]
ascend/tcltk/tk/
| AscendRC | |
|---|---|
| ascend.tcl | env(ASCENDTK) |
| GlobalProc.tcl | set_global_defaults Glob_do_GNU set_Template_defaults asc_swap_del_backspace -> GlobalProc.tcl ; set to "1" for unix systems set_Global_Defaults {} { __userdata_init |
| View.tcl | |
| main.tcl | load_Templates Util_do_Read |
ascend/tcltk/interface
| config.h | |
|---|---|
| main.c | main() This function creates a Tcl interpreter, initializes Tcl and Tk, initializes the Ascend data structures, sets up the user's environment, sources ASCEND's startup script, and calls Tk_MainLoop so the user can interact with ASCEND. Cleans up and exits the program when Tk_MainLoop returns. This function is based on the functions Tk_Main and Tcl_AppInit from the Tk8.0 distribution. See the files tkMain.c and tkAppInit.c in the Tk sources. |
| Commands.c | __userdata_init |
| Driver.c | AscDriver() |
Changes made to the codebase to get the GUI up and running with TkInter
There was an issue with tktable which I couldn't fix and also found this bug report which might actually not be resolved: http://bugs.ascend4.org/view.php?id=254 see also:
https://github.com/nbro/tktable/issues/3
https://github.com/nbro/tktable/issues/1
Also the trunk branch was missing the interval.c and interval.h files in ascend/compiler/.
I copied the files over from the Python3 branch and then the issue was solved
In line 138 in solver.tcl the - bitmap {feet} and -bitmap{stop} options couldn't find the bitmaps in ascend/tcltk/tk/bitmaps.
See the Notes section for other changes to get the tcl/tk interface working.
Notes
ASC_IMPORT:
Definition at line 124 of file ascend/general/platform.h
asc_swap_del_backspace:
set to "1" for unix systems (done in Python script)
__userdata_init:
comment out
argc:
set argument counter argc to 0 (done in Python script)
tktable missing:
- install via sudo apt-get install tk-table
- ascend still can't find tktable
- install tcl8.5-dev, tk8.5-dev, libxft-dev, libfontconfig1-dev, libfreetype6-dev, libpng-dev
- error: if {[catch {package require Tktable 2.8} err]} in ascend.tcl
- http://bugs.ascend4.org/view.php?id=254
- https://github.com/nbro/tktable/issues/3
- The plot window and the solver window require the
- TkTable exension package by Roland King mthomas 98.05.07: require 1.8 until we debug the memory errors in 2.0
- comment the if clause block starting with line 225 in ascend.tcl out
- Issue not yet resolved
error because interval.c and interval.h files were missing (trunk branch) in ascend/compiler/:
copy both files from Python3 branch into the trunk branch folder
bitmap "feet" not defined:
- ascend.tcl line 259: awin all
- awin is in GlobalProc.tcl
- ShowWindow.solver in line 108 in GlobalProc.tcl
- line 138 in solver.tcl
- option -bitmap {feet} was removed because it couldn't be located
- option -bitmap {stop} was removed
Ascend starts with main GUI! Some windows or buttons still don't work.
still having these error messages:
Error calling set_Library_Defaults; invalid command name "libr_query (in NoteboxProc.tcl) defined in LibraryProc.h
Error calling set_Probe_Defaults; invalid command name "__probe" (in ProbeProc.tcl)
Error calling set_Solver_Defaults; invalid command name "slv_available" (in SolverProc.tcl)
Error calling set_Units_Defaults invalid command name "u_dim2num" (in UnitsProc.tcl)
The commands aren't found because the C code isn't compiled as a shared library (extension). See this link to build the extensions in ascend/tcltk/interface:
https://wiki.tcl-lang.org/page/Hello+World+as+a+C+extension
https://www.tcl.tk/man/tcl8.4/TclLib/InitStubs.htm:
see also: https://www.tcl.tk/doc/howto/stubs.html
Change to interface directory and compile to shared libraries:
$ gcc -fPIC -shared -DUSE_TCL_STUBS -I /usr/include/tcl8.5/ -I ../../ -o LibraryProc.so LibraryProc.c -L /usr/share/tcltk/tcl8.5 -ltclstub8.5
But getting this error then when trying to load the shared library in the tcl shell (tclsh):
$tclsh
% load LibraryProc.so
% couldn't load file "LibraryProc.so": LibraryProc.so: undefined symbol: g_alt_ending
So the global variable g_alt_ending can't be found:
http://ascend4.org/Global_variables
ASC_DLLSPEC CONST char* g_alt_ending[MOD_FILE_EXTS]
This array defines the expected file extensions for parsable ascend MODEL/ATOM/unit code. Files are not limited to these, however. Interfaces that see a trailing .* where * is other than these should enquire as to the user intent: the user may have made a mistake.
Definition at line 58 of file ascend/compiler/module.h
Recursively going through all files where a symbol is defined on which the previous generated shared library depends on and make a shared library of it and package it via pkgIndex.tcl in the respective folder.