我正在尝试学习Julia语言,而我当前的项目是“连续5个”程序。我开始为此游戏在Gtk上使用Julia包装器创建界面,但偶然发现了一个有趣的问题。代码在下面。
问题是:回调函数工作后,cur_step变量未更改,并且按钮的标签也未更改。但是,如果我删除了回调函数中的if-condition,则按一下按钮后,按钮都将获得标签“ x”。
我正在使用Jupyter Notebook中的Julia 1.0编写代码。
我曾尝试将cur_step变量设置为全局变量,因为自认为这是一个范围问题,但没有解决。
using Gtk
cur_step = "x"
function click_once_callback(widget)
set_gtk_property!(widget, :sensitive, false)
set_gtk_property!(widget, :label, cur_step)
if cur_step == "x"
cur_step = "o"
else
cur_step = "x"
end
end
letters = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o']
win = GtkWindow("GoMoku")
g = GtkGrid()
buttons = []
for i=1:15
b = []
for j=1:15
letter = letters[i]
push!(b,GtkButton("$letter:$j"))
end
push!(buttons,b)
end
for i=1:15
for j=1:15
g[i,16-j] = buttons[i][j]
id = signal_connect(click_once_callback, buttons[i][j], "clicked")
end
end
set_gtk_property!(g, :column_homogeneous, true)
set_gtk_property!(g, :column_spacing, 15) # introduce a 15-pixel gap between columns
set_gtk_property!(g, :row_spacing, 15) # introduce a 15-pixel gap between rows
push!(win, g)
showall(win)
为什么全局变量不会通过回调函数更改?我希望在单击每个按钮后可以迭代地更改cur_step。 预先谢谢你!
答案 0 :(得分:1)
您需要将cur_step标记为函数的全局内部(以及外部,以实现良好的代码路标)。
一个函数可以使用其父范围中的变量而不会出现问题,只要该函数范围内的任何地方都没有赋值即可。如果某处有一个赋值(即使它位于if块中),则该函数将被解释为局部函数;甚至在分配任务发生之前都是如此。
为了正确地将在函数内部某个位置分配的变量视为全局变量,您需要使用global cur_step
明确地在函数内部指出该变量。