Python 2.7 为什么gtk.main_quit()不起作用?
我是新来的。:) 我很难从C中的GTK+迁移到PyGTK,特别是我不明白为什么(在暂停/播放按钮的特定上下文中)GTK.main_quit()即使被调用也不做任何事情 在我的工作示例中,按“播放”后,按“暂停”,然后尝试使用“退出”按钮。在我这方面,“退出”按钮,即使它调用gtk.main_Quit()(并在它之后打印内容以证明它是正确的),也不会对程序产生任何影响。你知道我做错了什么吗 这是:Python 2.7 为什么gtk.main_quit()不起作用?,python-2.7,gtk,pygtk,Python 2.7,Gtk,Pygtk,我是新来的。:) 我很难从C中的GTK+迁移到PyGTK,特别是我不明白为什么(在暂停/播放按钮的特定上下文中)GTK.main_quit()即使被调用也不做任何事情 在我的工作示例中,按“播放”后,按“暂停”,然后尝试使用“退出”按钮。在我这方面,“退出”按钮,即使它调用gtk.main_Quit()(并在它之后打印内容以证明它是正确的),也不会对程序产生任何影响。你知道我做错了什么吗 这是: import pygtk pygtk.require('2.0') import gtk, gobj
import pygtk
pygtk.require('2.0')
import gtk, gobject, cairo
import time
global paused
paused = False
running = False
def some_stuff(widget, data=None):
global paused
global running
x = 0
if running:
return
running = True
paused = False
while True:
x += 1
print x
while gtk.events_pending():
gtk.main_iteration(False)
while paused:
while gtk.events_pending():
gtk.main_iteration(False)
running = False
paused = False
def pause_stuff(widget, data=None):
global paused
paused = not paused
def force_quit(widget, data=None):
print 'before'
gtk.main_quit() # doesn't work, gtk main loop keeps running
#exit() # obviously works to kill everything
print 'after'
def main():
window = gtk.Window()
window.connect("delete-event", force_quit)
window.show()
vbox = gtk.VBox(True, 3)
vbox.show()
window.add(vbox)
button = gtk.Button("Play")
button.connect("clicked", some_stuff, None)
vbox.add(button)
button.show()
button = gtk.Button("Pause")
button.connect("clicked", pause_stuff, None)
vbox.add(button)
button.show()
button = gtk.Button("Quit")
button.connect("clicked", force_quit, None)
vbox.add(button)
button.show()
window.present()
gtk.main()
return 0
if __name__ =="__main__":
main()
gtk.main_quit()
指示gtk主循环终止。它在代码中没有效果,因为some_stuff()
函数实现自己版本的主循环,不受对gtk.main_quit()的调用影响。由于外部while
永远不会退出,一旦单击播放按钮,您就永远不会返回到真正的GTK主循环
一个正确的GTK程序不会像some_stuff()
那样重新实现主循环,这正是为了避免此类问题,也为了避免在没有任何事情发生时进行繁忙的循环。while gtk.events_pending():gtk.main_iteration()
习惯用法应该非常谨慎地使用,只有在绝对必要的情况下(更新一个进度条)才可以使用。gtk.main_quit()
指示gtk主循环终止。它在代码中没有效果,因为some_stuff()
函数实现自己版本的主循环,不受对gtk.main_quit()的调用影响。由于外部while
永远不会退出,一旦单击播放按钮,您就永远不会返回到真正的GTK主循环
一个正确的GTK程序不会像some_stuff()
那样重新实现主循环,这正是为了避免此类问题,也为了避免在没有任何事情发生时进行繁忙的循环。while gtk.events_pending():gtk.main_iteration()
习惯用法应该非常谨慎地使用,只有在绝对必要的情况下(更新一个进度条)才可以使用。gtk.main_quit()
指示gtk主循环终止。它在代码中没有效果,因为some_stuff()
函数实现自己版本的主循环,不受对gtk.main_quit()的调用影响。由于外部while
永远不会退出,一旦单击播放按钮,您就永远不会返回到真正的GTK主循环
一个正确的GTK程序不会像some_stuff()
那样重新实现主循环,这正是为了避免此类问题,也为了避免在没有任何事情发生时进行繁忙的循环。while gtk.events_pending():gtk.main_iteration()
习惯用法应该非常谨慎地使用,只有在绝对必要的情况下(更新一个进度条)才可以使用。gtk.main_quit()
指示gtk主循环终止。它在代码中没有效果,因为some_stuff()
函数实现自己版本的主循环,不受对gtk.main_quit()的调用影响。由于外部while
永远不会退出,一旦单击播放按钮,您就永远不会返回到真正的GTK主循环
一个正确的GTK程序不会像some_stuff()
那样重新实现主循环,这正是为了避免此类问题,也为了避免在没有任何事情发生时进行繁忙的循环。while gtk.events_pending():gtk.main_iteration()
习惯用法应该非常谨慎地使用,只有在绝对必要的情况下才可以使用(我想到了更新进度条)。根据注释将此作为答案添加到另一个答案中(因为注释有点长)。让我们假设一个游戏迭代很快,您可以在gtk主线程中进行一次迭代,而不会损害UI
制作一个运行游戏一次迭代的函数(首先,你可以打印一些东西)。该函数应该是一个“空闲处理程序回调”(见下文)。它应该返回True,除非游戏暂停或停止:在这种情况下,它应该返回False(意味着不应该再次调用该函数)
In Play()为迭代函数添加一个
在Pause()中,更新暂停的变量,如果取消暂停,还可以添加一个空闲处理程序,如In Play()
这样,在调用Play之后,迭代函数会一直被调用(但UI也会被更新)。暂停后,仍会调用迭代函数一次,但它将返回False,并且不会再次调用 根据注释将此作为答案添加到另一个答案中(因为这对于注释来说有点长)。让我们假设一个游戏迭代很快,您可以在gtk主线程中进行一次迭代,而不会损害UI
制作一个运行游戏一次迭代的函数(首先,你可以打印一些东西)。该函数应该是一个“空闲处理程序回调”(见下文)。它应该返回True,除非游戏暂停或停止:在这种情况下,它应该返回False(意味着不应该再次调用该函数)
In Play()为迭代函数添加一个
在Pause()中,更新暂停的变量,如果取消暂停,还可以添加一个空闲处理程序,如In Play()
这样,在调用Play之后,迭代函数会一直被调用(但UI也会被更新)。暂停后,仍会调用迭代函数一次,但它将返回False,并且不会再次调用 根据注释将此作为答案添加到另一个答案中(因为这对于注释来说有点长)。让我们假设一个游戏迭代很快,您可以在gtk主线程中进行一次迭代,而不会损害UI
制作一个运行游戏一次迭代的函数(首先,你可以打印一些东西)。该函数应该是一个“空闲处理程序回调”(见下文)。它应该返回True,除非游戏暂停或停止:在这种情况下,它应该返回False(意味着不应该再次调用该函数)
正在播放的广告