【问题标题】:Python tkinter scrolling two TEXT widgets at the same time with arrow keysPython tkinter 使用箭头键同时滚动两个 TEXT 小部件
【发布时间】:2014-07-24 19:29:58
【问题描述】:

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

#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),然后滚动其他方式,只需移动光标即可。

注意:我无法在上面的代码中显示向上“”和向下“”箭头的代码,但相信我它就在那里。

【问题讨论】:

  • 这两个小部件的行数是否相同?
  • 是的。它们都有 99 行。
  • 嗯,我找到了答案,但我必须等待 8 小时才能发布。在我所有的搜索中,我需要的信息只出现一次。没有很好的记录。

标签: python text tkinter sync arrow-keys


【解决方案1】:

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

虽然正确的方法是调整 bindtags 以便在类绑定之后创建绑定,但您可以避免这种复杂性,因为知道 tkinter 处理关键 press 事件。这意味着您可以将绑定添加到关键 release 事件。不过,它会产生微小的滞后。

看起来像这样:

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"))

使用绑定标签可以消除延迟。你可以这样设置:

   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)

【讨论】:

    猜你喜欢
    • 2015-11-09
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 2012-02-06
    • 2023-02-10
    • 2016-09-21
    • 2011-05-16
    • 2011-03-13
    相关资源
    最近更新 更多