求助,关于windows7 下gtk.main_quit的使用问题
Tofloor
poster avatar
future4329
deepin
2013-09-09 01:25
Author
问题描述:当我在自定义的控件中添加回调函数gtk.main_quit来关闭窗口时,界面就直接死掉了。只能通过再自定义一个函数,如delete_event,再在里面通过调用self.destroy()函数来关闭窗口呢?
请各位大侠帮忙解答一下,谢谢啦!具体代码如下
  1. # -*- coding: utf-8 -*-
  2. import gtk
  3. class PyApp(gtk.Window):
  4.     def delete_event(self,widget,data=None):
  5.         print "Close window"
  6.         self.destroy()
  7.    
  8.     def __init__(self):
  9.         super(PyApp,self).__init__()
  10.         self.set_title("Toolbar")
  11.         self.set_size_request(250,200)
  12.         self.modify_bg(gtk.STATE_NORMAL,gtk.gdk.Color(6400,6400,6440))
  13.         self.set_position(gtk.WIN_POS_CENTER)
  14.         toolbar=gtk.Toolbar()
  15.         toolbar.set_style(gtk.TOOLBAR_ICONS)
  16.         newtb=gtk.ToolButton(gtk.STOCK_NEW)
  17.         opentb=gtk.ToolButton(gtk.STOCK_OPEN)
  18.         savetb=gtk.ToolButton(gtk.STOCK_SAVE)
  19.         sep=gtk.SeparatorToolItem()
  20.         quittb=gtk.ToolButton(gtk.STOCK_QUIT)
  21.         toolbar.insert(newtb,0)
  22.         toolbar.insert(opentb,1)
  23.         toolbar.insert(savetb,2)
  24.         toolbar.insert(sep,3)
  25.         toolbar.insert(quittb,4)
  26.         quittb.connect("clicked",self.delete_event)
  27.         #为什么在这里使用quittb.connect("clicked",gtk.main_quit)时,界面就死掉了?
  28.         vbox=gtk.VBox(False,2)
  29.         vbox.pack_start(toolbar,False,False,0)
  30.         self.add(vbox)
  31.         self.connect("destroy",gtk.main_quit)
  32.         self.show_all()
  33. PyApp()
  34. gtk.main()
Copy the Code
Reply Favorite View the author
All Replies
BingoLove
deepin
2013-09-09 03:53
#1
quittb.connect("clicked", lambda w, e: gtk.main_quit())
这样应该可以
Reply View the author
future4329
deepin
2013-09-14 17:16
#2
quittb.connect("clicked", lambda w, e: gtk.main_quit())
这样应该可以
在ubuntu下是正常的,可是windows 7下仍然会死掉,估计是bug?
Reply View the author
186******98
deepin
2013-09-14 20:48
#3
问题描述:当我在自定义的控件中添加回调函数gtk.main_quit来关闭窗口时,界面就直接死掉了。只能通过再自定义一个函数,如delete_event,再在里面通过调用self.destroy()函数来关闭窗口呢?
请各位大侠帮忙解答一下,谢谢啦!具体代码如下
  1. # -*- coding: utf-8 -*-
  2. import gtk
  3. class PyApp(gtk.Window):
  4.     def delete_event(self,widget,data=None):
  5.         print "Close window"
  6.         self.destroy()
  7.    
  8.     def __init__(self):
  9.         super(PyApp,self).__init__()
  10.         self.set_title("Toolbar")
  11.         self.set_size_request(250,200)
  12.         self.modify_bg(gtk.STATE_NORMAL,gtk.gdk.Color(6400,6400,6440))
  13.         self.set_position(gtk.WIN_POS_CENTER)
  14.         toolbar=gtk.Toolbar()
  15.         toolbar.set_style(gtk.TOOLBAR_ICONS)
  16.         newtb=gtk.ToolButton(gtk.STOCK_NEW)
  17.         opentb=gtk.ToolButton(gtk.STOCK_OPEN)
  18.         savetb=gtk.ToolButton(gtk.STOCK_SAVE)
  19.         sep=gtk.SeparatorToolItem()
  20.         quittb=gtk.ToolButton(gtk.STOCK_QUIT)
  21.         toolbar.insert(newtb,0)
  22.         toolbar.insert(opentb,1)
  23.         toolbar.insert(savetb,2)
  24.         toolbar.insert(sep,3)
  25.         toolbar.insert(quittb,4)
  26.         quittb.connect("clicked",self.delete_event)
  27.         #为什么在这里使用quittb.connect("clicked",gtk.main_quit)时,界面就死掉了?
  28.         vbox=gtk.VBox(False,2)
  29.         vbox.pack_start(toolbar,False,False,0)
  30.         self.add(vbox)
  31.         self.connect("destroy",gtk.main_quit)
  32.         self.show_all()
  33. PyApp()
  34. gtk.main()
