Python tkinter使用箭头键同时滚动两个TEXT小部件

时间:2014-07-24 19:29:58

标签: python text tkinter sync arrow-keys

我正在构建一个包含2个文本小部件的GUI。 (我的意思是它有很多东西,但是这个问题的缘故让它留在2个文本小部件)。我想要做的是,当我用箭头键滚动一个文本小部件时,另一个文本小部件也同时滚动。我能够使用滚动条(代码中未显示)完成此操作,但不能使用箭头键。我希望同时在两个文本区域上的箭头键正常行为。也就是说,当它到达可查看文本的底部时,它向下滚动,但如果我向上滚动文本,则不会仅移动箭头。你知道,像任何普通的文本编辑器一样。所以问题是我该如何做到这一点?这是我的代码片段。

#create Text widgets

descriptionTextField = Text(mainframe, width=40, height=10)
descriptionTextField.grid(column=2, row=5, sticky=(W))
descriptionTextField.bind("<Down>", OnEntryDown)
descriptionTextField.bind("<Up>", OnEntryUp)

pnTextField = Text(mainframe, width=40, height=10)
pnTextField.grid(column=3, row=5, sticky=(W))
pnTextField.bind("<Down>", OnEntryDown)
pnTextField.bind("<Up>", OnEntryUp)

#here are what I have for code that **DOESN'T** do what I want.
def OnEntryDown(event):
    descriptionTextField.yview_scroll(1,"units")
    pnTextField.yview_scroll(1,"units")

def OnEntryUp(event):
    descriptionTextField.yview_scroll(-1,"units")
    pnTextField.yview_scroll(-1,"units")

必须有一种方法可以找出下一个箭头键何时大于可视区域(在本例中为10),然后向其他方向滚动只需移动光标。

注意:我无法获取代码#34;&lt; Up&gt;&#34;和#34;&lt;向下&gt;&#34;箭头显示在上面的代码中,但相信我它就在那里。

1 个答案:

答案 0 :(得分:1)

不是试图复制箭头键的作用,而是在处理键之后同步两个窗口(即:将yview设置为另一个的yview),而不是尝试复制两个窗口。如果需要,可以同时移动插入光标。只有当两个小部件具有相同的行数时,此技术才有效。

虽然正确的方法是调整bindtags以便在类绑定之后创建绑定,但是您可以通过知道tkinter处理键事件来避免这种复杂化。这意味着您可以向关键的发布事件添加绑定。但它产生了一个微小的滞后。

它看起来像这样:

descriptionTextField("<KeyRelease-Up>", OnArrow)
descriptionTextField("<KeyRelease-Down>", OnArrow)
pnTextField("<KeyRelease-Up>", OnArrow)
pnTextField("<KeyRelease-Down>", OnArrow)
...
def OnArrow(event):
    widget = event.widget
    other = pnTextField if widget == descriptionTextField else descriptionTextField
    other.yview_moveto(widget.yview()[0])
    other.mark_set("insert", widget.index("insert"))

使用bindtags消除了滞后。您可以这样设置:

   for widget in (descriptionTextField, pnTextField):
        bindtags = list(widget.bindtags())
        bindtags.insert(2, "custom")
        widget.bindtags(tuple(bindtags))

        widget.bind_class("custom", "<Up>", OnArrow)
        widget.bind_class("custom", "<Down>", OnArrow)