wxErlang-此代码有什么问题?

wxErlang-此代码有什么问题?,erlang,wxwidgets,Erlang,Wxwidgets,我对erlang很陌生,我正试图在wxerlang周围转转,但遇到了麻烦。有人能看看这个代码并告诉我出了什么问题吗。我觉得这很明显,但我就是想不出来 -module(main). -include_lib("include/wx.hrl"). -behavoiur(wx_object). -export([start/0]). %% API -export([init/1, handle_call/3, handle_event/2, handle_info/2, terminate/2

我对erlang很陌生,我正试图在wxerlang周围转转,但遇到了麻烦。有人能看看这个代码并告诉我出了什么问题吗。我觉得这很明显,但我就是想不出来


-module(main).

-include_lib("include/wx.hrl").

-behavoiur(wx_object).
-export([start/0]).  %% API
-export([init/1, handle_call/3, handle_event/2, handle_info/2, terminate/2]). %% Call Backs

-record(state, {win, action}).

-define(NEW_APP, 101).

start() ->
    wx_object:start(?MODULE, [], []).

init(Options) ->
    wx:new(Options),
    Frame = wxFrame:new(wx:null(), ?wxID_ANY, "Rails IDE", [{size,{1000,500}}]),

    MB = wxMenuBar:new(),
    wxFrame:setMenuBar(Frame,MB),
    File    = wxMenu:new([]),
    wxMenu:append(File, ?NEW_APP, "&New"),
    wxMenu:append(File, ?wxID_EXIT, "&Quit"),

    wxMenuBar:append(MB, File, "&File"),

    wxFrame:connect(Frame, command_menu_selected),

    _SB = wxFrame:createStatusBar(Frame,[]),

    MainSplitter = wxSplitterWindow:new(Frame, []),
    LeftSplitter = wxSplitterWindow:new(MainSplitter, []),
    CenterSplitter = wxSplitterWindow:new(MainSplitter, []),
    RightSplitter = wxSplitterWindow:new(MainSplitter, []),
    BottomSplitter = wxSplitterWindow:new(MainSplitter, []),

    wxSplitterWindow:setMinimumPaneSize(MainSplitter, 1),
    wxSplitterWindow:setMinimumPaneSize(LeftSplitter, 1),
    wxSplitterWindow:setMinimumPaneSize(CenterSplitter, 1),
    wxSplitterWindow:setMinimumPaneSize(RightSplitter, 1),
    wxSplitterWindow:setMinimumPaneSize(BottomSplitter, 1),

    wxFrame:show(Frame),

    State = #state{win=Frame},
    {Frame, State}.

handle_info(Msg, State) ->
    io:format("Got Info ~p~n",[Msg]),
    {noreply,State}.

handle_call(Msg, _From, State) ->
    io:format("Got Call ~p~n",[Msg]),
    {reply,ok,State}.

handle_event(#wx{id = Id,
                 event = #wxCommand{type = command_menu_selected}},
             State = #state{}) ->
    case Id of
        ?NEW_APP ->
            Panel = newAppDialog(State#state.win),
            {noreply,  State#state{action=Panel}};
        ?wxID_EXIT ->
            {stop, normal, State};
        _ ->
            {noreply, State}
    end;

handle_event(Ev,State) ->
    io:format("~p Got event ~p ~n",[?MODULE, Ev]),
    {noreply, State}.

terminate(_Reason, _State) ->
    wx:destroy().


newAppDialog(Frame) ->
    Panel = wxPanel:new(Frame, []),

    %% Setup sizers
    MainSizer = wxBoxSizer:new(?wxVERTICAL),
    SubSizer = wxStaticBoxSizer:new(?wxVERTICAL, Panel, [{label, "Create a new Rails app."}]),

    Label1 = wxStaticText:new(Panel, 1, "App root"),
    DirPicker = wxDirPickerCtrl:new(Panel, 2,
                                    [{path, "/"},
                                     {style, ?wxDIRP_USE_TEXTCTRL},
                                     {message, "Select app root"}]),
    Label2 = wxStaticText:new(Panel, 3, "App name"),
    TextCtrl = wxTextCtrl:new(Panel, 4),
    Button = wxButton:new(Panel, ?wxID_OK),

    %% Add to sizers
            PickerOptions = [{border, 4},{flag, ?wxALL bor ?wxEXPAND}],
    wxSizer:add(SubSizer, Label1, PickerOptions ),
    wxSizer:add(SubSizer, DirPicker, PickerOptions ),
    wxSizer:add(SubSizer, Label2, PickerOptions ),
    wxSizer:add(SubSizer, TextCtrl, PickerOptions),
    wxSizer:add(SubSizer, Button, PickerOptions),

    SizerOptions  = [{flag, ?wxEXPAND}],
    wxSizer:add(MainSizer, SubSizer, SizerOptions),

    wxWindow:connect(Panel, command_button_clicked),
    wxPanel:setSizer(Panel, MainSizer),
    wxSizer:layout(MainSizer),
    Panel.

你有编译错误吗

将include_lib行更改为

-include_lib("wx/include/wx.hrl").
有了这个修改,它就可以编译了,当它运行时,我会看到一个空白窗口(我在MacOSX上使用的是ERL5.7.2)。这就是你所期望的吗


如果您是Erlang新手,那么从更直接的内容开始可能更容易。理解wx_对象手册页并不太困难,但在我看来,只有当你掌握了OTP并首先编写了几个测试服务器之后。一旦你在这一点上叠加wx的工作原理,这是一个更简单的步骤。同时做这两件事将是一个更大的挑战,但你的里程数可能会有所不同当然

我意识到这是一个老问题,但我注意到

-行为(wx_对象)


拼写错误。(您有行为(wx_对象).

获得实际错误可能会有所帮助。您可能还希望尝试将代码缩减为显示相同问题的较小示例。除了让其他人更容易回答您的问题外,这是一种很好的自我调试技术;一旦您排除了所有无关的内容,其余代码中的问题可能会变得更加明显ious。我的问题在于处理事件/3中的?NEW_APP newAppDialog作为一个新进程运行并退出,但帧中没有显示任何内容。主进程仍在运行,但werl返回到命令行。我很困惑,也许我跳到了很远的地方,将首先查看OTP内容。我浏览了spawnlink教程现在我对厄兰有了更好的了解,虽然我显然还有很多事情要做,但是谢谢你的建议。