查找哪个小部件在Ruby 2.3.3中具有焦点

时间:2019-04-08 06:08:52

标签: ruby tk

在Python中,我使用:

who = widget.focus_get()

和在Perl中:

$who = $widget->focusCurrent;

告诉我哪个窗口小部件具有焦点。所以:

  1. Linux下Ruby中的等效代码是什么?
  2. 是否有关于低级Ruby Tk的好书或文章?我看过的所有文章都只涉及简单的内容。

1 个答案:

答案 0 :(得分:1)

  

[T] o告诉我哪个窗口小部件具有焦点[... w]在Linux下Ruby中的等效代码是什么?

同样,如果您有三个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 wrapper 和原始的 Tcl) 并使用path方法(在 Ruby wrapper

我写了一个程序来演示如何设置和获得焦点:

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

在Windows 7上使用Ruby 2.2.5(带有Tk 8.5.12)时,它对我有用。

  

是否有关于低级Ruby Tk的好书或文章?我看过的所有文章都只涉及简单的内容。

据我所知,没有人对Ruby的Tk包装程序进行过详尽的描述(至少不是英语)。但是,我们有包装的 RDoc 文档,我们可以阅读介绍如何使用其他语言的Tk的书籍。我认为最好的(对于Ruby而言)是Nancy Walsh(1999)的 Learning Perk / Tk 。这是其链接 AmazonAlibrisO'Reilly(及其example code)。

我们还可以grep包装器的库源代码(因为它已安装在我们的计算机上)。

例如,对常量TkToplevel执行此操作将导致文件/Ruby/lib/ruby/2.2.0/tk/toplevel.rb(或该文件在您系统上的任何位置)。

在该文件中,搜索(查找字符串TkToplevel)表明该常量似乎已定义为类Tk::Toplevel的别名,已记录在案 here

要研究如何使用Tk在Ruby中完成不寻常的事情,最终要花费相当大的努力。

通过询问以下问题获得了关于特定问题的良好结果 Ruby forum

TkDocs 教程以及Tcl语言非常有帮助 Tk commands 参考文档。