最近我改变了我的程序布局,包括一个类似于提供示例中的多页窗口。
在原始的双窗口配置中,我在每个窗口上都有一个绑定集,以根据条件(示例中没有条件)突出显示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()
答案 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 ....