Почему `print` не работает в этой программе wxPerl? - PullRequest
1 голос
/ 24 июля 2010

В моем конструкторе фреймов у меня есть функция, которая легко создает для меня строку меню.

package Routines;

#This function will set up a menu
#REQUIRED: entries
#RETURNS:  id, menu
sub SetupMenu {
    $menuItemCount = 0;                     #Element number under the same menu
    $subMenuCount  = 0;                     #Number of menus
    $mbar          = Wx::MenuBar->new();    #Menu bar constructor
    for ($totalCount = 0; $totalCount < scalar($_[1]); $totalCount++) {    #Loop for each entry
        if ($menuItemCount == 0) {                                         #If this is the first entry in the menu
            $menuList[$subMenuCount] = Wx::Menu->new($_[$totalCount]);     #Construct a menu and make this the title
        } elsif ($_[$totalCount] == "---") {                               #If the entry is ---
                                                                           #Treat it as a separator, skip ID
        } elsif ($_[$totalCount] == "***") {                               #If the entry is ***
            $mbar->Append($menuList[$subMenuCount]);                       #Add the menu to the bar
            $menuItemCount = 0;                                            #Reset the number of elements
            $subMenuCount++;                                               #Increment the number of menus
        } else {                                                           #On normal operation
            $menuList[$subMenuCount]->Append($id[$totalCount], $_[$totalCount]);    #Add the element to the menu and assign it an ID
        }
    }
    #print $mbar;
    return (@id, $mbar);
}

#This package puts crap in the main window
package mehFrame;
use base qw(Wx::Frame);

sub new {
    #Preparation
    $class = shift;
    $self  = $class->SUPER::new(@_);

    #Place the panel
    $pan = Wx::Panel->new($self, -1);

    #Set up menus
    (@mehId, $mehBar) = Routines::SetupMenu("File", "Open ROM", "Save ROM", "Save ROM As", "---", "Close ROM", "Exit");

    #Return
    return $self;
}
[...]

К сожалению, это не работает. После ввода print в функцию SetupMenu() он не печатался. С другой стороны, когда я ставил warn, он предупреждал.

Что еще хуже, даже если я добавлю print в функцию new(), он все равно не будет печататься. Что происходит?

Ответы [ 2 ]

1 голос
/ 24 июля 2010

Яков, я возьму этот удар в отсутствие других ответов, но возьму это с крошкой соли, так как я не эксперт по wxPerl.

Ваше описание звучит так, как будто печать в STDERR работает, так как именно туда идет warn, а печать в STDOUT - нет.

Попробуйте вместо этого сделать print STDERR $mbar - я вполне уверен, что это сработает.

ОБНОВЛЕНИЕ: В соответствии с отличным предложением daotoad, это также может быть связано с отсутствием сброса - если это так, то установка автоматической очистки на STDOUT решит эту проблему. Будь то одно или другое, зависит от того, что пытается сделать ОП. Я добавил его в свой ответ, поскольку daotoad только оставил комментарий и еще не добавил свой отдельный ответ - я удалю его, как только он это сделает.

0 голосов
/ 22 декабря 2010

печать работает под Wx иногда асинхронно, если вы не добавите "\ n"

...