Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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 2.7 为什么gtk.main_quit()不起作用?_Python 2.7_Gtk_Pygtk - Fatal编程技术网

Python 2.7 为什么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

我是新来的。:)

我很难从C中的GTK+迁移到PyGTK,特别是我不明白为什么(在暂停/播放按钮的特定上下文中)GTK.main_quit()即使被调用也不做任何事情

在我的工作示例中,按“播放”后,按“暂停”,然后尝试使用“退出”按钮。在我这方面,“退出”按钮,即使它调用gtk.main_Quit()(并在它之后打印内容以证明它是正确的),也不会对程序产生任何影响。你知道我做错了什么吗

这是:

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(意味着不应该再次调用该函数)
  • 正在播放的广告