how about still use sockets (or pipes), but instead of establishing a communication between different programs on different boxes uning local displays, communicate between different programs on a single local box using remote displays? I mean, if your current version is somewhat like
box1:select(@handles_from_boxes) and do_logic()
box2:tk-interface.pl: connect to box1, create windows and buttons,
then I propose to do this instead:
box1: for ( @boxes) {
$ENV{DISPLAY} = $_;
system "tk-interface.pl";
}
select(@handles_from_boxes) and do_logic()