4

我正在编写一个执行一些图像处理的程序,但需要用户在主要处理发生之前在输入图像上输入一些标记。这是通过 Python/Numpy/Scipy 和 PyGTK 完成的。

作为使这成为可能的一种方法,我尝试了一个打开 GUI 的小脚本,并尝试从其主循环中取回一些值,但它不起作用:

import gtk

def getGuiInput(var):
    window = gtk.Window()

    button = gtk.Button('Will <var> be set to 10?')
    window.add(button)

    def submit(widget, event, var):
        var = 10
        gtk.main_quit()

    button.connect('button-press-event', submit, var)

    window.set_position(gtk.WIN_POS_CENTER)
    window.show_all()
    gtk.main()

var = 0
print "before, var is %d" % var
getGuiInput(var)
print "after, var is %d" % var

我非常熟悉创建和布局小部件、连接事件以及使用回调和事件处理程序。

我想知道的是:如何将所有内容放在一个函数中,以便在我的主脚本中调用它以打开一个“输入窗口 GUI”,完成后向调用者返回一个值?如何从 gtk.main() 中获取一些值?

编辑:按照一个答案中给出的建议,我将 Window 小部件换成了 Dialog 小部件,但仍然没有得到我想要的:

import gtk

def run(var):

    dialog = gtk.Dialog("Entre em action")
    dialog.response(1)
    button = gtk.Button('Will <var> be set to 10?')
    dialog.add_action_widget(button, 1)
    button.show()

    def submit(widget, event, var):
        print var
        var = 10

    button.connect('button-press-event', submit, var)

    dialog.run()


var = 0
print "before, var is %d" % var

result = run(var)
print result

print "after, var is %d" % var

感谢您的阅读,如果有任何概念上的缺陷,请纠正我。

4

1 回答 1

2

在一个函数中,您可以将您的窗口创建为一个gtk.Dialog并执行此操作dialog.run(),这将运行第二个 GTK 主循环,该循环仅限于该对话框。(这意味着当辅助循环运行时,您将无法与程序中的其他窗口进行交互。)

如果您使用响应 ID 向对话框中添加按钮,或dialog.response()使用值调用,则该值将是 的返回dialog.run()值。

dialog.add_action_widget(button, 10)
# ...
print 'var is', var
var = dialog.run()
print 'var is now', var  # should be 10 if you clicked the button
于 2012-08-15T13:49:35.033 回答