I believe what you're looking for is a
Tk::Dialog (update: er, you're right, Tk::DialogBox is what I meant). I can't test it at the moment, but I'm nearly certain that calling $Dialog->Show() (which uses $Dialog->waitVariable(\$var) internally) will process events (ie, allow user interaction) until the dialog is dismissed and then return control to your procedural code, all without a MainLoop.
Black flowers blossom
Fearless on my breath