我有一个包含许多条目小部件和树视图小部件的应用程序。我想要做的是让用户在树视图中选择一行(子),从子项中提取某些数据并显示在不同的条目小部件中。用户可以更改或保留所需的任何数据,点击“返回”按钮。在每个条目小部件上直到最后。点击'返回'在最后一个条目窗口小部件上应该将焦点重新放回Treeview,特别是列表中的下一个子节点(紧接在最初单击的行下面的行/子节点。
def display_chosen(self, event):#Called when user clicks row/child in 'dirdisplay' Treeview widget
clickedfile = self.dirdisplay.focus()#Get child (row) id of click
self.nextID = self.dirdisplay.next(clickedfile)#Get next child, place in class-wide accessible variable
self.enableentries()#Enable entry boxes so data extraction to entry widgets work
#Do whatever to send data to entry widgets
def enableentries(self):#Sets three entry widgets a, b, c to state normal.
try:
self.a.config(state=NORMAL)
self.b.config(state=NORMAL)
self.c.config(state=NORMAL)
except AttributeError:
pass
def a_to_b(self, event):#While in entry 'a', hitting 'Return' calls this and sets focus to next entry widget, 'b'
#Do whatever with data in a
self.b.focus_set()
def b_to_c(self, event):#While in entry 'b', hitting 'Return' calls this and sets focus to next entry widget, 'c'
#Do whatever with data in b
self.c.focus_set()
def c_to_nex(self, event):#Hitting 'Return' on 'c' calls this, setting focus back to 'dirdisplay' treeview, giving focus to child immediately below what was originally clicked.
#Do whatever with data in c
print('Focus acknowledged')
print(self.nextID)#Feedback to show me the nextID actually exists when I hit 'Return'
self.dirdisplay.focus_set()
self.dirdisplay.focus(self.nextID)
所以,这与我的其余代码一起(巨大的,我想我在这里展示了所有重要的内容,请告诉我是否需要更多代码)部分工作。 a_to_b,b_to_c正常工作。当调用c_to_nex时(我知道当我因为反馈打印而点击返回时调用它)我知道nextID是正确的,因为它确实打印了正确的子ID,但没有其他事情发生。我知道treeview具有焦点,因为在键盘上按下或向下遍历行。我也知道nextID描述的行是'排序'因为当我击中时,第三行(在nextID行下面)会突出显示。
这种''专注于nextID行并没有帮助我,因为我需要选择行,就好像用户点击了他或她自己。
描述了一段时间回答的类似问题,不幸的是,这些答案都没有帮助。我知道我已经离我很近了,我知道我可能正在使用&self.dirdisplay.focus(self.nextID)'错误或缺少选项。
谢谢!
答案 0 :(得分:2)
经过多次尝试,我终于成功了解了它!
使用self.dirdisplay作为ttk.Treeview小部件......
def c_to_nex(self, event):#Hitting 'Return' on 'c' calls this, setting focus back to 'dirdisplay' treeview, giving focus to child immediately below what was originally clicked.
#Do whatever with data in c
print('Focus acknowledged')
print(self.nextID)#Feedback to show me the nextID actually exists when I hit 'Return'
self.dirdisplay.focus_set()
self.dirdisplay.selection_set((self.nextID, self.nextID))
self.dirdisplay.focus(self.nextID)
您需要上面的三重奏,就像您以编程方式将焦点设置到Treeview中的特定子/行一样 - 就像用户自己点击它一样。
self.dirdisplay.focus_set()给出Treeview小部件输入焦点,以便按向上/向下键正常工作。
self.dirdisplay.selection_set((self.nextID,self.nextID))为您提供实际突出显示的行的效果。 self.nextID重复,因为selection_set似乎需要一个与单行/子ID相对应的项目列表(根据文档)。
最后,self.dirdisplay.focus(self.nextID)似乎实际上是行焦点(你绑定的任何函数<>将激活)。