1

我正在尝试使用 TK 为 Mad Libs 程序在 Ruby 中编写 GUI。本质上,它需要从 Entry 小部件中获取用户的输入,并用该信息替换一行文本中的某些单词。以下是相关代码($content为父窗口):

$name=TkVariable.new()
name=Tk::Tile::Entry.new($content) {width 7; textvariable $name}.grid(:column =>1, :row  =>0, :sticky => 'we')
# Mad Lib base text
$text=TkVariable.new("My name is #{name.get}.")

# Displays end result
def showResult
display=Tk::Tile::Label.new($content) {textvariable $text}.grid(:column =>0, :row     => 6, :sticky => 'we')
end

# Button to replace input in base text.
# Clicking this button adds a new Label widget containing the text. The variables,
#however, retain whatever value they were initialized to (in this case, nothing)
Tk::Tile::Button.new($content) {text 'Submit'; command 'showResult'}.grid(:column => 1,     :row => 5, :sticky => 'we')

据我了解,name.get 应该给我在 Entry 小部件字段中输入的任何内容。然而 name 和 $name 都没有更新。

4

2 回答 2

0

文本变量不能以这种方式工作。看来您正试图将一个文本变量嵌入到另一个中。当您这样做时"My name is #{name.get}.",它会在执行此语句时name获取变量的值,它不会动态更新。

如果您希望条目小部件和标签保持同步,它们需要共享相同的变量。

于 2012-05-29T11:21:31.330 回答
0

不确定但尝试....

def showResult
   $text.value = "My name is #{name.get}."
   display=Tk::Tile::Label.new($content) {textvariable $text}.grid(:column =>0, :row     =>    6, :sticky => 'we')
end

这应该在每次调用 showResult 时更新变量,但不能完全确定使用输入框

这就是我更新 TkVariables 的方式

于 2014-01-25T00:37:02.437 回答