R - эквивалент winDialogString в tcltk (tkdialog?)

Что эквивалентно winDialogString в tcltk?


Задний план

Я использовал readline в R, чтобы задать пользователю вопрос и получить ответ:

response <- readline("What's the air speed velocity of an unladen swallow? ")

Сегодня я был на своем ноутбуке с Windows и обнаружил функцию winDialogString, которая выводит небольшое модальное окно сообщения для ввода:

response <- winDialogString("What's the air speed velocity of an unladen swallow? ",
                            default="african or european?")

Я хочу использовать эту функцию, но в интересах переносимости я хотел бы использовать tcltk версию winDialog, чтобы, по крайней мере, мои Linux-боксы также могли иметь это.

Теперь, если бы я использовал winDialog, эквивалент tkmessageBox:

# fairly equivalent, tkmessageBox is more portable.
winDialog(type='yesno','Do you like green eggs and ham?')
tkmessageBox(type='yesno',message='Do you like green eggs and ham?')

Что эквивалентно winDialogString в tcltk?

Я думал, что это tkdialog, поэтому попробовал:

tkdialog("What's the air speed velocity of an unladen swallow?")

Это дает мне эту ошибку:

Error in structure(.External("dotTclObjv", objv, PACKAGE = "tcltk"), class = "tclObj") : 
  [tcl] wrong # args: should be "tk_dialog w title text bitmap default ...".

Документация совершенно бесполезна ?tkdialog указывает на общую страницу справки tk без конкретной документации. Как я могу использовать tkdialog (и это то, что я хочу?)

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

> tkdialog(title='',
           text="What's the air speed velocity of an unladen swallow?",
           bitmap='',default="african or european?")
Error in structure(.External("dotTclObjv", objv, PACKAGE = "tcltk"), class = "tclObj") : 
  [tcl] bad window path name "-title".

> tkdialog(tktoplevel(),title='',
           text="What's the air speed velocity of an unladen swallow?",
           bitmap='',default="african or european?")
Error in structure(.External("dotTclObjv", objv, PACKAGE = "tcltk"), class = "tclObj") : 
  [tcl] bitmap "-text" not defined.

Как я могу заставить это работать? Я бы предпочел остаться в пределах tcltk, а не использовать что-то вроде gWidgets, поскольку tcltk есть в большинстве дистрибутивов R (и если дистрибутив R несовместим с tcltk, я вернусь к readline).

ваше здоровье.


person mathematical.coffee    schedule 14.03.2012    source источник
comment
Не уверен, что ты найдешь его. Для ginput в gWidgetstcltk мне пришлось создать свой собственный. github.com/jverzani/gWidgets2tcltk/blob/master/R/dialogs. Р   -  person jverzani    schedule 14.03.2012
comment
Это позор. Я все еще хотел бы знать, как использовать tkdialog. (Это впечатляющий набор функций, спасибо, что поделились! Однажды я хотел бы поделиться своим личным набором служебных функций, которые я написал для R)   -  person mathematical.coffee    schedule 14.03.2012


Ответы (1)


Ближе всего к тому, что вам нужно, действительно tkdialog, но на самом деле он не предназначен для использования из R; вам придется проделать некоторую работу (и я полностью признаю, что не знаю R, я на стороне Tk). Что я могу сделать, так это объяснить, какими должны быть эти параметры.

Существует документация по базовой команде tk_dialog онлайн. В частности, вам нужно:

  1. Имя окна, которое больше ни для чего не используется. (Это станет именем окна, используемого для реализации диалога.)
  2. Заголовок для диалога.
  3. Некоторый текст для тела диалога.
  4. Строковое имя используемого растрового изображения. Если вы не делаете что-то очень грубое и низкоуровневое, должно быть одно из: error, gray75, gray50, gray25, gray12, hourglass, info, questhead, question, warning (или на OSX вы также получаете эти бонусные изображения системы: document, stationery, edition, application, accessory, folder, pfolder, trash, floppy, ramdisk, cdrom, preferences, querydoc, stop, note, caution).
  5. Отсчитываемый от нуля индекс кнопки по умолчанию. Если -1, по умолчанию нет.
  6. (Ну, 6, 7,...) Текст ставить на кнопки, по одной строке на кнопку.

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


Вы также можете реализовать все это самостоятельно. Код для создания простого диалога не такой уж сложный (tk_dialog написан исключительно поверх обычных функций). Однако я недостаточно хороший программист на R, чтобы помочь вам в этом.

person Donal Fellows    schedule 14.03.2012
comment
Эти аргументы все позиционные, а не именованные. Да, это отличается от остальной части Tk. Нет, не меняем. - person Donal Fellows; 15.03.2012
comment
Спасибо. Судя по вашему ответу, ключ был в том, чтобы не предоставлять никаких именованных аргументов: tkdialog('.windowname','title',"What's the air-speed velocity of an unladen swallow?",'question',-1,'african','european') создает диалог с одной кнопкой для каждого варианта решения. Знаете ли вы о команде tk, которая выводит текстовое поле, позволяющее пользователю вводить данные? В противном случае я сделаю, как вы говорите, и просто реализую один из своих. - person mathematical.coffee; 15.03.2012
comment
Быстро просмотрел документацию, на которую вы ссылались, для модального диалогового окна ввода текста - похоже, мне придется сделать свое собственное. Большое спасибо. - person mathematical.coffee; 15.03.2012