TCL/tk как открыть папку

Я пытаюсь открыть папку из tcl/tk, используя приведенную ниже команду.

eval exec [auto_execok start] [list $folderpath]

это дает мне ошибку в синтаксисе неверно.

в командной строке tclsh, когда я пробовал start $folderpath, открывается папка.

Любая помощь приветствуется.


person pcbnagaraj    schedule 05.09.2012    source источник
comment
это сработало, как показано ниже eval exec [auto_execok start] {$folderpath} спасибо   -  person pcbnagaraj    schedule 05.09.2012
comment
Интересно, есть ли где-нибудь FAQ по использованию start с exec? Это постоянный источник проблем для новичков в Tcl, и проблема на самом деле из-за огромного ужаса интерфейса start  -  person Donal Fellows    schedule 06.09.2012


Ответы (3)


Код, который вы использовали, почти правильный. Вы хотели этого:

eval exec [auto_execok start] [list "" $folderpath]

Это потому, что вам нужен был этот дополнительный пустой аргумент для использования start (это «заголовок» окна для создания, и он довольно неясен, если вы привыкли вводить только относительные имена файлов). Это специфическая особенность start в сочетании с тем, как Tcl цитирует данные, поступающие через интерфейс создания процессов Windows; что происходит, так это то, что Tcl помещает " символов вокруг непростых аргументов (почти всегда правильно), и это приводит к тому, что start запутывается и делает неправильные действия, что приводит к сообщению об ошибке. Это довольно ужасно, но добавление дополнительного пустого аргумента решает проблему.

Вам также может понадобиться преобразовать этот путь в собственный формат, если это еще не сделано:

eval exec [auto_execok start] [list "" [file nativename $folderpath]]

(Как узнать, является ли он родным? Проверьте, является ли разделитель каталогов / — стандартом Tcl, также родным для Unix и OSX — или \ — который использует Windows.)

В некоторых случаях вам может понадобиться file attributes $folderpath -shortname для решения проблем. Надеюсь, вам это не нужно! (Честно говоря, в наши дни почти ничего не работает; это было важно только в системах до XP, хотя иногда оно остается полезным при работе с очень длинными путями.)


Формы совместимости

Вам рекомендуется использовать синтаксические изменения, предложенные Гленном, если вы используете Tcl 8.5 (или более позднюю версию), поскольку они понятнее, проще в использовании и немного быстрее (не то, чтобы последнее имело здесь большое значение; разница в скорости будет быть просто шумом по сравнению со стоимостью запуска подпроцесса):

exec {*}[auto_execok start] "" [file nativename $folderpath]

Если вы используете версию 8.4 (устаревшую, но поддерживаемую) или более раннюю версию (почему!?), используйте форму с eval формами выше.

person Donal Fellows    schedule 06.09.2012
comment
Я использую 8.4, потому что они поставляются с другим инструментом (каденцией) в качестве встроенного пакета. Спасибо, Нагарадж. - person pcbnagaraj; 11.09.2012
comment
Как насчет линукса? выше не работает. вывод не может быть выполнен /home/user/Desktop: разрешение отклонено - person OliveOne; 05.04.2021

решение glenn не будет работать для папок, содержащих пробелы. Мое решение:

set dir {C:\Program Files\Microsoft Office};# example
set escaped_dir [string map {\\ \\\\} [file nativename $dir]]
eval exec [auto_execok start] explorer $escaped_dir

Но я хочу знать, как открыть папку по умолчанию, потому что я использую альтернативный файл.

person Yusuke    schedule 06.09.2012

Если вы используете tcl 8.5, вы можете написать: exec {*}[auto_execok start] $folderpath

person glenn jackman    schedule 05.09.2012
comment
Я использую 8.4. Но eval exec [auto_execok start] {$folderpath} — это то, что мне нужно, чтобы открыть расположение папки. У меня есть виджет, открывающий папку, при нажатии на эту кнопку должна открываться папка назначения в Windows. Они хорошо работают в Windows 7, но в Windows XP зависают. При расследовании я обнаружил, что файл start.exe не находится в пути Windows, где exec фактически ищет ... понял, как справиться с ... любое предложение приветствуется. Спасибо, Нагарадж. - person pcbnagaraj; 11.09.2012