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.

在函数内部明确指出这一点