Copy the Code

正确的玩法:
quittb.connect("clicked", lambda w: gtk.main_quit())

clicked 信号要传递一个 widget 参数出来, main_quit 函数不接受参数, 所以你需要用 lambda w: 来定义一个匿名函数。

你的挂掉是因为函数回调 main_quit 和 clicked 信号参数不匹配导致的, 程序一定要从终端中看错误, 看手册。

你的错误和 Windows, Linux 无关。
Reply View the author
future4329
deepin
2013-09-29 18:38
#4
[quote]问题描述:当我在自定义的控件中添加回调函数gtk.main_quit来关闭窗口时,界面就直接死掉了。只能通过再自定义一个函数,如delete_event,再在里面通过调用self.destroy()函数来关闭窗口呢?
请各位大侠帮忙解答一下,谢谢啦!具体代码如下
  1. # -*- coding: utf-8 -*-
  2. import gtk
  3. class PyApp(gtk.Window):
  4.     def delete_event(self,widget,data=None):
  5.         print "Close window"
  6.         self.destroy()
  7.    
  8.     def __init__(self):
  9.         super(PyApp,self).__init__()
  10.         self.set_title("Toolbar")
  11.         self.set_size_request(250,200)
  12.         self.modify_bg(gtk.STATE_NORMAL,gtk.gdk.Color(6400,6400,6440))
  13.         self.set_position(gtk.WIN_POS_CENTER)
  14.         toolbar=gtk.Toolbar()
  15.         toolbar.set_style(gtk.TOOLBAR_ICONS)
  16.         newtb=gtk.ToolButton(gtk.STOCK_NEW)
  17.         opentb=gtk.ToolButton(gtk.STOCK_OPEN)
  18.         savetb=gtk.ToolButton(gtk.STOCK_SAVE)
  19.         sep=gtk.SeparatorToolItem()
  20.         quittb=gtk.ToolButton(gtk.STOCK_QUIT)
  21.         toolbar.insert(newtb,0)
  22.         toolbar.insert(opentb,1)
  23.         toolbar.insert(savetb,2)
  24.         toolbar.insert(sep,3)
  25.         toolbar.insert(quittb,4)
  26.         quittb.connect("clicked",self.delete_event)
  27.         #为什么在这里使用quittb.connect("clicked",gtk.main_quit)时,界面就死掉了?
  28.         vbox=gtk.VBox(False,2)
  29.         vbox.pack_start(toolbar,False,False,0)
  30.         self.add(vbox)
  31.         self.connect("destroy",gtk.main_quit)
  32.         self.show_all()
  33. PyApp()
  34. gtk.main()
Copy the Code

正确的玩法:
quittb.connect("clicked", lambda w: gtk.main_quit())

clicked 信号要传递一个 widget 参数出来, main_quit 函数不接受参数, 所以你需要用 lambda w: 来定义一个匿名函数。

你的挂掉是因为函数回调 main_quit 和 clicked 信号参数不匹配导致的, 程序一定要从终端中看错误, 看手册。

你的错误和 Windows, Linux 无关。[/quote]
测试了一下,在LD下正常,在win7下仍然死掉了,囧。。。
Reply View the author