On Aug 13, 5:26 pm, [EMAIL PROTECTED] (Chas Owens) wrote: > On 8/12/07, Chris Pax <[EMAIL PROTECTED]> wrote: > snip> so I tried require and do. > > I guess its best to explain my goal here. I am using perl for gtk > > programming. The main code will use the glade bindings and use a > > separate file for call backs. I want to make it so that if a new > > callback/function is defined in the glade file, that function will be > > appended to the callbacks file, with the 1; at the end. this way, you > > don't half to keep on doing it your self or running some script. > > snip > > I do not suggest doing this. It is better to wrap glade-2 (or > whatever you use to edit your glade files) with a script that runs an > xml parser to pull out the names of the defined signals and edits the > proper module. If you do it the way you describe, then you have to > try to exercise every signal that can possibly be called and, > undoubtedly, you will eventually miss one. > > But, if you have your heart set on doing it, then the best way to > handle this is with Perl's AUTOLOAD* functionality. Basically it > allows you to create one catchall function or method (per package) > that will be called if perl can't find an appropriate function or > method to call. Inside of this function you can see the fully > qualified name of the function or method that should have been called. > It is easy enough to write to the modules file within the AUTOLOAD > function, so you just write to it then. There is no need to reload > the module because the AUTOLOAD function will just keep catching the > non-existent function or method; however, you will need to put some > logic in place to keep it from constantly adding the function. I have > implemented an example of this with three files: Funcs.pm, p.pl, and > project1.glade. Note, you could even go so far as to make the > AUTOLOAD function popup another top-level window, let you type in the > code that should go with that widget, and then save the full function > to the module instead of using a constant string like I did, but I > leave that as an exercise for the reader. > > *http://perldoc.perl.org/perlsub.html#Autoloading-autoloading-AUTOLOAD > > **** Funcs.pm **** > package Funcs; > > use strict; > use warnings; > > use Gtk2; > > BEGIN { > our $AUTOLOAD; > our $module; > our %found; > > #find first version of this module > for my $dir (@INC) { > if (-f "$dir/Funcs.pm") { > $module = "$dir/Funcs.pm"; > last; > } > } > > } > > sub on_window_destroy { > Gtk2->main_quit; > > } > > sub on_button1_clicked { > print "this func is implemented\n"; > return 1; > > } > > sub AUTOLOAD { > our $AUTOLOAD; > our $module; > our %found; > print "glade tried to call $AUTOLOAD, but it doesn't exist\n"; > unless ($found{$AUTOLOAD}) { > print "writing $AUTOLOAD to $module\n"; > open my $mod, '>>', $module > or die "could not open $module: $!"; > my ($func) = $AUTOLOAD =~ /.*::([a-zA-Z_]\w*)/; > print $mod "\nsub $func { return 1; }\n"; > $found{$AUTOLOAD} = 1; > } > > return 1; > > } > > 1; > **** p.pl **** > #!/usr/bin/perl > > use strict; > use warnings; > > use Gtk2; > use Gtk2::GladeXML; > use Funcs; > > Gtk2->init; > > my $glade = Gtk2::GladeXML->new("./project1.glade"); > $glade->signal_autoconnect_from_package('Funcs'); > > Gtk2->main; > **** project1.glade **** > <?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> > <!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd"> > > <glade-interface> > > <widget class="GtkWindow" id="window"> > <property name="visible">True</property> > <property name="title" translatable="yes">window</property> > <property name="type">GTK_WINDOW_TOPLEVEL</property> > <property name="window_position">GTK_WIN_POS_NONE</property> > <property name="modal">False</property> > <property name="resizable">True</property> > <property name="destroy_with_parent">False</property> > <property name="decorated">True</property> > <property name="skip_taskbar_hint">False</property> > <property name="skip_pager_hint">False</property> > <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property> > <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> > <property name="focus_on_map">True</property> > <property name="urgency_hint">False</property> > <signal name="destroy" handler="on_window_destroy" > last_modification_time="Mon, 13 Aug 2007 20:46:26 GMT"/> > > <child> > <widget class="GtkHBox" id="hbox1"> > <property name="visible">True</property> > <property name="homogeneous">True</property> > <property name="spacing">0</property> > > <child> > <widget class="GtkButton" id="button1"> > <property name="visible">True</property> > <property name="can_focus">True</property> > <property name="label" translatable="yes">button1</property> > <property name="use_underline">True</property> > <property name="relief">GTK_RELIEF_NORMAL</property> > <property name="focus_on_click">True</property> > <signal name="clicked" handler="on_button1_clicked" > last_modification_time="Mon, 13 Aug 2007 20:32:02 GMT"/> > </widget> > <packing> > <property name="padding">0</property> > <property name="expand">True</property> > <property name="fill">True</property> > </packing> > </child> > > <child> > <widget class="GtkButton" id="button2"> > <property name="visible">True</property> > <property name="can_focus">True</property> > <property name="label" translatable="yes">button2</property> > <property name="use_underline">True</property> > <property name="relief">GTK_RELIEF_NORMAL</property> > <property name="focus_on_click">True</property> > <signal name="clicked" handler="on_button2_clicked" > last_modification_time="Mon, 13 Aug 2007 20:32:08 GMT"/> > </widget> > <packing> > <property name="padding">0</property> > <property name="expand">True</property> > <property name="fill">True</property> > </packing> > </child> > > <child> > <widget class="GtkButton" id="button3"> > <property name="visible">True</property> > <property name="can_focus">True</property> > <property name="label" translatable="yes">button3</property> > <property name="use_underline">True</property> > <property name="relief">GTK_RELIEF_NORMAL</property> > <property name="focus_on_click">True</property> > <signal name="clicked" handler="on_button3_clicked" > last_modification_time="Mon, 13 Aug 2007 20:32:14 GMT"/> > </widget> > <packing> > <property name="padding">0</property> > <property name="expand">True</property> > <property name="fill">True</property> > </packing> > </child> > </widget> > </child> > </widget> > > </glade-interface>
thank you all once again. I tried the autoload thing, and I find it very interesting, so thank you very much for pointing it out to me. I can consider this question closed to me. It still does not do what I want it to do. but I have it so, if you pass it a value like: ./myprog.pl update, it will update the callbacks file and exit. otherwise it will run the program. what I want to happen is for it to write in the new functions on the fly while running the code. And I think you all have show me enough to get me on the right track thanks. if you are still interested in helping me, you can help test out this: https://launchpad.net/gladex which is a code generator for glade. Written by me an my brother. it is best to download the latest code through the trunk bzr. bzr checkout http://bazaar.launchpad.net/~gladex/gladex/trunk gladex which will download and rename a file as gladex. then run the file: gladex.py. the rest is self explanatory. any question, fear not to ask at launchpad. thanks again -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] http://learn.perl.org/