0

我在脚本中使用 pygtk 创建了 TreeView() 表。在那一列文本框中是密码类型,如果我输入密码,它会显示字符,但密码应该是保密的。所以我想,当我输入密码时,它会像隐形(*)一样显示给我。

我的代码写在下面

    #   columns
    (
      COLUMN_EDITABLE,
      COLUMN_USER,
      COLUMN_PSW,
    ) = range(3)
    model = gtk.ListStore(
       gobject.TYPE_BOOLEAN,
       gobject.TYPE_STRING,
       gobject.TYPE_STRING,
    )
    treeview = gtk.TreeView(model)

    #Password column
    renderer = gtk.CellRendererText()
    renderer.set_property('cell-background', '#efefef')
    renderer.set_fixed_size(120,20)
    renderer.connect("edited", self.on_cell_edited, model)
    renderer.set_data("column", COLUMN_PSW)
    column = gtk.TreeViewColumn("Password", renderer, text=COLUMN_PSW,
                           editable=COLUMN_EDITABLE)
    treeview.append_column(column)

现在有人建议我解决这个问题,我该怎么做

提前致谢..

4

2 回答 2

1

您需要连接到editing-started文本渲染器的信号并在处理程序visibility中将 GtkEditable 的属性设置为False。为了避免在用户完成编辑后显示密码,您应该将text属性设置为固定字符串并清除editing-started处理程序中可编辑的内容。

def on_cell_edited_started(self, cell, editable, path):
    editable.delete_text(0, -1)
    editable.set_visibility(False)

然后在__init__

self.renderer.set_property("text", "*****")
self.renderer.connect("editing-started", self.on_cell_editing_started)

更新:

我无法用 . 之后显示的文本重现您的问题***。我已将您的代码修改如下。当我点击编辑时,文本被清除,当我完成编辑时,它又回到***

回调:

def on_cell_editing_started(self,cell, editable, path):
    editable.delete_text(0,-1)
    editable.set_visibility(False)
def on_cell_edited(self, renderer, path, new_text, model):
    iter = model.get_iter(path)
    model.set_value(iter, COLUMN_PSW, new_text)

设置渲染器:

    # psw column
    self.renderer = gtk.CellRendererText()
    self.renderer.connect("editing-started", self.on_cell_editing_started)
    self.renderer.connect("edited", self.on_cell_edited, model)
    self.renderer.set_property("text", "***")
    column = gtk.TreeViewColumn("Password", self.renderer ,editable=COLUMN_EDITABLE)
    treeview.append_column(column)  
    sw.add(treeview)
    self.show_all()

其他一切都与您共享的最新文件中的一样。我怀疑您已经以某种方式设置了text渲染器的属性,set_property并且还绑定了一个列。我将在接下来的 10 天左右下线,如果您仍然遇到问题,请仔细阅读文档并仔细检查您的代码,以便您了解每一行在做什么。

于 2013-11-16T10:25:50.253 回答
0

以下是上述问题的答案,但使用语言 c#。

我做了一些调查,在gtkmm 文档页面上发现了以下代码

void ExampleWindow::cellrenderer_validated_on_editing_started(
    Gtk::CellEditable* cell_editable, const Glib::ustring& /* path */)
{
   //Start editing with previously-entered (but invalid) text, 
   //if we are allowing the user to correct some invalid data. 
   if(m_validate_retry)
   {
      //This is the CellEditable inside the CellRenderer. 
      Gtk::CellEditable* celleditable_validated = cell_editable;

      //It's usually an Entry, at least for a CellRendererText:
      Gtk::Entry* pEntry = dynamic_cast<Gtk::Entry*>(celleditable_validated);
      if(pEntry)
      {
         pEntry->set_text(m_invalid_text_for_retry);
         m_validate_retry = false;
         m_invalid_text_for_retry.clear();
      }
   }
}

它指出底层的可编辑可以转换为 gtk 条目。使用此条目,您可以轻松地将可见性设置为 false,将不可见的字符设置为“*”。

所以要把所有东西放在一起:

  • 在初始化时将 celltextrenderer 设置为默认字符串“***”
  • 钩住事件编辑开始
    • 在处理程序内部将可编辑内容转换为 gtk 条目
    • 清除 gtk 条目
    • 在条目上将可见性设置为 false
    • 将不可见字符设置为“*”
  • 钩住事件编辑
    • 提取新值并存储它。

在c#中的解决方案下方:

// INIT
_textRenderer = new CellRendererText();
_textRenderer.Editable = true;
_textRenderer.EditingStarted += TextEditingStarted;
_textRenderer.Edited += TextEdited;
_textRenderer.Text = "***";

private void TextEditingStarted(object o, EditingStartedArgs args)
{
  if (args.Editable is Entry entry)
  {
    entry.InvisibleChar = '*';
    entry.Visibility = false;
    entry.Text = string.Empty;
  }
}

private void TextEdited(object o, EditedArgs args)
{
   var s = args.NewText;
   Console.WriteLine($"Password is {s}");
}
于 2020-04-02T12:27:04.053 回答