2012-08-15 35 views
2

我正在编写一个程序,它执行一些图像处理,但需要用户在输入图像上输入一些标记,然后才能进行主处理。这是用Python/Numpy/Scipy和PyGTK完成的。Python函数打开GTK窗口/对话框并从中获得一些值

的方式来做到这一点,我想这将打开一个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()中获得一些价值?

编辑:继一个答案给出的建议,我换了窗口小部件的对话之一,但仍然没有得到我想要的:

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 

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

回答

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 
+0

其实,我的主程序从命令行运行。如果我还没有主窗口,我想我不会打电话给对话框。这就是为什么我认为我应该从CLI控制流程中调用一个打开GUI程序的函数,然后将结果放在'gtk.main_quit()'上,并将控制权交给调用它的CLI脚本。 – heltonbiker 2012-08-15 13:51:43

+0

如果您没有主窗口,调用对话框没有任何问题,但您建议的内容同样可行。 – ptomato 2012-08-15 17:29:21

+0

好的,但我仍然不知道该怎么做。我发布的代码根本行不通。 – heltonbiker 2012-08-15 19:15:05

相关问题