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

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

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

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

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

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


person minimalist50    schedule 02.03.2011    source источник


Ответы (3)


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

person patthoyts    schedule 04.03.2011

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

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 через «опции X11». ::tkcon::embed_args также жизненно важен.

person fk0    schedule 03.09.2014

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

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

В противном случае, если у вас есть BLT, я полагаю, что у него есть возможность переназначать виджеты. Я никогда не пробовал это делать, так что это слухи, но, возможно, он сможет поместить верхний уровень в другой виджет.

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

person Donal Fellows    schedule 02.03.2011
comment
Другой вариант — построить свой собственный. Простую консоль сделать несложно (а вот полнофункциональную гораздо больше работы, дьявол кроется в деталях). - person Donal Fellows; 02.03.2011