树视图鼠标位置python

2024-10-02 00:20:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我不太确定这个问题以前是否有人问过,因为它似乎太琐碎了,不可能是新问题,但是我已经找了一个小时了,没有发现任何东西

使用一个Trek表分析和显示。对于一个给定的函数,我希望能够识别被双击的确切单元格(行和列)。虽然很容易找到行,但我找不到列,因为鼠标位置总是相对于屏幕显示,而不是相对于使用winfo_pointerx()的Treeview。我也不能让event.x工作。。。在

from Tkinter import *
import ttk
import utils

class AudiDataList():

    def __init__(self, i_root, i_header, i_data, i_types):
        self.root = i_root

        f1 = ttk.Frame(root)
        f1.pack()
        t1 = ttk.Treeview(f1, columns=i_header, show="headings")
        t1.pack()

        for col in i_header:
            t1.heading(col, text=col.title())
        for item in i_data:
            t1.insert('', 'end', values=item, tags = ('item',))
        t1.tag_bind('item', "<Double-Button-1>", callback=lambda c=col: self.filter(t1, c, 0, i_types, i_header))

    def filter(self, tree, col, descending, i_types, i_header):
        print "Row: ", tree.focus()
        print "X-position", tree.winfo_pointerx()
        print "Column: ??? ",tree.identify_column(tree.winfo_pointerx())


header = ['col1', 'col2', 'col3']
datentypen = ['text', 'money', 'int']
data = [
('a', '1,00', 1) ,
('a', '2,00', 2) ,
('b', '12,10', 3) ,
('c', '2,10', 4) ,
('b', '3,00', 5)]

root = Tk()
Auditable = AudiDataList(root, header, data, datentypen)

root.mainloop()

我真的很感谢你的帮助。在


Tags: importselftreedatacolrootitemf1
2条回答

我想我找到了。 问题是树.winfo_pointerx()不返回相对于Treeview的位置,而是相对于屏幕的位置。 也,树.winfo_x()始终返回零。 但是,减去self.root.winfo_x()来自树.winfo_pointerx()完成任务。在

在任何情况下,re都是坐标变换的必要条件。在

现在得走了,如果你需要一个片段,我稍后再发。在

你需要结合一些技巧来解决你的问题。在

首先,您需要使用^{}。这将返回一个元组(x , y),其中包含鼠标指针相对于tree的根窗口的坐标。在

然后,您需要使用这个元组的第一个元素winfo_pointerxy()[0],调用从中减去{a3}的^{}方法(以解决窗口移位的问题)。在

但是您需要小心,因为winfo_pointerxy()返回的元组是<type 'unicode'>类型。因此,例如,您需要import re才能使用^{},这样您就可以将#1形式的数据替换为整数1。在

这意味着您的filter()方法现在将如下所示:

     def filter(self, tree, col, descending, i_types, i_header):               
         print 'Row: {} & Column: {} '.format(re.sub('I00','',str(tree.identify_row(tree.winfo_pointerxy()[1]-tree.winfo_rooty()))),re.sub(r'#','',str(tree.identify_column(tree.winfo_pointerxy()[0]-tree.winfo_rootx()))))

完整程序

下面是完整的程序:

^{pr2}$

演示

以下是运行程序的屏幕截图:

enter image description here

相关问题 更多 >

    热门问题