[T] о, скажите мне, какой виджет имеет фокус [... w], то есть эквивалентный код в Ruby под Linux?
Приблизительно эквивалентно, если у вас есть три Tkобъекты (например), затем вы можете сказать (в Ruby):
array = [tk_object_1, tk_object_2, tk_object_3]
path = Tk.focus.path
index = array.find_index {|e| e.path == path}
object = array.at index
РЕДАКТИРОВАТЬ: Или, проще говоря:
object = Tk.focus
Вот как определить, какой объект (из ваших многочисленныхTk объекты) это:
array = [tk_object_1, tk_object_2, tk_object_3]
index = array.find_index {|e| e == object}
(конец редактирования.)
Мне удалось найти документацию для метода focus
(в обеих оболочках Ruby и оригинальный Tcl ) и для метода path
(в Ruby-оболочке ).
Я написал программу, которая демонстрирует настройку и получение фокуса:
require 'tk'
def focus_array
@focus_array ||= [
f_content, e_content,
to_one, e_one,
to_two, e_two,
]
end
def focus_array_class_width_max
@focus_array_class_width_max ||= focus_array.map {|e| e.class.to_s.length}.max
end
def focus_delay
milliseconds = 1000
Tk.after milliseconds, lambda_focus_rotate
nil
end
def focus_force(object)
force = true
Tk.focus_to object, force
nil
end
def focus_print
path = Tk.focus.path
index = focus_array.find_index {|e| e.path == path}
s = klass_justified index
puts "Item #{index}'s class and path are: #{s} #{path}"
nil
end
def focus_rotate
@counter += 1
index = @counter % focus_array.length
puts '' if 0 == index
focus_force focus_array.at index
nil
end
def klass_justified(index)
focus_array.at(index).class.to_s.ljust focus_array_class_width_max
end
def lambda_focus_rotate
@lambda_focus_rotate ||= Kernel.lambda do
focus_rotate
focus_print
focus_delay
end
end
def main
root.title = 'Root'
objects_create
@counter = -1 # Start before first.
focus_delay
Tk.mainloop
nil
end
def objects_create
# Keep order:
e_content
e_one
e_two
nil
end
def spacing_set(object)
object.width 7
object.grid padx: 40
end
#-------------
# Tk objects:
def e_content
@e_content ||= begin
e = Tk::Tile::Entry.new f_content
spacing_set e
end
end
def e_one
@e_one ||= begin
e = Tk::Tile::Entry.new to_one
spacing_set e
end
end
def e_two
@e_two ||= begin
e = Tk::Tile::Entry.new to_two
spacing_set e
end
end
def f_content
$f_content ||= begin
f = Tk::Tile::Frame.new root
f.grid
end
end
def root
$root ||= TkRoot.new
end
def to_one
@to_one ||= TkToplevel.new f_content
end
def to_two
@to_two ||= TkToplevel.new f_content
end
main
Это работает для меня, используя Ruby 2.2.5 (с Tk 8.5.12) в Windows 7.
Есть ли хорошая книга или статья о низкоуровневом Ruby Tk?Все статьи, которые я видел, охватывают только упрощенные вещи.
Насколько мне известно, никто не написал подробное описание оболочки Руби для Tk (по крайней мере, не на английском языке).Тем не менее, у нас есть RDoc документация обертки, и мы можем читать книги, описывающие, как использовать Tk на других языках.Я думаю, что лучшим (для целей Ruby) является Learning Perk / Tk Нэнси Уолш (1999).Вот его ссылки на Amazon , Alibris и O'Reilly (вместе с примером кода ).
Также мы можем grep
исходный код библиотеки обертки (поскольку он установлен на наших компьютерах).
Делая это для константы TkToplevel
(например), можно получить файл /Ruby/lib/ruby/2.2.0/tk/toplevel.rb
(или где бы он ни находился)находится в вашей системе).
В этом файле поиск (для строки TkToplevel
) обнаруживает, что константа, похоже, определена как псевдоним для класса Tk::Toplevel
, который задокументирован здесь .
В конечном счете, для изучения того, как делать необычные вещи в Ruby с помощью Tk, требуются довольно трудные усилия.
Хорошие результаты в отношении конкретных проблем были получены путем запроса на форуме Ruby..
Учебное пособие TkDocs очень полезно, наряду с командами Tcl-language Tk справочная документация.