----------------------------------------------------------------------------- -- Name: graphcalc03.wx.lua -- Purpose: Making graphing calculator (LuaAppMaker tutorial) -- Author: Toshi Nagata -- Created: 2019/12/31 -- Copyright: (c) 2019 Toshi Nagata. All rights reserved. -- Licence: wxWidgets licence ----------------------------------------------------------------------------- ----------------------------------------------------------------------------- -- ステップ3:入力された数式を解釈する ----------------------------------------------------------------------------- -- メインウィンドウを作る function NewFrame() -- wxFrame を作る frame = wx.wxFrame(wx.NULL, -1, "LuaAppMaker グラフ計算機") frame:SetClientSize(640, 480) -- 部品を配置する -- 擬似コードで書くと下の通り -- Vsizer( -- Hsizer( StaticText("数式"), Button("更新") ), -- TextCtrl(), -- Panel() ) frame.stext = wx.wxStaticText(frame, -1, "数式") frame.etext = wx.wxStaticText(frame, -1, "") frame.etext:SetForegroundColour(wx.wxRED) frame.button = wx.wxButton(frame, -1, "更新") frame.textctrl = wx.wxTextCtrl(frame, -1, "", wx.wxDefaultPosition, wx.wxSize(100, 32), wx.wxTE_MULTILINE) frame.panel = wx.wxPanel(frame, -1) -- BoxSizer に部品をセットする local hsizer1 = wx.wxBoxSizer(wx.wxHORIZONTAL) hsizer1:Add(frame.stext, wx.wxSizerFlags():Border(wx.wxLEFT + wx.wxRIGHT, 5)) hsizer1:Add(frame.etext, wx.wxSizerFlags(1):Border(wx.wxLEFT + wx.wxRIGHT, 10)) hsizer1:Add(frame.button, wx.wxSizerFlags():Border(wx.wxRIGHT, 5)) local vsizer1 = wx.wxBoxSizer(wx.wxVERTICAL) vsizer1:Add(hsizer1, wx.wxSizerFlags():Expand():Border(wx.wxTOP, 5)) vsizer1:Add(frame.textctrl, wx.wxSizerFlags():Expand():Border(wx.wxTOP + wx.wxLEFT + wx.wxRIGHT, 5)) vsizer1:Add(frame.panel, wx.wxSizerFlags(1):Expand():Border(wx.wxTOP, 5)) -- ウィンドウに vsizer1 をセットして、初期レイアウトを行う frame:SetSizer(vsizer1) vsizer1:Layout() -- イベントハンドラを接続 frame.button:Connect(wx.wxEVT_BUTTON, OnClick) -- ウィンドウを表示 frame:Show(true) end -- 「更新」ボタンがクリックされた function OnClick(event) local eq = frame.textctrl:GetValue() local str = "frame.func = function (x) local y\n" .. eq .. "\nreturn y; end" local f, err = loadstring(str) if f then f() frame.etext:SetLabel("") else frame.etext:SetLabel(err) end end NewFrame()