Python一秒钟后我就不能退出GUI了gtk.main公司()叫做永不退出,我怎么能退出?

2024-04-25 22:39:48 发布

您现在位置:Python中文网/ 问答频道 /正文

运行后如何退出GUIgtk.main公司() ? 1秒后不退出 退出的唯一方法是使用以下方法:

$echo“断开连接”| nc本地主机58887

import re,os, time, socket, datetime, threading, subprocess
import gobject, gtk

gobject.threads_init()

class gui(object):

  def listener(self, sock, *args):
    conn, addr = sock.accept()
    gobject.io_add_watch(conn, gobject.IO_IN, self.handler)
    return True

  def handler(self, conn, *args):
    line = conn.recv(4096)
    if not len(line):
      return False
    else:
      if line:
        if line.startswith("disconnect"):
          self.quit(self.window)
      return True

  def __init__(self):
    self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
    self.window.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(6400, 6400, 6440))
    self.window.set_size_request(300, 220)
    self.window.set_border_width(1)
    self.window.set_decorated(False)
    self.window.set_title("TPT")
    self.window.move(250,200)
    self.window.set_name("main window")
    self.window.connect("delete-event", gtk.main_quit)
    self.drawingarea = gtk.DrawingArea()
    self.window.add(self.drawingarea)

  def run(self):
    self.sock = socket.socket()
    self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    self.sock.bind(('', 58887))
    self.sock.listen(1)
    gobject.io_add_watch(self.sock, gobject.IO_IN, self.listener)    
    self.window.show_all()
    self.window.set_keep_above(True)
    if(self.window.get_window().get_state() == gtk.gdk.WINDOW_STATE_MAXIMIZED):
      self.window.unmaximize()    
    gtk.main()

    time.sleep(1)
    gtk.main_quit()

  def quit(self, window):
    gtk.main_quit()

if __name__=='__main__':
    os.system("lsof -i tcp:58887 | grep LISTEN | awk '{print $2}' | xargs kill -9;")
    s=gui()
    s.run()
    gobject.MainLoop.run()

Tags: selfaddgtkreturnifmaindefline
2条回答

例如,这几乎可以工作。在

步骤1:要触发的外部程序

#!/bin/bash
sleep 2
# do other task
ps aux | grep test.py | awk '{print $2}' | xargs kill -9;
# do other task, its my world i do what i want.... bla bla bla...:P

第2步:穿线

^{pr2}$

gtk.main()是一个阻塞函数,因此在调用gtk.main_quit()(异步)之前,下一行代码不会被执行/解释。实现所需内容的一种可能方法是在调用gtk.main()之前使用^{}添加一个timeout,如下所示:

...
    if(self.window.get_window().get_state() == gtk.gdk.WINDOW_STATE_MAXIMIZED):
      self.window.unmaximize()
    gobject.timeout_add(1000, gtk.main_quit)
    gtk.main()
...

无需后续调用sleep和main quit。
另外,s.run()之后的gobject.MainLoop.run()也不是必需的。在

希望这有帮助!在

相关问题 更多 >