使用后关闭pygtk对话框窗口

时间:2013-08-21 18:24:09

标签: events user-interface fork pygtk wrapper

我正在为我写的一个小型控制台程序编写一个包装器 c程序需要一个密码字符串作为输入,因为我打算通过dmenu等使用它,我想用一个小的gtk输入框输入该字符串。
但是,我得到输入后必须进行分叉(因为我也处理了一段时间后需要删除的剪贴板内容),并且窗口在子进程退出之前不会关闭。

from subprocess import Popen, PIPE
from gi.repository import Gtk
import sys
import os
import time
import getpass

HELP_MSG = "foobar [options] <profile>"

class EntryDialog(Gtk.Dialog):

    def run(self):
        result = super(EntryDialog, self).run()
        if result == Gtk.ResponseType.OK:
            text = self.entry.get_text()
        else:
            text = None
        return text

    def __init__(self):
        super(EntryDialog, self).__init__()
        entry = Gtk.Entry()
        entry.set_visibility(False)
        entry.connect("activate", 
                      lambda ent, dlg, resp: 
                          dlg.response(resp), 
                          self, 
                          Gtk.ResponseType.OK)
        self.vbox.pack_end(entry, True, True, 0)
        self.vbox.show_all()
        self.entry = entry

def get_pwd():
    if sys.stdin.isatty():
        return getpass.getpass()
    else:
        prompt = EntryDialog()
        prompt.connect("destroy", Gtk.main_quit)
        passwd = prompt.run()
        prompt.destroy()
        return passwd 

我的想法是,它应该在我进入时关闭,但我很确定我做的事情完全错了。 该脚本基本上是这样的:

profile = argv[0]
pwd = get_pwd()

if pwd is None:
    print(HELP_MSG)
    sys.exit()

out = doStuff()
text_to_clipboard(out)

# now fork and sleep!
if os.fork():
    sys.exit()

time.sleep(10)

clear_clipboard()

sys.exit(0)

1 个答案:

答案 0 :(得分:0)

我删除了python包装器并直接在c中编写。但是,对于任何有相同问题的人来说,(未经测试的)解决方案是添加一个函数

def quit():
    self.emit("destroy")

其中'self'是对话框 - 并将其连接到“activate”信号,

entry.connect("activate", quit)

这样一旦用户点击Return,对话框小部件就会发出破坏信号,从而调用Gtk.main_quit。
在c中,可以通过指定GtkEntryBuffer并调用它来很好地提取内容

gtk_entry_buffer_get_text()

我现在没有找到它,但可能有一个pygtk的等效物。