2013-03-06 2 views
1

Я создаю небольшой фрагмент графического интерфейса, который должен быть заполнен для продвижения потока. То, что я хочу, чтобы создать процедурный, который создает графический интерфейс пользователя и возвращает 1 или 0, когда GUI закрыт, а затем поток продолжается, как это:Возможно ли создать графический интерфейс, возвращающий значение с помощью Tcl?

first part of the code 
... 
... 
if {![open_gui]} { 
    return 
} 
second part of the code 
... 
... 

Графический интерфейс прост 3 записи с сохраняемый и отменяют кнопки , если нажата кнопка сохранения, тогда некоторые значения должны быть сохранены в модели данных и функция для возврата 1, если нажата кнопка отмены или графический интерфейс закрыт, закрыв окно, тогда ничего не должно произойти, и proc для возврата 0.

Возможно ли это?

Прямо сейчас, что я сделал, это разбить код на два слоя, (и code_part_2) Я запускаю первую часть, затем открываю графический интерфейс, а кнопка сохранения вызывает вторую часть, а отмена просто закрывает графический интерфейс:

code_part_1 
open_gui_split 

и функция open_gui_split является:

proc open_gui_split {} { 
    # ... 
    set save_b [button $win.save_b -text save -command [list code_part_2] 
    # ... 
} 

* - Весь код представлен только представление архитектуры, а не реальный код.

ответ

2

Полностью можно создавать команды, которые запускают графический интерфейс Tk, ожидая ответа от пользователя и возвращающего это значение. Ключ к выполнению, что является tkwait команда:

proc popUpButton {w} { 
    toplevel $w 
    pack [button $w.b -text "push me" -command [list destroy $w]] 
    # This waits in the event loop until $w is destroyed... 
    tkwait window $w 
    return "button was pushed" 
} 

puts "about to pop up the button" 
puts ">>[popUpButton]<<" 
puts "popped up the button" 

tkwait поставляется в трех вариантах:

  1. tkwait window $w ждет окна $w быть уничтожены.
  2. tkwait visibility $w ждет окна $w, чтобы стать видимым (но не работает на платформах, отличных от Unix/X11).
  3. tkwait variable $varname ждет переменную $varname, которая должна быть установлена; это как обычный Tcl vwait (и фактически vwaitбыл первоначально tkwait variable перед интеграцией цикла событий в Tcl).

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

Наконец, чтобы увидеть более полный пример того, как все это работает, посмотрите на source to tk_dialog (это точно версия от Tk 8.4.19, прямо из нашего репозитория), которая является просто старым кодом Tcl и делает вид вещь, о которой вы следите. Это гораздо более полностью обработанный пример, чем я хочу писать, демонстрируя такие вещи, как, как получить возвращаемое значение, основанное на пользовательском вводе.

+0

Возможно выпрямить путаницу кода, которая возникает из всего этого, используя сопрограммы Tcl 8.6, но это гораздо более сложная тема в другое время. –

Смежные вопросы