Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python函数打开GTK窗口/对话框并从中获取一些值_Python_Gtk_Window_Pygtk_Main - Fatal编程技术网

Python函数打开GTK窗口/对话框并从中获取一些值

Python函数打开GTK窗口/对话框并从中获取一些值,python,gtk,window,pygtk,main,Python,Gtk,Window,Pygtk,Main,我正在编写一个程序,执行一些图像处理,但需要用户在主处理之前在输入图像上输入一些标记。这是通过Python/Numpy/Scipy和PyGTK实现的 为了实现这一点,我尝试了一个打开GUI的小脚本,并尝试从其主循环中获取一些值,但它不起作用: import gtk def getGuiInput(var): window = gtk.Window() button = gtk.Button('Will <var> be set to 10?') windo

我正在编写一个程序,执行一些图像处理,但需要用户在主处理之前在输入图像上输入一些标记。这是通过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
导入gtk
def getGuiInput(变量):
window=gtk.window()
button=gtk.button('将设置为10?')
窗口。添加(按钮)
def提交(小部件、事件、变量):
var=10
gtk.main_quit()
按钮连接('button-press-event',submit,var)
窗口设置位置(gtk.WIN位置中心)
window.show_all()
gtk.main()
var=0
打印“之前,变量为%d”%var
getGuiInput(变量)
打印“之后,变量为%d”%var
我非常熟悉创建和布局小部件、连接事件以及使用回调和事件处理程序

我想知道的是:如何将所有内容放入函数中,以便在我的主脚本中调用它以打开“输入窗口GUI”,完成后,该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
导入gtk
def运行(var):
dialog=gtk.dialog(“Entre-em-action”)
对话.答复(1)
button=gtk.button('将设置为10?')
对话框。添加操作小部件(按钮,1)
按钮。显示()
def提交(小部件、事件、变量):
打印变量
var=10
按钮连接('button-press-event',submit,var)
dialog.run()
var=0
打印“之前,变量为%d”%var
结果=运行(var)
打印结果
打印“之后,变量为%d”%var

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

在函数中,您可以将窗口创建为
gtk.Dialog
和do
Dialog.run()
,它将运行第二个仅限于该对话框的gtk主循环。(这意味着在二次循环运行时,您将无法与程序中的其他窗口交互。)

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


实际上,我的主程序是从命令行运行的。如果我还没有主窗口,我想我不会调用对话框。这就是为什么我认为我应该从CLI控制流中调用一个打开GUI程序的函数,然后在
gtk.main_quit()
上获取结果,并将控制权返回给调用它的CLI脚本。如果没有主窗口,调用对话框没有错,但您建议的也是同样可能的。好的,但我还是不知道怎么做。我发布的代码根本不起作用。这也没有完全解决。在ruby gtk中,我通过简单地将结果存储在顶级实例变量中来解决这个问题,我可以从父窗口查询该变量。这不是一个优雅的解决方案,但它是有效的。
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