Найти какой виджет имеет фокус в Ruby 2.3.3 - PullRequest
0 голосов
/ 08 апреля 2019

В Python я использую:

who = widget.focus_get()

и в Perl:

$who = $widget->focusCurrent;

, чтобы сказать мне, какой виджет имеет фокус. Итак:

  1. Что такое эквивалентный код в Ruby под Linux?
  2. Есть ли хорошая книга или статья о низкоуровневом Ruby Tk? Все статьи, которые я видел, охватывают только упрощенные вещи.

1 Ответ

1 голос
/ 23 апреля 2019

[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 справочная документация.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...