Gtk + 3では、TreeModel
ネストされた情報を格納するためにを使用しており、それをaCellRendererText
と。で表示しCellRendererToggle
ます。ユーザーはすべてのトグルボタンをクリックできます。ネストされたボタンがあり、それらが同じ状態にない場合は、上位レベルのものに「一貫性のない」状態を反映させたいと思います。このプロパティを1つの要素に設定するにはどうすればよいですか?
より明確にするために、Transmissionbittorrentクライアントから達成したいことの例:
セルレンダラーのすべてのボタンを一貫性のない状態に設定する方法は知っていますが、myCellRendererToggle.set_properties(inconsistent=True)
ここから1つの要素にアクセスできないようです。
TreeStoreモデルの特定の行にアクセスする方法は知っていますが、設定できるのは«True»と«False»の値のみです。
私のコードは公式ドキュメントにかなり近いので、あなたはそれを手伝うことができます:https : //python-gtk-3-tutorial.readthedocs.org/en/latest/cellrenderers.html#cellrenderertoggle(私は代わりにtreeStoreを使用しますlistStore)
そしてこれは私のコードです:
class HelloMyApp:
def __init__(self):
# Set the Glade file
self.builder = Gtk.Builder()
self.builder.add_from_file(GLADEFILE)
dic = {
"on_button1_clicked" : self.btnValidate_clicked,
"on_MainWindow_destroy" : self.quit,
"on_window1_delete_event" : self.quit,
}
self.builder.connect_signals(dic)
window = self.builder.get_object("window1")
treeview1 = self.builder.get_object("treeview1")
######## This is my model : it stores a string and a boolean. #########
self.treeModel = Gtk.TreeStore(str, bool)
# Example on how to insert data in the model
treeIter = self.treeModel.append(None, ['example one', True])
self.treeModel.append(treeIter, [' simple elt', True])
treeIter = self.treeModel.append(treeIter, ['example two', False])
self.treeModel.append(treeIter, ['under example two', True])
select = treeview1.get_selection()
select.set_mode(Gtk.SelectionMode.BROWSE)
select.connect("changed", self.on_tree_selection_changed, buf)
# Using one column of text and another column with the toggle buttons
renderer = Gtk.CellRendererText()
column = Gtk.TreeViewColumn("Title", renderer, text=0)
treeview1.append_column(column)
###### Here is the CellRendereToggle ################
renderer_toggle = Gtk.CellRendererToggle()
renderer_toggle.connect("toggled", self.on_cell_toggled)
column_toggle = Gtk.TreeViewColumn("Installer", renderer_toggle, active=1)
treeview1.append_column(column_toggle)
treeview1.set_model(self.treeModel)
window.show_all()
if __name__ == "__main__":
HelloMyApp = HelloMyApp()
Gtk.main()
ありがとう !
編集:答えるマーカス:わかりません。関数内でCellRendererToggleのプロパティを変更すると、すべての行が変更されます。
ソリューションの編集:Marcuが指摘したように、すべての場合にプロパティを設定する必要があるため、else
パーツを追加しました。
def cellRenderer_func(column, cellRenderer, treeModel, treeIter, userData):
if 'cat' in treeModel.get_value(treeIter, 0):
# it happens only ones in my model,
# so here I am in a row I want to change to inconsistent.
cellRenderer.set_property('inconsistent',True)
# I was expecting that changes the box of that row but it affects every row.
else:
cellRenderer.set_property('inconsistent', False) # and that's ok now.
もう一度やり直さなければなりません。不思議に思う…本当に手動でやらなければならないのだろうか、それはtreeViewの箱から出してすぐに使える機能ではないだろうか?