R: Изменить значок окна Tcltk в Mac и Linux.

Я создал индикатор выполнения, чтобы следить за выполнением некоторых R-скриптов. И я хочу вставить собственный значок в панель вместо стандартного «Tk». Я могу сделать это в Windows, используя файл .ico и следующую команду

tcl('wm', 'iconbitmap', .win, 'Icon.ico')

Но я не знаю, как сделать то же самое в Mac OSX и Linux. Очевидно, что формат .ico не работает, как и .png, .jpg, .bmp, .xbm или .xpm. Любое предложение о том, как я могу действовать? Образец изображения и штрих-код выполнения прикреплены ниже:

http://tinypic.com/r/jt8efn/6 – http://tinypic.com/r/jt8efn/6

tkProgressBar2 <- function (title = 'Test progress bar', label = '', min = 0, max = 100, initial = 0, width = 300, userfn='helvetica', backg='white') {
  useText <- FALSE
  have_ttk <- as.character(tcl('info', 'tclversion')) >= '8.5'
  if (!have_ttk && as.character(tclRequire('PBar')) == 'FALSE') useText <- TRUE
  .win <<- tktoplevel(background=backg)
  tkfocus()
  tcl('wm', 'geometry', .win, '500x100+450+350')
  tcl('wm', 'iconbitmap', .win, '@Icon.xbm')
  .val <- initial
  .killed <- FALSE
  tkwm.geometry(.win, sprintf('%dx80', width + 40))
  tkwm.title(.win, title)
  fn <- tkfont.create(family = userfn, size = 12)
  if (useText) {
    .lab <- tklabel(.win, text = label, font = fn, padx = 0, background=backg)
    tkpack(.lab, side = 'left')
    fn2 <- tkfont.create(family = userfn, size = 16)
    .vlab <- tklabel(.win, text = '0%', font = fn2, padx = 20, background=backg)
    tkpack(.vlab, side = 'right')
    up <- function(value) {
      if (!is.finite(value) || value < min || value > max) return()
      .val <<- value
      tkconfigure(.vlab, text = sprintf('%d%%', round(100 * (value - min)/(max - min))))
    }
  } else {
    .lab <- tklabel(.win, text = label, font = fn, pady = 0, background=backg)
    .tkval <- tclVar(0)
    tkpack(.lab, side = 'top')
    tkpack(tklabel(.win, text = '', font = fn, background=backg), side = 'bottom')
    pBar <- if (have_ttk)
      ttkprogressbar(.win, length = width, variable = .tkval) else
        tkwidget(.win, 'ProgressBar', width = width, variable = .tkval)
    tkpack(pBar, side = 'bottom')
    up <- function(value) {
      if (!is.finite(value) || value < min || value > max) return()
      .val <<- value
      tclvalue(.tkval) <<- 100 * (value - min)/(max - min)
    }
  }
  getVal <- function() .val
  kill <- function() if (!.killed) {
    tkdestroy(.win)
    .killed <<- TRUE
  }
  title <- function(title) tkwm.title(.win, title)
  lab <- function(label) tkconfigure(.lab, text = label)
  tkbind(.win, '<Destroy>', function() stop())
  up(initial)
  structure(list(getVal = getVal, up = up, title = title, label = lab, kill = kill), class = 'tkProgressBar')
}

pb <- tkProgressBar2(title='Performing k-Means clustering', label='Some information in %', min=0, max=100, initial=0, width=400, userfn='verdana', backg='white')

person tejas_kale    schedule 01.10.2012    source источник


Ответы (1)


В Linux вы устанавливаете значок с помощью wm iconphoto; wm iconbitmap делает что-то совершенно другое. Для этого вам нужно создать фотоизображение. с данными изображения в нем.

Я предполагаю, что вы пишете это в R как:

tcl('wm', 'iconphoto', .win, tcl('image', 'create', 'photo', '-file', 'Icon.gif'))

Я не совсем уверен, какие форматы изображений поддерживаются используемой вами версией Tk, включая любые доступные пакеты поддержки форматов изображений. Минимальный набор — это GIF и PPM, если только вы (отважно) не используете 8.6, когда PNG также доступен по умолчанию.

(Вы также можете создавать содержимое фотоизображения программно, но это медленно по разным причинам.)

OSX не имеет значков окон в том же смысле; это нормально, когда каждое свернутое окно просто показывает свой снимок, когда оно свернуто в док-станцию.

person Donal Fellows    schedule 01.10.2012
comment
Спасибо за ответ, Донал. Он работал в Linux (CentOS 5.4). Но в Mac OSX 10.5 (Leopard) значок системы X Window отображается слева от имени приложения. Есть ли способ добавить собственный значок? - person tejas_kale; 01.10.2012
comment
Вы используете сборку X11 на OSX? Это необычно. С нативной сборкой Aqua вы управляете вещами через wm attributes theWin -titlepath, но я действительно ничего не знаю о X11. Я полагаю, вы могли бы попробовать установить значок фото; кто знает, может сработает... - person Donal Fellows; 01.10.2012