2012-10-01 60 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;誰知道,它可能會工作... –