2012-10-01 56 views
0

我已经创建了一个进度条来监视某些R脚本的执行情况。我想在栏中插入一个自定义图标,而不是默认的'Tk'。我能够使用.ico文件和下面的命令R:在Mac和Linux中更改Tcltk窗口的图标

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

做到这一点在Windows,但我是一个有关如何做同样的在Mac OSX和Linux的损失。很显然,.ico格式不起作用,但.png,.jpg,.bmp,.xbm或.xpm都不起作用。有关我如何继续的建议?下面附样图和进度条的代码: -

Sample image 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') 

回答

0

在Linux上设置了图标,wm iconphoto; wm iconbitmap完全可以做其他事情。要做到这一点,您需要创建一个带有图像数据的photo image

我猜你R中写为:

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

我不太确定哪些图像格式是由Tk的版本,你正在使用的,包括任何图像格式支持计划的支持它有可用的。最小集是GIF和PPM,除非你(勇敢地)使用8.6,当PNG默认情况下也是可用的。

(您也可以创建一个照片图像的内容编程,但那是因为各种原因慢。)

OSX不具有同样的意义窗口的图标;当每个最小化窗口最小化到码头时,仅显示其自身的快照是正常的。

+0

谢谢你的回答,Donal。它在Linux(CentOS 5.4)中工作。 但在Mac OSX 10.5(Leopard)中,X Window System图标出现在应用程序名称的左侧。有没有办法在那里添加一个自定义图标? –

+0

您在OSX上使用X11构建?这很不寻常。使用Aqua-native构建,您可以通过'wm属性theWin -titlepath'来控制事物,但我真的不知道X11。我想你可以尝试设置iconphoto;谁知道,它可能会工作... –