微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我在 Gtk.TreeeView 中没有得到任何拖放信号? 蟒蛇 + 林间空地

如何解决为什么我在 Gtk.TreeeView 中没有得到任何拖放信号? 蟒蛇 + 林间空地

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

UI 内置在 Glade 中,我将所有拖放信号连接到代码中的函数,这些函数打印信号的名称,但它似乎不起作用。

我认为信号应该由 TreeView 的 CellRenderer 触发,而不是由树本身触发,但这些信号对 Glade 中的 CellRenderer 不可用。

我觉得有些事情我根本不理解。

这是我的代码

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)
        
    
    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,user_data):
    
        print('drag data delete')
        
        
    def drag_data_get_cb(self,selection_data,info,time,user_data):  
    
        print('drag data get')
        
    
    def drag_data_received_cb(self,x,y,user_data): 
    
        print('drag data received')
        
    def drag_drop_cb(self,user_data):      
        
        print('drag drop')
        
        
    def drag_end_cb(self,user_data):
    
        print('drag end')
        
        
    def drag_Failed_cb(self,result,user_data):
    
        print('drag Failed')
        
        
    def drag_leave_cb(self,user_data):
    
        print('drag leave')
        
        
    def drag_motin_cb(self,user_data):
    
        print('drag motion')
        
        
 
def main():

    main = Main()
    Gtk.main()


if __name__ == '__main__':
    main()

解决方法

我建议您查看 Treeview 和 TreeStore 的信号,也许是信号 row-changed

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。