2010-07-24 4 views
1

В моем конструкторе кадров у меня есть функция, которая легко создает для меня панель меню.Почему `print` не работает в этой программе wxPerl?

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(), он все равно не печатает. Что происходит?

ответ

1

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

Ваше описание похоже на печать на STDERR, так как там находится warn, тогда как печать на STDOUT не работает.

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

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

+2

Может быть, он страдает от буферизации. По умолчанию IIRC STDERR установлен на автозапуск, но STDOUT установлен на выход буфера. – daotoad

+0

@daotoad - очень правдоподобно ... это было бы моей следующей догадкой ... вы могли бы захотеть превратить это в ответ, чтобы OP это увидел. – DVK

+0

Спасибо за предложение autoflush! Добавление '$ | = 1' в верхней части файла делало' print' при необходимости. Тем не менее, панель по-прежнему не отображается, хотя это может быть моя программа. –

0

печать работает под Wx иногда асинхронная undless вы добавить «\ п»