Использование функций Python в Tkinter.Tcl () - PullRequest
3 голосов
/ 24 апреля 2010
  1. У меня есть несколько функций Python. Давайте назовем их foo, bar и baz. Они принимают переменное число строковых аргументов и делают другие сложные вещи (например, доступ к сети).

  2. Я хочу, чтобы «пользователь» (предположим, он знаком только с Tcl) писал сценарии на Tcl с использованием этих функций.

Вот пример (взятый из Macports ), который может предложить пользователь:

post-configure {
    if {[variant_isset universal]} {
        set conflags ""
        foreach arch ${configure.universal_archs} {
            if {${arch} == "i386"} {append conflags "x86 "} else {
                if {${arch} == "ppc64"} {append conflags "ppc_64 "} else {
                    append conflags ${arch} " "
                }
            }
        }

        set profiles [exec find ${worksrcpath} -name "*.pro"]
        foreach profile ${profiles} {
            reinplace -E "s|^(CONFIG\[ \\t].*)|\\1 ${conflags}|" ${profile}

            # Cures an isolated case
            system "cd ${worksrcpath}/designer && \
                    ${qt_dir}/bin/qmake -spec ${qt_dir}/mkspecs/macx-g++ -macx \
                    -o Makefile python.pro"
        }
    }
}

Здесь variant_issset, reinplace и т. Д. (Кроме встроенных в Tcl) реализованы как функции Python. if, foreach, set и т. Д. Являются обычными конструкциями Tcl. post-configure - это функция Python, которая принимает блок кода Tcl, который впоследствии может быть выполнен (что, в свою очередь, в конечном итоге вызовет вышеупомянутые "функции" Python).

Возможно ли это сделать в Python? Если да, то как?

from Tkinter import *; root= Tk(); root.tk.eval('puts [array get tcl_platform]') - единственная известная мне интеграция, которая явно очень ограничена (не говоря уже о том, что она запускает сервер X11 на Mac).

Ответы [ 2 ]

7 голосов
/ 25 апреля 2010

Проведя небольшой эксперимент, я обнаружил, что вы можете сделать что-то подобное для создания интерпретатора tcl, зарегистрировать команду python и вызвать ее из Tcl:

import Tkinter

# create the tcl interpreter
tcl = Tkinter.Tcl()

# define a python function
def pycommand(*args):
    print "pycommand args:", ", ".join(args)

# register it as a tcl command:
tcl_command_name = "pycommand"
python_function = pycommand
cmd = tcl.createcommand(tcl_command_name, python_function)

# call it, and print the results:
result = tcl.eval("pycommand one two three")
print "tcl result:", result

Когда я запускаю приведенный выше код, я получаю:

$ python2.5 /tmp/example.py
pycommand args: one, two, three
tcl result: None
0 голосов
/ 28 июня 2012

@ Брайан - мне пришлось экспериментировать, чтобы получить правильный результат

from Tkinter import Tcl
tcl = Tcl()
result = tcl.eval(' puts "hello, world" ')

Обратите внимание на размещение одинарных и двойных кавычек.Это дало мне ожидаемый результат: привет, мир

Любые другие комбинации одинарных или двойных кавычек привели к следующей трассировке:

  File "<stdin>", line 1, in <module>
_tkinter.TclError: can not find channel named "hello,"

--- fracjackmac

...