如何使pygtk中的特定子项可以编辑列 [英] How to make column editable for particular child in pygtk

查看:224
本文介绍了如何使pygtk中的特定子项可以编辑列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在下图中,您可以看到3个父母子窗口。其实我做了一个代码,它会根据父母显示所有的孩子。这是正确显示,但我想用户名&密码列仅可编辑数据库父(如第三个窗口)。其他不应该是可编辑的。



在我的情况下,父项的所有子项都是可编辑的。



这里是我的代码

 #!/ usr / bin / env python 

import pygtk
pygtk.require('2.0')
导入gtk,gobject
导入os
导入cairo,gio,pango,pangocairo,atk

class BasicTreeViewExample:

#关闭窗口并退出
def delete_event(self,widget,event,data = None):
gtk.main_quit()
返回False

def col1_toggled_cb(self,cell,path,model):
model [path] [1] = not model [path] [1]

def on_cell_edited(self,cell,path_string ,new_text,model):
printhi
#cell.set_property('editable',False)
iter = model.get_iter_from_string(new_text)
path = model.get_path (iter)[0]
column = cell.get_data(username)

def __init __(self):
#创建一个新窗口
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)

self.window.set_title(Basic TreeView Example)

self.window.set_size_request(400,400)

self.window.connect(delete_event,self.delete_event)
self.treestore = gtk.TreeStore(gobject.TYPE_STRING,gobject.TYPE_BOOLEAN,gobject.TYPE_BOOLEAN,gobject.TYPE_STRING, (2):
piter = self.treestore.append(None,['Computer%i'%parent,False,False,'',''])
pit = self.treestore.append(piter,['Drive',False,False,'',''])
pith = self.treestore.append(piter,['Database',False ,假,'',''])
范围内的孩子(2):
self.treestore.append(pit,['child',True,True,'',''])
范围内的孩子(2):
self.treestore.append(髓,['child',True,True,'user ,'psw'])
self.treeview = gtk.TreeView(self.treestore)

self.cell = gtk.CellRendererText()
self.tvcolumn = gtk.TreeViewColumn (Computer Name,self.cell,text = 0)
self.cell.set_property('editable',False)

self.cell0 = gtk.CellRendererToggle()
self.tvcolumn0 = gtk.TreeViewColumn(Select Drive,self.cell0,active = 1,visible = 2)
self.cell0.set_property('activatable',True)
self.cell0。 connect('切换',self.col1_toggled_cb,self.treestore)

self.cell1 = gtk.CellRendererText()
self.tvcolumn1 = gtk.TreeViewColumn(username,self.cell1 ,text = 3,visible = 2)
self.cell1.set_property('editable',True)
self.cell1.connect(editing-started,self.on_cell_edited,self.treestore)

self.cell2 = gtk.CellRendererText()
self.tvcolumn2 = gtk.TreeViewColumn(password,self.cell2 ,text = 4,visible = 2)
self.cell2.set_property('editable',True)
self.treeview.append_column(self.tvcolumn)
self.treeview.append_column(self .tvcolumn0)
self.treeview.append_column(self.tvcolumn1)
self.treeview.append_column(self.tvcolumn2)
self.treeview.set_reorderable(True)
self.window .add(self.treeview)
self.window.show_all()

def main():
gtk.main()

if __name__ ==__main__:
tvexample = BasicTreeViewExample()
main()

有人帮我解决这个问题。



谢谢...

p>这里的答案类似于上一个问题的答案:您需要用额外的列来扩展树存储,该列指定您关心的属性 - 在这种情况下,特定行的用户名/密码单元格的可编辑性以及连接那个stor显示并编辑用户名和密码的树列视图。



提供的代码只需设置可编辑属性为true,这意味着该属性可以在任何地方编辑。



tutorials 来详细解释GTK树视图。这是一个来自问题的代码版本,根据我的理解进行了修改以符合您的需求。



pre $!$ / usr / bin / env python
$ b $ import pygtk
pygtk.require('2.0')
导入gtk,gobject
导入os
导入cairo,gio,pango ,pangocairo,atk

class BasicTreeViewExample:

#关闭窗口并退出
def delete_event(self,widget,event,data = None):
gtk.main_quit()
返回False

def col1_toggled_cb(self,cell,path,model):
model [path] [1] = not model [path] [ 1
$ b $ def on_cell_edited(self,cell,path_string,new_text,model):
printhi
#cell.set_property('editable',False)
iter = model.get_iter_from_string(new_text)
path = model.get_path(iter)[0]
column = cell.get_data(username)

def __init __(self ):
#创建一个新窗口
self.wi ndow = gtk.Window(gtk.WINDOW_TOPLEVEL)

self.window.set_title(Basic TreeView Example)

self.window.set_size_request(400,400)

self.window.connect(delete_event,self.delete_event)
self.treestore = gtk.TreeStore(gobject.TYPE_STRING,gobject.TYPE_BOOLEAN,gobject.TYPE_BOOLEAN,gobject.TYPE_STRING,gobject。 (2):
piter = self.treestore.append(None,['Computer%i'%parent,False,False,'','') ,假)]
pit = self.treestore.append(piter,['Drive',False,False,'','',False])
pith = self.treestore.append(piter, ['Database',False,False,'user','psw',True])
范围内的孩子(2):
self.treestore.append(pit,['child',True ,True,'','',False])
范围内的孩子(2):
self.treestore.appen d(pith,['child',True,True,'','',False])
self.treeview = gtk.TreeView(self.treestore)

self.cell = gtk.CellRendererText()
self.tvcolumn = gtk.TreeViewColumn(Computer Name,self.cell,text = 0)
self.cell.set_property('editable',False)

self.cell0 = gtk.CellRendererToggle()
self.tvcolumn0 = gtk.TreeViewColumn(Select Drive,self.cell0,active = 1,visible = 2)
self.cell0。 set_property('activatable',True)
self.cell0.connect('toggled',self.col1_toggled_cb,self.treestore)

self.cell1 = gtk.CellRendererText()
self.tvcolumn1 = gtk.TreeViewColumn(username,self.cell1,text = 3,visible = 5,editable = 5)
self.cell1.connect(editing-started,self.on_cell_edited,self .treestore)

self.cell2 = gtk.CellRendererText()
self.tvcolumn2 = gtk.TreeViewColumn(password,self.cell2,text = 4 ,可见= 5,editable = 5)
self.treeview.append_column(self.tvcolumn)
self.treeview.append_column(self.tvcolumn0)
self.treeview.append_column(self.tvcolumn1 )
self.treeview.append_column(self.tvcolumn2)
self.treeview.set_reorderable(True)
self.window.add(self.treeview)
self.window.show_all ()
$ b $ def main():
gtk.main()

if __name__ ==__main__:
tvexample = BasicTreeViewExample()
main()


In below picture you can see the 3 parent child window. actually I made one code which will show all child according to parent. that is showing correctly but i want username & password column editable for database parent only(like as 3rd window). other should not be editable.

In my case all child of parent is editable.

here is my code

#!/usr/bin/env python

import pygtk
pygtk.require('2.0')
import gtk, gobject
import os
import cairo, gio, pango, pangocairo, atk

class BasicTreeViewExample:

    # close the window and quit
    def delete_event(self, widget, event, data=None):
        gtk.main_quit()
        return False

    def col1_toggled_cb( self, cell, path, model ):
        model[path][1] = not model[path][1]

    def on_cell_edited(self, cell, path_string, new_text, model):
        print "hi"
        #cell.set_property('editable', False)
        iter = model.get_iter_from_string(new_text)
        path = model.get_path(iter)[0]
        column = cell.get_data("username")

    def __init__(self):
        # Create a new window
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)

        self.window.set_title("Basic TreeView Example")

        self.window.set_size_request(400, 400)

        self.window.connect("delete_event", self.delete_event)
        self.treestore = gtk.TreeStore(gobject.TYPE_STRING, gobject.TYPE_BOOLEAN,gobject.TYPE_BOOLEAN, gobject.TYPE_STRING, gobject.TYPE_STRING)
        for parent in range(2):
            piter = self.treestore.append(None, ['Computer %i' % parent, False,False, '', ''])
            pit = self.treestore.append(piter, ['Drive', False,False, '', ''])
            pith = self.treestore.append(piter, ['Database', False,False, '', ''])
            for child in range(2):
                self.treestore.append(pit, ['child', True,True, '', ''])
            for child in range(2):
                self.treestore.append(pith, ['child', True,True, 'user', 'psw'])
        self.treeview = gtk.TreeView(self.treestore)

        self.cell = gtk.CellRendererText()
        self.tvcolumn = gtk.TreeViewColumn("Computer Name", self.cell, text=0)
        self.cell.set_property( 'editable', False )

        self.cell0 = gtk.CellRendererToggle()
        self.tvcolumn0 = gtk.TreeViewColumn("Select Drive", self.cell0 , active=1, visible=2)
        self.cell0.set_property('activatable', True)
        self.cell0.connect( 'toggled', self.col1_toggled_cb, self.treestore )

        self.cell1 = gtk.CellRendererText()
        self.tvcolumn1 = gtk.TreeViewColumn("username", self.cell1, text=3, visible=2)
        self.cell1.set_property( 'editable', True )
        self.cell1.connect("editing-started", self.on_cell_edited, self.treestore)

        self.cell2 = gtk.CellRendererText()
        self.tvcolumn2 = gtk.TreeViewColumn("password", self.cell2, text=4, visible=2)
        self.cell2.set_property( 'editable', True )
        self.treeview.append_column(self.tvcolumn)
        self.treeview.append_column(self.tvcolumn0)
        self.treeview.append_column(self.tvcolumn1)
        self.treeview.append_column(self.tvcolumn2)
        self.treeview.set_reorderable(True)
        self.window.add(self.treeview)
        self.window.show_all()

def main():
    gtk.main()

if __name__ == "__main__":
    tvexample = BasicTreeViewExample()
    main()

Anybody help me for this problem.

Thanks...

解决方案

The answer here is similar to the answer to your previous question: you need to extend your tree store with an additional column that specifies the attribute you care about — in this case, editability of username/password cells for a particular row, and connect that store column with the tree view columns that display and edit the username and password.

The provided code simply sets the editable property to true, which means the property is editable everywhere.

There are tutorials that explain the GTK tree view in some detail. Here is a version of the code from the question, modified to match your requirements as I understood them.

#!/usr/bin/env python

import pygtk
pygtk.require('2.0')
import gtk, gobject
import os
import cairo, gio, pango, pangocairo, atk

class BasicTreeViewExample:

    # close the window and quit
    def delete_event(self, widget, event, data=None):
        gtk.main_quit()
        return False

    def col1_toggled_cb( self, cell, path, model ):
        model[path][1] = not model[path][1]

    def on_cell_edited(self, cell, path_string, new_text, model):
        print "hi"
        #cell.set_property('editable', False)
        iter = model.get_iter_from_string(new_text)
        path = model.get_path(iter)[0]
        column = cell.get_data("username")

    def __init__(self):
        # Create a new window
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)

        self.window.set_title("Basic TreeView Example")

        self.window.set_size_request(400, 400)

        self.window.connect("delete_event", self.delete_event)
        self.treestore = gtk.TreeStore(gobject.TYPE_STRING, gobject.TYPE_BOOLEAN,gobject.TYPE_BOOLEAN, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_BOOLEAN)
        for parent in range(2):
            piter = self.treestore.append(None, ['Computer %i' % parent, False,False, '', '', False])
            pit = self.treestore.append(piter, ['Drive', False,False, '', '', False])
            pith = self.treestore.append(piter, ['Database', False,False, 'user', 'psw', True])
            for child in range(2):
                self.treestore.append(pit, ['child', True,True, '', '', False])
            for child in range(2):
                self.treestore.append(pith, ['child', True,True, '', '', False])
        self.treeview = gtk.TreeView(self.treestore)

        self.cell = gtk.CellRendererText()
        self.tvcolumn = gtk.TreeViewColumn("Computer Name", self.cell, text=0)
        self.cell.set_property( 'editable', False )

        self.cell0 = gtk.CellRendererToggle()
        self.tvcolumn0 = gtk.TreeViewColumn("Select Drive", self.cell0 , active=1, visible=2)
        self.cell0.set_property('activatable', True)
        self.cell0.connect( 'toggled', self.col1_toggled_cb, self.treestore )

        self.cell1 = gtk.CellRendererText()
        self.tvcolumn1 = gtk.TreeViewColumn("username", self.cell1, text=3, visible=5, editable=5)
        self.cell1.connect("editing-started", self.on_cell_edited, self.treestore)

        self.cell2 = gtk.CellRendererText()
        self.tvcolumn2 = gtk.TreeViewColumn("password", self.cell2, text=4, visible=5, editable=5)
        self.treeview.append_column(self.tvcolumn)
        self.treeview.append_column(self.tvcolumn0)
        self.treeview.append_column(self.tvcolumn1)
        self.treeview.append_column(self.tvcolumn2)
        self.treeview.set_reorderable(True)
        self.window.add(self.treeview)
        self.window.show_all()

def main():
    gtk.main()

if __name__ == "__main__":
    tvexample = BasicTreeViewExample()
    main()

这篇关于如何使pygtk中的特定子项可以编辑列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