Python函数打开GTK窗口/对话框并从中获取一些值
我正在编写一个程序,执行一些图像处理,但需要用户在主处理之前在输入图像上输入一些标记。这是通过Python/Numpy/Scipy和PyGTK实现的 为了实现这一点,我尝试了一个打开GUI的小脚本,并尝试从其主循环中获取一些值,但它不起作用: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
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
和doDialog.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