Как я могу встроить TkCon (или другую консоль Tk) в качестве виджета? - PullRequest
2 голосов
/ 02 марта 2011

Я хочу создать приложение Tcl / Tk, которое - в основном - обычный инструмент для работы с меню и кнопками, в котором большая часть взаимодействия осуществляется через графический интерфейс, реализованный в Tcl / Tk.

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

Кажется, достаточно просто запустить TkCon (или пожелать) и получить одно окно верхнего уровня, а затем создать интерфейс моего приложения в отдельном окне верхнего уровня.Приложение будет нормально работать таким образом, но я бы хотел, чтобы два окна были частью одной и той же компоновки, чтобы они могли перемещаться вместе, поддерживать изменение размера и т. Д.

Есть ли простой способ сделать это с TkCon?

Я бы также хотел, чтобы в окне TkCon могли отображаться сообщения, всплывающие из моего приложения (например, вывод отладочной информации).Некоторые сообщения будут генерироваться кодом Tcl;другие на C-коде, который составляет часть моего приложения.Мне не нужно захватывать стандартный вывод как таковой - я готов вызвать специальную функцию для доставки сообщений - но неясно, какой самый эффективный способ заставить их отображаться таким образом.

Ответы [ 3 ]

1 голос
/ 04 марта 2011

Для tkcon, в частности, смотрите ответ Донала.Однако я добавлю, что вы можете встроить встроенную консоль Tk, которая используется в Windows.Этот сценарий доступен не в Windows, и его можно встроить, например, в блокнот с вкладками.См. tkchat_console.tcl для примера этого - файл загружает файл Tk console.tcl, а функция :: tkchat :: EmbeddedConsoleDemo внизу показывает, как вы можете использовать это.

1 голос
/ 03 сентября 2014

У меня работает следующий код:

set f [labelframe $p.console -text "Interactive:"]
frame $f.test -container 1
namespace eval ::tkcon {
    set OPT(exec) {}
    set PRIV(root) .tkcon
    set embed_args {}
}
option add *tkcon.Use [winfo id $f.test] interactive
package require tkcon
tkcon::Init

Этот код добавляет опцию -use к tkcon toplevel через "опции X11". :: tkcon :: embed_args также жизненно важен.

0 голосов
/ 02 марта 2011

Чтение документации Я вижу только способы заставить его работать официально как его собственное окно верхнего уровня.(В частности, tkcon new не принимает никаких аргументов ...) Итак, мы говорим о хаке, чтобы получить то, что вы хотите.

Если у вас Tk 8.6 и вы не используете OSX (илииспользуя сборку на основе платформы X11 на этой платформе), вы можете преобразовать верхний уровень во фрейм с помощью wm forget и встроить его таким образом, но я не знаю, отсутствует ли контроль над именем виджета вэтот случай причинит боль.

В противном случае, если у вас есть BLT , я считаю, что у него есть возможность переопределить виджеты.Я никогда не пытался сделать это, так что это слух, но он может поставить верхний уровень в другой виджет.-use опция для верхнего уровня, который он создает.Это позволило бы разместить его в другом виджете (рамка с включенной опцией -container; вам также нужно было бы собирать вещи вместе с winfo id), но снова,это немного сложно, и я не знаю, каковы последствия этого на вашей платформе.Это должно работать на старых версиях Tk (это было основой того, как функционировал плагин браузера Tcl / Tk).

...