如何实时更新文本框的值?

0 投票
1 回答
840 浏览
提问于 2025-04-16 00:17

我在Blender里做了一个图形界面,用户的使用场景应该是这样的:

用户按下“运行”按钮后,可以在输入框里输入句子,每个句子都要以一个句号 '.' 结束。然后,如果用户输入了一个句子,输入框就会清空,输入的句子会显示在输出框里。

问题出现在以下这段代码中:

while 1:
  input = Textbox1.val
  if input.__contains__('.'):
    Textbox1.val = ''
    Textbox2.val = input

这是我所有的代码:

import Blender

from Blender.BGL import *

from Blender.Draw import *

def draw_gui():

global Textbox1, Textbox2

Textbox1 = Create('input')

Textbox2 = Create('output')

glClearColor(0.753, 0.753, 0.753, 0.0)

glClear(GL_COLOR_BUFFER_BIT)

glColor3f(0.000, 0.000, 0.627)

glRecti(20, 150, 730,500)

Button('Exit', 1, 450, 220, 87, 31)

Button('Quit', 2, 350, 220, 87, 31)

Button('Run', 3, 250, 220, 87, 31)

Textbox1 = String('', 4, 50, 400, 650, 50, Textbox1.val, 399, '')

Textbox2 = String('', 4, 50, 300, 650, 50, Textbox2.val, 399, '')

def event(evt, val):

  if (evt==QKEY and not val): Exit()

def bevent(evt):

  if evt == 1: #cmdExit

              Exit()

   elif evt == 2 : #cmdQuit

           Blender.Quit()

   elif evt == 3 : #cmdRun

########################### from here the problem starts

           while 1:

               input =Textbox1.val

               if input.__contains__('.'):

                   Textbox1.val=''

                   Textbox2.val=input

#################### and here is the end of it

   Blender.Redraw()

Register(draw_gui, event, bevent)

1 个回答

1

这是很早以前的Blender版本(在Blender 2.5之前),那个时候几乎不可能做到你想要的功能。不过现在的Blender(自2.5系列以来,目前是2.67版本)可以通过一个模型操作来解决这个问题,这个操作还可以在Python的时间事件上触发。不久前我在这里回答了另一个StackOverflow的问题:https://stackoverflow.com/a/16744008/2419030。这个回答提供了一个简单的结构,用于在当前Blender中创建一个可以监听时间事件的模态操作。它还链接了一个简单的康威生命游戏的实现,作为模态操作运行。

在你的情况下,你需要检查一个输入框的值(你可以创建自己的面板,和Blender的其他部分无缝集成),并更新你想要响应的其他部分。在示例文件中,模态处理器执行了模拟的一步。你会注意到整个界面保持响应。

具体来说,你需要在'model()'处理器的'TIMER'条件块下进行检查。

要创建面板(和其他形式的脚本),打开Blender的文本编辑器,查看模板菜单。你会发现很多很好的资源。

撰写回答