Command Line Program Front End -- X Python Reference Manual

Prev: Simple Button Using PyRegister Up: Examples Top: Top

## 6.3.4. Command Line Program Front End

This example is a simple front end to the unix "cp" command that demonstrates the use of the `MrmNcreateCallback` to enter the widgets created by UIL into module `__main__`'s dictionary. This is somewhat cleaner than having to find the UIL-created widgets using `NameToWidget`. The files involved are panel_cp.uil, panel_cp.uid and panel_cp.py.

panel_cp.uil contains the following:

        module cp_front_end
        version = 'V1.0'
        names = case_sensitive

        procedure PyEval(string);

        object main : XmBulletinBoard {
            arguments {
                XmNwidth = 300;
                XmNheight = 400;
            };
            controls {
                XmText src_file;
                XmText dst_file;
                XmPushButton button;
            };
        };

        object  src_file : XmText {
            arguments {
                XmNy = 0;
                XmNx = 10;
                XmNwidth = 280;
                XmNheight = 40;
                XmNeditMode = XmSINGLE_LINE_EDIT;
            };
            callbacks {
                MrmNcreateCallback = procedure PyEval("OnCreate('src_file_w')");
                XmNvalueChangedCallback = procedure PyEval("OnValueChanged()");
            };
        };

        object  dst_file : XmText {
            arguments {
                XmNy = 60;
                XmNx = 10;
                XmNwidth = 280;
                XmNheight = 40;
                XmNeditMode = XmSINGLE_LINE_EDIT;
            };
            callbacks {
                MrmNcreateCallback = procedure PyEval("OnCreate('dst_file_w')");
                XmNvalueChangedCallback = procedure PyEval("OnValueChanged()");
            };
        };

        object  button : XmPushButton {
            arguments {
                XmNy = 110;
                XmNx = 10;
                XmNwidth = 100;
                XmNheight = 40;
                XmNlabelString = 'Do Copy';
                XmNsensitive = false;
            };
            callbacks {
                MrmNcreateCallback = procedure PyEval("OnCreate('button_w')");
                XmNactivateCallback = procedure PyEval("DoCopy()");
            };
        };

        end module;

panel_cp.uil is compiled to panel_cp.uid by the statement:

        uil panel_cp.uil -o panel_cp.uid

panel_cp.py contains the following text:

        #!/usr/local/bin/python

        import posix, os, sys, Mrm, Xm, Xt

        # -----------------------------------------
        def OnCreate(name):
            # insert name=__widget__ into __main__'s dictionary
            sys.modules['__main__'].__dict__[name] = __widget__

        # -----------------------------------------
        def OnValueChanged():
            if len(src_file_w.TextGetString()) > 0 and \
               len(dst_file_w.TextGetString()) > 0:
                button_w.sensitive = 1
            else:
                button_w.sensitive = 0

        # -----------------------------------------
        def DoCopy():
            cmd = 'cp '
            cmd = cmd + src_file_w.TextGetString()
            cmd = cmd + ' '
            cmd = cmd + dst_file_w.TextGetString()

            print cmd
            posix.system(cmd)
            sys.exit()

        # -----------------------------------------
        def main():
            top_level = Xt.Initialize()

            mrm_hier = Mrm.OpenHierarchy("panel_cp.uid")
            main_w = mrm_hier.FetchWidget("main", top_level)

            main_w.ManageChild()
            top_level.RealizeWidget()

            Xt.MainLoop()

        main()

This example demonstrates using the `OnCreate` `MrmNcreateCallback` to access the `__widget__` symbol and insert an entry in the `__main__` module's dictionary for the `XmText` and `XmPushButton` widgets declared in the UIL. This makes these widgets accessible as Python-wrapped widget objects to the `OnValueChanged` and `OnCopy` callback routines, without having to pass the widgets to these callbacks in the UIL tag argument.

Another way to accomplish this is to insert the names into the `__main__` namespace explicitly in `main()`, for example:

        global src_file_w, dst_file_w

        ...
        main_w = mrm_hier.FetchWidget("main", top_level)
        src_file_w = main_w.NameToWidget('src_file')
        dst_file_w = main_w.NameToWidget('dst_file')

Here, 'src_file' and 'dst_file' are the widget's names as specified in the UIL, and `NameToWidget` is used to find the widgets, obtain Python wrapped widget objects, and initialize src_file_w and dst_file_w global variables.

Prev: Simple Button Using PyRegister Up: Examples Top: Top