多页 window 无法高亮带有回调的条目文本

Multi-page window cannot highlight Entry text with callback

最近我更改了我的程序的布局以包含一个多页 window,类似于所提供的示例中的内容。

在最初的两个 window 配置中,我在每个 window 上设置了绑定,以根据条件(没有示例中存在的条件)。这很好。

在升级到多页 window 后,我尝试通过传递相关小部件并调用 widget.select_range(0, END) 来组合回调以突出显示文本,就像在示例中所做的那样。现在我似乎无法在单击鼠标时突出显示任何文本。

除此之外,我还测试了我的示例代码,每个 Entry 都有一个单独的回调;即使这样也不会在单击时突出显示 Entry 中的文本。

这可能与 lifting 帧和焦点所在的位置有关吗?作为测试,我为 "submitting" 和 Entry 值添加了一个类似的回调,这工作正常。在这一点上,我对为什么这行不通感到困惑。任何帮助是极大的赞赏。

更新:

我忘记了要解决突出显示问题,我需要在用于突出显示文本的回调中包含 return "break" 行。

现在,有了这个,我对 Entry 小部件有一些非常奇怪的行为。除非使用 tab 键将它们聚焦,否则我无法点击它们。

有什么办法可以解决这个问题吗?

这是我一直在玩的示例代码(使用更新的 return 语句):

from Tkinter import *

class Window():

    def __init__(self, root):
        self.root = root
        self.s1 = StringVar()
        self.s1.set("")
        self.s2 = StringVar()
        self.s2.set("")

        # Frame 1

        self.f1 = Frame(root, width = 50, height = 25)
        self.f1.grid(column = 0, row = 1, columnspan = 2)

        self.page1 = Label(self.f1, text = "This is the first page's entry: ")
        self.page1.grid(column = 0, row = 0, sticky = W)
        self.page1.grid_columnconfigure(index = 0, minsize = 90)

        self.val1 = Label(self.f1, text = self.s1.get(), textvariable = self.s1)
        self.val1.grid(column = 1, row = 0, sticky = E)

        self.l1 = Label(self.f1, text = "Frame 1 Label")
        self.l1.grid(column = 0, row = 1, sticky = W)

        self.e1 = Entry(self.f1, width = 25)
        self.e1.grid(column = 1, row = 1, sticky = E)
        self.e1.bind("<Button-1>", lambda event: self.event(self.e1))
        self.e1.bind("<Return>", lambda event: self.submit(self.e1, self.s1))

        # Frame 2

        self.f2 = Frame(root, width = 50, height = 25)
        self.f2.grid(column = 0, row = 1, columnspan = 2)

        self.page2 = Label(self.f2, text = "This is the 2nd page's entry: ")
        self.page2.grid(column = 0, row = 0, sticky = W)
        self.page2.grid_columnconfigure(index = 0, minsize = 90)

        self.val2 = Label(self.f2, text = self.s2.get(), textvariable = self.s2)
        self.val2.grid(column = 1, row = 0, sticky = E)

        self.l2 = Label(self.f2, text = "Frame 2 Label")
        self.l2.grid(column = 0, row = 1, sticky = W)

        self.e2 = Entry(self.f2, width = 25)
        self.e2.grid(column = 1, row = 1, sticky = E)
        self.e2.bind("<Button-1>", lambda event: self.event(self.e2))
        self.e2.bind("<Return>", lambda event: self.submit(self.e2, self.s2))

        self.b1 = Button(root, width = 15, text = "Page 1", command = lambda: self.page(1), relief = SUNKEN)
        self.b1.grid(column = 0, row = 0, sticky = E)

        # Buttons

        self.b2 = Button(root, width = 15, text = "Page 2", command = lambda: self.page(2))
        self.b2.grid(column = 1, row = 0, sticky = W)

        # Start with Frame 1 lifted

        self.f1.lift()

    def page(self, val):
        self.b1.config(relief = RAISED)
        self.b2.config(relief = RAISED)

        if val == 1:
            self.f1.lift()
            self.b1.config(relief = SUNKEN)
        else:
            self.f2.lift()
            self.b2.config(relief = SUNKEN)

    def event(self, widget): 
        widget.select_range(0, END)
        return "break"

    def submit(self, widget, target):
        target.set(widget.get())

root = Tk()
w = Window(root)
root.mainloop()

好吧,这是一个富有成效的问题。如果以后有人在做类似的事情,需要解决问题的参考:

我可以通过在每次切换框架时强制 Entry 小部件聚焦并使用我在问题更新中提到的 return "break" 语句来解决这个问题。

这不是 理想,因为每次更改页面时您都会自动关注 Entry 小部件,但是一旦小部件处于焦点,它的行为就是正是我所期望的,所以这不是什么大问题。在我的程序中,如果您正在更改页面,您很可能无论如何都会使用 Entry 小部件(它是一个搜索条目)。

以下是使代码正常工作所需的最后更改:

# .... some code ....

    self.f1.lift()
    self.e1.focus_force()

def page(self, val):
    self.b1.config(relief = RAISED)
    self.b2.config(relief = RAISED)

    if val == 1:
        self.f1.lift()
        self.b1.config(relief = SUNKEN)
        self.e1.focus_force()
    else:
        self.f2.lift()
        self.b2.config(relief = SUNKEN)
        self.e2.focus_force()

def event(self, widget): 
    widget.select_range(0, END)
    return "break"

# .... more code ....