in reply to Event based modules playing nice together?

Try using Tk::After's repeat() method to periodically execute do_one_loop():

my $id = $main_window->repeat(5, sub { $irc->do_one_loop });

Tk will then execute the sub every 5 milliseconds (well, almost). Play around with the first argument to see what granularity works best. You can use afterCancel() to cancel the Tk::After event when you don't need it to execute anymore:

$main_window->afterCancel($id);

You should still check out POE, though. It has a much nicer IRC API than Net::IRC does.