Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解ruby中的Tk列表框_Ruby_Tk - Fatal编程技术网

理解ruby中的Tk列表框

理解ruby中的Tk列表框,ruby,tk,Ruby,Tk,我正试图制作一个小程序,将一些数据转换成可用的形式。我希望它能做的一件事是能够选择一些文件并对它们执行操作,所以我想我应该使用Tk中的listbox对象来实现这一点。我希望能够打开一个文件,并看到它的文件名显示在列表框中。据我所知,这正是在listbox中使用listvariable的目的。然而,当我运行代码时,列表框永远不会更新(尽管listvariable中已经存在的项目显示良好) 这是一个接近MWE的例子。我做错了什么?我误解了什么基本思想 require 'tk' require 'tk

我正试图制作一个小程序,将一些数据转换成可用的形式。我希望它能做的一件事是能够选择一些文件并对它们执行操作,所以我想我应该使用Tk中的listbox对象来实现这一点。我希望能够打开一个文件,并看到它的文件名显示在列表框中。据我所知,这正是在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

我是否需要以其他顺序编写它?

只需添加一行代码:

$populate_list.value = $path_list
在这一条下:

$path_list.push(path)
这对我很管用,虽然看起来很奇怪


TkVariable
为您的ruby变量创建一个代理,从而将您的ruby var引用与Tk小部件连接起来。但我不知道为什么代理变量的变化不会影响它所指向的变量。我不确定它是否应该自动这样做

不,不应该。创建TkVariable时,传递的值只是初始化的值,它不指向其他变量。所以他给它传递了一个空数组,并初始化为空数组。这太棒了。没有看到它如何不起作用是令人沮丧的,但这是有道理的。我对这一切都不熟悉,所以我想我应该习惯于调试奇怪的东西。。谢谢