Julia + GTK - 回调中的全局变量变化
Julia + GTK - global variable change in callback
我正在尝试学习 Julia 语言,我目前的项目是“5 in a row”程序。我开始为这款游戏在 Gtk 上使用 Julia wrapper 制作界面,但偶然发现了一个有趣的问题。代码如下。
问题是:回调函数工作后cur_step变量没有变化,按钮标签也没有变化。但是,如果我删除回调函数中的 if 条件,按钮将在按下后全部获得标签 "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。
提前致谢!
您需要将 cur_step 标记为全局 在您的函数内 (以及外部,以便进行良好的代码路标)。
函数可以毫无问题地使用其父作用域中的变量,只要函数作用域内的任何地方都没有赋值。如果某处有赋值(即使它在 if 块中),那么该函数将被解释为局部函数;即使在其分配发生之前也是如此。
为了将在函数内部某处分配的变量正确地视为全局变量,您需要使用 global cur_step
.
在函数内部明确指出这一点
我正在尝试学习 Julia 语言,我目前的项目是“5 in a row”程序。我开始为这款游戏在 Gtk 上使用 Julia wrapper 制作界面,但偶然发现了一个有趣的问题。代码如下。
问题是:回调函数工作后cur_step变量没有变化,按钮标签也没有变化。但是,如果我删除回调函数中的 if 条件,按钮将在按下后全部获得标签 "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。 提前致谢!
您需要将 cur_step 标记为全局 在您的函数内 (以及外部,以便进行良好的代码路标)。
函数可以毫无问题地使用其父作用域中的变量,只要函数作用域内的任何地方都没有赋值。如果某处有赋值(即使它在 if 块中),那么该函数将被解释为局部函数;即使在其分配发生之前也是如此。
为了将在函数内部某处分配的变量正确地视为全局变量,您需要使用 global cur_step
.