9 дек. 2012 г.

Tcl/Tk: встраивание Tcl-консоли в приложение Tk

Ссылки

Есть программа tkcon, которая реализует продвинутую консоль Tcl, с историей, автодополнением и подсветкой синтаксиса. Ее автор, Jeffrey Hobbs (соавтор книги Practical Programming in Tcl/Tk), поддерживает также пакет megawidget, в который включен виджет Console, основанный на tkcon.

Пакет разрабатывается вместе с tcllib, но распространяется отдельно. Скачать последнюю версию можно здесь (на данный момент это widget-20100219). Этот виджет можно использовать, чтобы предоставить пользователю возможность выполнять Tcl-команды в контексте интерпретатора своего приложения.

Пример



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#! /usr/bin/wish

lappend auto_path /path/to/megawidget/library

package require Console

entry .myentry -highlightcolor red -highlightthickness 2

console .myconsole -setgrid 0 -showmenu false

pack .myentry .myconsole -expand true -fill both

Примечания


Использование в Tcl 8.6

В Tcl 8.6 на данный момент (стабильного релиза еще не было) сломана обратная совместимость в обработке виртуальных событий. Из-за этого в Console не работают некоторые биндинги, в том числе клавиши "вверх" и "вниз" для навигации по истории.

См. Bug #3582795. Автор виджета в курсе событий и написал мне, что пока что не ясна причина поломки совместимости в Tcl, поэтому исправления еще не внесены. Есть также workaround, который исправляет работу клавиш "вверх" и "вниз".


diff -rup widget-20050712.orig/library/console.tcl widget-20050712/library/console.tcl
--- widget-20050712.orig/library/console.tcl 2005-07-13 10:05:18.000000000 +0400
+++ widget-20050712/library/console.tcl 2012-11-30 22:57:16.590578106 +0400
@@ -1597,20 +1597,24 @@ bind Console <<Console_KillLine>> {
     }
 }
 bind Console <<Console_Clear>> [namespace code { _clear [winfo parent %W] }]
-bind Console <<Console_Prev>> [namespace code {
-    if {[%W compare {insert linestart} != {promptEnd linestart}]} {
- tkTextSetCursor %W [tkTextUpDownLine %W -1]
-    } else {
- _event [winfo parent %W] -1
-    }
-}]
-bind Console <<Console_Next>> [namespace code {
-    if {[%W compare {insert linestart} != {end-1c linestart}]} {
- tkTextSetCursor %W [tkTextUpDownLine %W 1]
-    } else {
- _event [winfo parent %W] 1
-    }
-}]
+foreach key [event info <<Console_Prev>>] {
+ bind Console $key [namespace code {
+     if {[%W compare {insert linestart} != {promptEnd linestart}]} {
+   tkTextSetCursor %W [tkTextUpDownLine %W -1]
+     } else {
+  _event [winfo parent %W] -1
+     }
+ }]
+}
+foreach key [event info <<Console_Next>>] {
+ bind Console $key [namespace code {
+     if {[%W compare {insert linestart} != {end-1c linestart}]} {
+  tkTextSetCursor %W [tkTextUpDownLine %W 1]
+     } else {
+  _event [winfo parent %W] 1
+     }
+ }]
+}
 bind Console <<Console_NextImmediate>> [namespace code {
     _event [winfo parent %W] 1
 }]

Опция setgrid

При использовании Console с опцией setgrid (которая включена по-умолчанию) внутри panedwindow можно наткруться на Bug #3466588, из-за чего, в частности, нельзя развернуть окно полностью.

Чтобы избежать этого эффекта, достаточно создать консоль с опцией -setgrid false.

Комментариев нет:

Отправить комментарий