【问题标题】:Why I don't get any drag and drop signals in a Gtk.TreeeView? (python + glade)为什么我在 Gtk.TreeeView 中没有任何拖放信号? (蟒蛇+林间空地)
【发布时间】:2020-12-28 17:12:35
【问题描述】:

我有一个 TreeView,它的行是可重新排序的。当我拖放一行时,它会适当移动,但我没有收到任何与拖放过程相关的信号。

UI 是在 glade 中构建的,我将所有拖放信号连接到我的代码中打印信号名称的函数,但它似乎不起作用。

我认为信号应该由 TreeView 的 CellRenderers 而不是树本身触发,但这些信号不适用于林间空地的 CellRenderers。

我觉得有些东西我根本不理解。

这是我的代码:

main.glade:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface>
  <requires lib="gtk+" version="3.20"/>
  <object class="GtkTreeStore" id="my_treestore">
    <columns>
      <!-- column-name name -->
      <column type="gchararray"/>
    </columns>
  </object>
  <object class="GtkWindow" id="main_window">
    <property name="can_focus">False</property>
    <property name="default_width">640</property>
    <property name="default_height">480</property>
    <signal name="destroy" handler="window_destroy" swapped="no"/>
    <child>
      <object class="GtkBox">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="orientation">vertical</property>
        <child>
          <object class="GtkScrolledWindow">
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="shadow_type">in</property>
            <child>
              <object class="GtkTreeView" id="my_treeview">
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="model">my_treestore</property>
                <property name="headers_visible">False</property>
                <property name="reorderable">True</property>
                <property name="enable_search">False</property>
                <property name="enable_tree_lines">True</property>
                <child internal-child="selection">
                  <object class="GtkTreeSelection"/>
                </child>
                <child>
                  <object class="GtkTreeViewColumn" id="name_column">
                    <property name="title" translatable="yes">Name</property>
                    <child>
                      <object class="GtkCellRendererText" id="name_cell_renderer"/>
                      <attributes>
                        <attribute name="text">0</attribute>
                      </attributes>
                    </child>
                  </object>
                </child>
              </object>
            </child>
          </object>
          <packing>
            <property name="expand">True</property>
            <property name="fill">True</property>
            <property name="position">0</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
</interface>

main.py:

#!/usr/bin/env python3

# -*- coding: utf-8 -*-

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk



class Main:

    
    def __init__(self):

        builder = Gtk.Builder()
        builder.add_from_file("main.glade")
        builder.connect_signals(self)

        window = builder.get_object("main_window")        
        window.show_all()

        self.builder = builder
        
        self.fill_tree(None,0, 0)
        
    
    def window_destroy(self, button):

        Gtk.main_quit()
        
    
    def fill_tree(self, iter, parent_id, level): # Recursively fill the treeview model with some data
    
        model = self.builder.get_object('my_treestore')
              
        for x in range(3):
            id = 3*parent_id+x+1
            row = ('Node {}'.format(id),)
            new_iter = model.append(iter, row)
            if level < 3:
                self.fill_tree(new_iter, id, level+1)


    def drag_begin_cb(self, widget, context, user_data):
    
        print('drag data begin')
        
        
    def drag_data_delete_cb(self, widget, context, user_data):
    
        print('drag data delete')
        
        
    def drag_data_get_cb(self, widget, context, selection_data, info, time, user_data):  
    
        print('drag data get')
        
    
    def drag_data_received_cb(self, widget, context, x, y, selection_data, info, time, user_data): 
    
        print('drag data received')
        
    def drag_drop_cb(self, widget, context, x, y, time, user_data):      
        
        print('drag drop')
        
        
    def drag_end_cb(self, widget, context, user_data):
    
        print('drag end')
        
        
    def drag_failed_cb(self, widget, context, result, user_data):
    
        print('drag failed')
        
        
    def drag_leave_cb(self, widget, context, time, user_data):
    
        print('drag leave')
        
        
    def drag_motin_cb(self, widget, context, x, y, time, user_data):
    
        print('drag motion')
        
        
 
def main():

    main = Main()
    Gtk.main()


if __name__ == '__main__':
    main()

【问题讨论】:

    标签: drag-and-drop treeview gtk glade


    【解决方案1】:

    我建议你看看Treeview的信号,还有TreeStore的信号,也许是row-changed的信号?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-14
      • 1970-01-01
      相关资源
      最近更新 更多