我正在为我写的一个小型控制台程序编写一个包装器
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)
答案 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的等效物。