了解ruby中的Tk Listbox

时间:2013-02-03 20:04:20

标签: ruby tk

我正在尝试制作一个小程序,将某些数据变成可用的形式。我希望它做的一件事是能够选择一些文件并对它们执行操作,所以我想我会在Tk中使用listbox对象来做到这一点。我希望能够打开一个文件并查看其列表框中显示的文件名。据我所知,这恰恰是列表框中使用listvariable的原因。然而,当我运行我的代码时,列表框永远不会更新(尽管listvariable变量中的项目显示正常)。

所以这里接近MWE。我做错了什么,我误解了什么基本想法?

require 'tk'
require 'tkextlib/tile'

$path_list = []
$populate_list = TkVariable.new( $path_list )

def get_file
  file = Tk.getOpenFile
  file = open(file) unless file.empty?
  path = File.basename(file, ".out")
  if $path_list.include?(path)
    Tk.messageBox(
        'type'    => "ok",
        'icon'    => "warning",
        'title'   => " - Minimum Working Example - ",
        'message' => "This file has already been added! Nothing was added to the list"
    )
  else
    $path_list.push(path)
  end
end

root = TkRoot.new {title "- Minimum Working Example -"}
frame = Tk::Tile::Frame.new(root) {padding "3 3 12 12"}.grid( :sticky => 'nsew') # 'north south east west'
TkGrid.columnconfigure root, 0, :weight => 1; TkGrid.rowconfigure root, 0, :weight => 1

$file_listbox = Tk::Listbox.new(frame) {
  listvariable $populate_list}.grid( :column => 1, :row => 0, :rowspan => 6)

Tk::Tile::Button.new(frame) {
  width 15; text 'Open file...'; command {get_file}}.grid( :column => 0, :row => 1)

Tk.mainloop

我是否可能必须以其他顺序编写它?

1 个答案:

答案 0 :(得分:3)

只需添加一行代码:

$populate_list.value = $path_list

在这一个:

$path_list.push(path)

它对我有用,虽然看起来很奇怪。

TkVariable为您的ruby变量创建代理,从而使用Tk小部件桥接您的ruby var引用。但我不知道为什么代理var的变化不会影响它指向的var。我不确定它是否应该自动执行此操作。