Как я могу обновить значение текстового поля в режиме реального времени? - PullRequest
0 голосов
/ 22 июня 2010

У меня есть графический интерфейс в 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 голос
/ 03 июня 2013

Это очень старый Blender (до Blender 2.5), и тогда это было практически невозможно сделать. В текущем Blender'е (начиная с серии 2.5, в настоящее время в версии 2.67 на момент написания этой статьи) вы можете решить эту проблему с помощью оператора модели, который также запускается во временных событиях Python. Не так давно я ответил на еще один вопрос здесь: https://stackoverflow.com/a/16744008/2419030. Это дает простую структуру для такого модального оператора в текущем Blender, который также слушает события времени. Также имеется ссылка на простую реализацию Conways Game of Life, выполняющую роль модального оператора.

В вашем случае вы будете проверять значение поля ввода (вы можете создавать свои собственные панели, которые легко интегрируются в остальную часть блендера) и обновлять другие части, которые вы хотите отреагировать на него. В файле примера модальный обработчик выполняет один шаг симуляции. Вы заметите, что весь интерфейс остается отзывчивым.

В частности, вы будете выполнять проверки в обработчике model () в блоке if TIMER.

Чтобы создать панели (и другие формы скриптов), откройте текстовый редактор Blender и проверьте пункт меню «Шаблоны». Вы найдете огромное количество хороших вещей.

...