关于在Lua中使用IUP.Text:action

朋友们。

在附加文件中,我展示了一个使用IUP GUI的Lua语言表单的示例。

现在的需求是在第一个文本框中每按下一个键都进行一些计算,结果必须显示在第二个文本框中。

我发现的问题是答案出现较晚...这意味着...

按下一个数字键...但是结果没有显示出来。

按下第二个数字键...显示的结果好像只有第一个数字在第一个文本框中。

按下第三个数字键...显示的结果好像只有前两个数字在第一个文本框中。

依此类推。

你能告诉我代码的不一致之处吗?

我的目标是开发7GUIs提出的七个GUI: https://github.com/eugenkiss/7guis

但我需要解决一些像这样的问题。

谢谢,朋友们。

HERNAN.

---------------------------------
-- Temperatura.lua
-- Hernán Cano Martínez
-- Ene-2018
---------------------------------

package.cpath = "?.dll;?53.dll;lua533/?.dll;lua533/?53.dll;"   -- [在Windows中]

require ( "iuplua" )

-- iup.key_open()  -- 自IUP 3.0 RC 3以来已经过时且不再必要。

-- ***************************************************************************

-- 我们将在表格中使用的控件

txtC = iup.text   { value="0"          , expand='NO', floating='NO', rastersize = "70"   , cx="030", cy= "30", font ="Courier New, 10", NC='10', ACTIVE='YES', ALIGNMENT='ACENTER' }
lblC = iup.label  { title = "摄氏度 =", expand='NO', floating='NO', rastersize = "85x25", cx="110", cy= "27", font ="Courier New, 10" }  -- 尺寸以像素为单位

txtF = iup.text   { value="0"          , expand='NO', floating='NO', rastersize = "70"   , cx="200", cy= "30", font ="Courier New, 10", NC='10', ACTIVE='YES', ALIGNMENT='ACENTER' }
lblF = iup.label  { title = "华氏度", expand='NO', floating='NO', rastersize = "85x25", cx="280", cy= "27", font ="Courier New, 10" }  -- 尺寸以像素为单位

btnC = iup.button { title = "关闭"   , expand='NO', floating='NO', rastersize = "75x25", cx="200", cy="100", font ="Segoe IU, 9", TIP='点击以关闭' }

-- ***************************************************************************

-- 控件容器

vArea = iup.cbox{ expand='NO', floating='NO', size = "450x200",
  txtC, lblC, txtF, lblF, --btnC,
  nil
}

-- 表单

frmTemperatura = iup.dialog{ expand='NO', floating='NO',
  vArea,
  title = "温度",
  size = "300x100"
}

-- ********************************** 回调 *************************************

function btnC:action()
  -- 退出主循环
  return iup.CLOSE
end

function txtC:action(t)

   if txtC.value and tonumber(txtC.value) then
      local nNum = 0
      nNum = tonumber(txtC.value)
      txtF.value = nNum * (9/5) + 32
   end
   -- return iup.CONTINUE  -- HCM: 我不确定
end

function txtF:action(t)

   if txtF.value and tonumber(txtF.value) then
      local nNum = 0
      nNum = tonumber(txtF.value)
      txtC.value = nNum * (9/5) + 32
   end
   -- return iup.CONTINUE  -- HCM: 我不确定
end

--------------------------------------------

-- 现在:显示表单

frmTemperatura:showxy(iup.CENTER,iup.CENTER)

-- 为了能够在其他上下文中运行此脚本
-- if (iup.MainLoopLevel()==0) then
if (not iup.MainLoopLevel or iup.MainLoopLevel()==0) then
  iup.MainLoop()
end

----------------------------------------------
点赞
用户1898478
用户1898478

动作回调函数是在值修改期间被调用的,所以如果在回调函数中查询属性,它将返回旧的值。新值将作为回调函数的参数传递。所以你应该更改你的代码为:

function txtC:action(c, new_value)
   if new_value and tonumber(new_value) then
      local nNum = tonumber(new_value)
      txtF.value = nNum * (9/5) + 32
   end
end

function txtF:action(c, new_value)
   if new_value and tonumber(new_value) then
      local nNum = tonumber(new_value)
      txtC.value = (nNum - 32) * (5/9)
   end
end
2018-01-17 10:42:14