2010-08-06 4 views
1

Могу ли я узнать, максимизировано ли мое окно верхнего уровня, и могу ли я его максимизировать программным путем? Я использую пакет tcltk версии 8.5 для Windows XP.Tcl/Tk: Развернуть окно/определить, если окно максимально?

Причина в том, что я хочу обеспечить выполнение события <Visibility>, позвонив сначала изъять и затем деинифицировать. Однако, если окно было максимизировано перед этими двумя вызовами функций, это не происходит после этих вызовов. Есть ли более простой способ обеспечить соблюдение этого события?

ответ

1

Вы можете узнать, максимизировано ли окно с помощью wm state $toplevel (ищите zoomed в качестве возвращаемого значения). Но ...

ОС не генерирует <Visibility> событий должным образом для вас в Windows; вы только получаете их в отображаемое окно, и это тонко отличается. (Windows говорит вам гораздо меньше о порядке стекирования и его последствиях, чем X. Tk довольно близок к модели X.) Вы не говорите, почему вы хотите это событие; возможно, есть что-то еще, что будет служить вашей реальной цели?

+0

BTW, я использую синтаксис Tcl; вам может понадобиться конвертировать для R (о котором я совершенно не осведомлен). –

+0

R эквивалент вашей команды tkwm.state (toplvl) и работает просто отлично! Что вы подразумеваете под «отображаемым окном»? Цель, которую я связываю с , заключается в следующем: у меня есть окно с кнопкой «Обновить» и ноутбук под этой кнопкой. Теперь я хочу выполнить некоторый код после того, как пользователь нажимает кнопку обновления на текущей выбранной вкладке и на других вкладках всякий раз, когда они выбраны. Решение работает сейчас, насколько я могу видеть, но если есть что-то более естественное, я действительно хотел бы знать. –

+1

@Karsten: Если вы используете ноутбук из набора виджета ttk, вы получаете событие «<< NotebookTabChanged >>» (виртуальное), когда выбрана другая вкладка. Блокнот ttk сообщает, какая вкладка выбрана с помощью '$ nb select' (и никаких дополнительных аргументов). http://www.tcl.tk/man/tcl8.5/TkCmd/ttk_notebook.htm#M29 –

1

Написал функцию, которая передает событие Видимости данному виджету и всем его дочерним элементам.

tkevent.propagate <- function(w,e) { 
    tkevent.generate(w, e) 
    children <- as.character(tkwinfo("children", w)) 
    if(length(children)>0) lapply(children, function(c) tkevent.propagate(c,e)) 
} 

Таким образом, мне не нужно вызывать снятие/удаление и получать мое событие для каждого виджета.

Смежные вопросы