多页窗口无法突出显示带有回调的条目文本

时间:2015-07-02 15:14:05

标签: python tkinter python-2.x

最近我改变了我的程序布局,包括一个类似于提供示例中的多页窗口。

在原始的双窗口配置中,我在每个窗口上都有一个绑定集,以根据条件(示例中没有条件)突出显示Entry窗口小部件中的所有文本。这很好。

升级到多页面窗口后,我尝试通过传递相关窗口小部件并在示例中调用widget.select_range(0, END)来组合回调以突出显示文本。现在,我无法通过鼠标点击突出显示任何文字。

除此之外,我还测试了我的示例代码,为每个Entry分别进行了回调;即使这不会突出Entry点击它时的文字。

这可能与lift框架有关吗?重点在哪里?作为测试,我已经为"提交"添加了类似的回调。 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()

1 个答案:

答案 0 :(得分:0)

嗯,这是一个富有成效的问题。如果将来有人做了类似的事情,需要一个如何解决问题的参考:

通过在每次切换帧时强制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 ....