多页 window 无法高亮带有回调的条目文本
Multi-page window cannot highlight Entry text with callback
最近我更改了我的程序的布局以包含一个多页 window,类似于所提供的示例中的内容。
在最初的两个 window 配置中,我在每个 window 上设置了绑定,以根据条件(没有示例中存在的条件)。这很好。
在升级到多页 window 后,我尝试通过传递相关小部件并调用 widget.select_range(0, END)
来组合回调以突出显示文本,就像在示例中所做的那样。现在我似乎无法在单击鼠标时突出显示任何文本。
除此之外,我还测试了我的示例代码,每个 Entry
都有一个单独的回调;即使这样也不会在单击时突出显示 Entry
中的文本。
这可能与 lift
ing 帧和焦点所在的位置有关吗?作为测试,我为 "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 ....
最近我更改了我的程序的布局以包含一个多页 window,类似于所提供的示例中的内容。
在最初的两个 window 配置中,我在每个 window 上设置了绑定,以根据条件(没有示例中存在的条件)。这很好。
在升级到多页 window 后,我尝试通过传递相关小部件并调用 widget.select_range(0, END)
来组合回调以突出显示文本,就像在示例中所做的那样。现在我似乎无法在单击鼠标时突出显示任何文本。
除此之外,我还测试了我的示例代码,每个 Entry
都有一个单独的回调;即使这样也不会在单击时突出显示 Entry
中的文本。
这可能与 lift
ing 帧和焦点所在的位置有关吗?作为测试,我为 "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 ....