TkInter wrapper for tcl/tk GUI: Difference between revisions

From ASCEND
Jump to navigation Jump to search
MarkJones (talk | contribs)
MarkJones (talk | contribs)
Line 72: Line 72:
gui.mainloop()
gui.mainloop()
</source>
</source>
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:
<source lang="tcl">


=== ascend/tcltk/tk/ ===
=== ascend/tcltk/tk/ ===

Revision as of 00:52, 28 December 2018

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:




=== ascend/tcltk/tk/ ===

{| class="infobox wikitable" style="margin-left:1em;"
|-
! style="background:#bfffbf;" | AscendRC
| <source lang="tcl" style="margin:0px; background:#cfffcf;">

|- ! style="background:#bfffbf;" | ascend.tcl

|

env(ASCENDTK)

|- ! style="background:#bfffbf;" | 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

|- ! style="background:#bfffbf;" | View.tcl

|


|- ! style="background:#bfffbf;" | 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.