2

いくつかのデータを使用可能な形式に変更するための小さなプログラムを作成しようとしています。私がやりたいことの1つは、いくつかのファイルを選択してそれらに対してアクションを実行できるようにすることです。そのため、Tkのリストボックスオブジェクトを使用してそれを行うと思いました。ファイルを開いて、そのファイル名がリストボックスに表示されるようにしたいと思います。私が読んだ限りでは、これはまさにリストボックスで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

他の順序で書く必要があるのでしょうか?

4

1 に答える 1

3

1行のコードを追加するだけです。

$populate_list.value = $path_list

これの下で:

$path_list.push(path)

奇妙に見えますが、それは私にとってはうまくいきます。

TkVariableruby変数のプロキシを作成して、rubyvar参照をTkウィジェットとブリッジします。しかし、プロキシ変数の変更がそれが指す変数に影響を与えない理由はわかりません。それが自動的に行われるべきかどうかはわかりません。

于 2013-02-08T06:27:56.920 に答える