2010-07-24 4 views
1

내 프레임 생성자에는 쉽게 메뉴 모음을 만드는 기능이 있습니다.이 wxPerl 프로그램에서`print`가 작동하지 않는 이유는 무엇입니까?

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; 
} 
[...] 

불행히도, 작동하지 않습니다. SetupMenu() 함수에 print을 넣은 후에 인쇄되지 않았습니다. 다른 한편으로, 나는 그것을 warn에 넣었을 때 경고했다.

더 나쁜 것은 new() 함수에서 print을 넣더라도 여전히 인쇄되지 않는다는 것입니다. 무슨 일 이니?

답변

1

야코프, 나는 다른 대답이 없으면 이것을 찔러 보겠지만, 나는 wxPerl 전문가가 아니기 때문에 이것을 소금 한 알로 가져 가야한다.

STDERR로 인쇄하는 것과 같으므로 여기에 warn이 나와 있기 때문에 설명에 소리가 들리는 반면 STDOUT으로 인쇄하는 것은 아닙니다.

대신 print STDERR $mbar을 시도해보십시오. 제대로 작동 할 것이라고 확신합니다.

업데이트 : daotoad의 탁월한 제안에 따르면, 이는 또한 플러시 부족으로 인한 것일 수 있습니다. 그렇다면 자동 종료를 STDOUT으로 설정하면 문제를 해결할 수 있습니다. 그것이 하나이든 다른 것이 든, OP가 시도하는 것에 달려 있습니다. 나는 daotoad가 단지 코멘트를 올렸고 아직 그 자신의 분리 된 대답을 추가하지 않았기 때문에 그것을 나의 대답에 추가했다 - 나는 그가 그것을 한 번 제거 할 것이다.

+2

그는 버퍼링으로 고통 받고 있습니다. IIRC STDERR은 기본적으로 autoflush로 설정되지만 STDOUT은 버퍼 출력으로 설정됩니다. – daotoad

+0

@daotoad - 매우 그럴듯한 ... 내 다음 추측이었을 것입니다. OP에서 이것을 볼 수 있도록 대답으로 바꾸고 싶을 수도 있습니다. – DVK

+0

autoflush 제안에 감사드립니다! 파일 상단에'$ | = 1'을 추가하면 필요할 때'print'가 실행됩니다. 그러나 바는 내 프로그램 일지 모르지만 여전히 표시되지 않습니다. –

0

프린트가 Wx에서 작동하는 경우가 있습니다. 비동기 적으로 "\ n"을 추가하십시오.