首页 > 解决方案 > 来自不同文件函数的值返回空白 (Lua)

问题描述

我在处理一些最初由更有经验的人创建的代码时遇到问题。我想从一个 Lua 文件到另一个文件中获取一些信息,但这很困难,因为很多元素都是用我不完全理解的复杂函数创建的。

这是我正在开发的应用程序部分的屏幕截图。我想复制出现在中间文本栏中的文本(它根据用户从 Power Binder 中选择的命令而有所不同)并将其添加到底部栏中当前显示“测试”的代码中。正如您在注释掉的尝试中看到的那样,我尝试了很多东西,但是 rtnMacroCmd 一直返回空白 iup.Message (我将它们用作测试),除非我将其设置为 tbtn.action 函数之外的整数或字符串.

谁能告诉我发生了什么事?

这是来自名为 macromaker.lua 的文件的代码。我添加了一个文本框和按钮,它们是从另一个名为 powerbinder.lua 的文件中的函数创建的。

    local updatemacro = nil

    local macrobox = iup.text{size = "250x", tip = "Copy this code and paste into the game's chat box."} -- Assemble final code here
    local labelbox = iup.text{value = ""; rastersize = "75x", tip = "Type what letters you want displayed on the macro button."}
    labelbox.action = function(_,_,v) updatemacro(v) end
    local cmdbox, cmd = cbPowerBindBtn("Command ",macro,"placeholder",nil,300,nil,profile,refreshcb,returncb)
    local slashcmd = "/macro"  

    updatemacro = function(label) 
        iup.Message("updatemacro",tostring(cmd)) --keeps printing a blank box
        label = label or nil
        macrobox.value = slashcmd.." "..label.." \""..cmd.."\""
    end

这是来自 powerbinder.lua 的一些代码:

function cbPowerBindBtn(label,t,v,limit,w,h,profile,refreshcb,returncb,bindtostring)
w = w or 200
h = h or 21
w = w - 21
if not (type(t[v]) == "table") then t[v] = newPowerBind(t[v],limit,profile) end
local bind = t[v]
assert(t[v])
assert(bind)
bindtostring = bindtostring or cbPBindToString
local bindtext = iup.text{value=bindtostring(t[v],profile),rastersize=w.."x"..h}
bindtext.action = function(_,c,s)
    if allowedkeys[c] then return iup.DEFAULT end
    local caret = string.len(s) - _.caret - 1
    bind = {}
    t[v] = bind
    bind.limit = limit or {}
    setmetatable(t[v],pbindmt)
    cbParsePBString(bind,s,limit,profile)
    _.value = cbPBindToString(t[v],profile)
    if c ~= iup.K_BS and c ~= iup.K_DEL then
        _.caret = string.len(_.value) - caret
    elseif c == iup.K_DEL then
        _.caret = string.len(_.value) - caret - 1
    else
        _.caret = string.len(_.value) - caret - 2
    end
    profile.modified = true
    return iup.DEFAULT
end
bindtext.getfocus_cb = function(_)
    _.value = cbPBindToString(t[v],profile)
end
bindtext.killfocus_cb = function(_)
    _.value = bindtostring(t[v],profile)
end

local rtnMacroCmd = 1 --works
local rtnMacroCmd = "test" --works
-- local rtnMacroCmd = cbPBindToString(t[v],profile) --doesn't work
-- local rtnMacroCmd = bindtostring(t[v],profile) --doesn't work
    
local tbtn = iup.button{title = "..."; rastersize = "21x21", tip = cbTTip} --command selection button -TC
tbtn.action = function()
    iup.Message("tbtn",bindtext.value)--works
    rtnMacroCmd = "test2"--doesn't update the variable. Why? -TC
    formPowerBinder(t[v],limit,profile,function()
        bindtext.value = bindtostring(t[v],profile) -- This is what shows a bind to the text box. -TC
        -- This also fires every time user selects a different PB command settings option (like from a dropdown list).
        -- Seems to be triggered by refreshcb(). -TC
        
        --rtnMacroCmd = "test" --doesn't work -TC
        --iup.Message("tbtn",rtnMacroCmd) --prints command -TC
        if refreshcb then refreshcb() end
        --iup.Message("tbtn",rtnMacroCmd) --prints command -TC
    end)
    --iup.Message("tbtn",rtnMacroCmd) --prints command -TC
    if type(returncb) == "function" then
        returncb()
        --iup.Message("function",rtnMacroCmd)
    elseif type(returncb) == "table" and type(returncb.returncb) == "function" then
        returncb.returncb()
        --iup.Message("table",rtnMacroCmd)
    else
        cbdlg.bringfront="YES"
        --iup.Message("other",rtnMacroCmd)--prints command -TC
    end
end
cbTTip = nil
return iup.hbox{iup.label{title = label},iup.fill{},bindtext,tbtn,alignment="ACENTER",margin="0x0"}, rtnMacroCmd
--command selection box. rtnMacroCmd is collected by "cmd" in macromaker.lua -TC

结尾

标签: functionluareturniup

解决方案


推荐阅读