質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

1回答

4421閲覧

rubyのtkについて・・・

probaseball

総合スコア113

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

1グッド

1クリップ

投稿2015/11/04 16:46

ruby/tkの入力フォームから数字を入力し、その入力された数ぶんボタンを新しいウィンドウに作成、表示させたいのですが、どうすればよろしでしょうか。
下記のソースではエラーが出てしまいます。
エラーは`<main>': bad value for range (ArgumentError)とでてきます。

ruby

1#! ruby -Ks 2 3STDOUT.sync = true 4 5require 'tk' 6 7new_window = TkToplevel.new do 8 9 title("チェッカー") 10 11end 12 13TkRoot.new do#タイトルバーの表示 14 15 title("タイトル") 16 17end 18 19input_line_txt = "" #最初は空の文章 20 21print_label = TkLabel.new do #入力した文章の表示 22 23 pack 24 25end 26 27input_line_txt = TkEntry.new do #入力中の文章 28 29 width(50) 30 31 focus 32 33 pack 34end 35 36TkButton.new do#入力確認のボタン 37 38 text("入力確定") 39 40 command do 41 42 print_label.text("入力された数は"+ input_line_txt.value) 43 44 $qestion_number = input_line_txt.value 45 46 $qestion_number = $qestion_number.to_i 47 48 end 49 50 pack 51 52end 53for i in 0..$qestion_number 54 55 TkButton.new(new_window) do 56 57 text "button#{i}" 58 59 pack 'side'=>'left' 60 61 end 62 63end
DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

bad value for range (ArgumentError)は、範囲演算子..のパラメーターが正しくないことを示しています。

処理の順番はこの場合、各コントロールが配置された後にすぐ、for i in 0..$qestion_numberが実行されるため、$qestion_numberが初期化されていません。nilになっています。
forの直前でp $qestion_numberを実行してみると分かります。

(ちなみに「質問」の英単語のつづりはq"u"estionです。)

Ruby/Tkに限らず、GUIの処理は大抵このように、コントロールを操作したときの処理をイベントで処理するようになっています。
このプログラムでは、command doの中のコードがイベント時に実行される処理です。
for i in 0..$qestion_numberの部分はGUIのイベントとは関係なく処理されるので、即時に実行されます。

あと、この処理が正常に終了しても、すぐにプログラムが終了してしまうはずです。
Tkでは、GUIの処理を続行するために、メインループ状態に入る必要があります。

プログラムの最後でTk.mainloopを実行しましょう。

とりあえず動く状態にするには、このように修正します。

lang

1# 前半省略 2 3TkButton.new do#入力確認のボタン 4 5 text("入力確定") 6 7 command do 8 9 print_label.text("入力された数は"+ input_line_txt.value) 10 11 $qestion_number = input_line_txt.value 12 13 $qestion_number = $qestion_number.to_i 14 15 for i in 0..$qestion_number 16 17 TkButton.new(new_window) do 18 19 text "button#{i}" 20 21 pack 'side'=>'left' 22 23 end 24 25 end 26 27 end 28 29 pack 30 31end 32 33Tk.mainloop 34

投稿2015/11/05 07:38

argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

probaseball

2015/11/05 10:40

ありがとうございます!解決しました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問