【发布时间】:2019-01-21 21:29:51
【问题描述】:
我正在尝试复制 Python Idle 的搜索对话框的行为,它突出显示后面的文本。所以我参考了这个链接并制作了我自己的对话:http://effbot.org/tkinterbook/tkinter-dialog-windows.htm
问题是使用self.grab_set(),我无法突出显示调用对话框的父窗口的文本。我不想删除self.grab_set(),因为我也不希望用户在搜索时四处点击。
按钮的 onclick 监听器执行正确,正如我在对话框的其他实现中测试的那样。例如,使用替换对话框正确替换文本。所以唯一的问题是父窗口中的条目文本没有突出显示/选择。实际上,如果我删除self.grab_set(),文本可以突出显示。但是,对话框失去焦点,一旦我这样做,焦点就会转到父窗口的条目。而且我无法按 Enter 键在对话框中查找下一个。
我该如何解决这个问题?提前致谢!
---更新---
测试代码可以很简单,如下所示。
from tkinter import *
SYSTEM_HIGHLIGHT = 'SystemHighlight'
BUTTON_BORDER = '#b5b5b5'
class FindDialog(Toplevel):
def __init__(self, master):
Toplevel.__init__(self, master)
self.master = master
self.transient(master)
self.grab_set()
self.geometry("+%d+%d" % (master.winfo_rootx() + 50, master.winfo_rooty() + 50))
self.title('Search Dialog')
## Variables
self.findListner = None
self.findLabel = Label(self, text = 'Find:')
self.findEntry = Entry(self)
self.findEntry.focus()
self.findEntry.select_range(0, END)
for i, w in enumerate([self.findLabel, self.findEntry]):
w.grid(row = 0, column = i, sticky = NSEW)
self.findEntry.grid(columnspan = 5)
self.findButton = Button(self, text = 'Find Next', command = self.find)
self.findButton.grid(row = 1, column = i + 1, sticky = NSEW)
self.bind('<Return>', lambda event: self.find())
def setOnFindListner(self, listener):
'''listner should have the following arguments: dialog, target, direction.'''
self.findListner = listener
def find(self):
if not self.findListner: return
self.findListner(self, self.findEntry.get())
def find():
dialog = FindDialog(root)
dialog.setOnFindListner(onFind)
root.wait_window(dialog)
def onFind(*args):
e.focus_set()
e.select_range(0, END)
e.icursor(END)
root = Tk()
e = Entry(root)
e.pack()
e.focus()
e.insert(0, 'HelloWorld')
root.bind('<Control-f>', lambda event: find())
root.mainloop()
【问题讨论】:
-
请创建一个minimal reproducible example。任何人都很难从这些 sn-ps 拼凑出一个工作程序。创建minimal reproducible example 时,请务必删除重现问题所不需要的所有函数。
-
@BryanOakley 对不起,我很懒惰。我已经更新了这个问题。测试代码的期望行为应该是按 find 选择条目 e 的所有文本。但是,只有在对话框关闭后才会选择它。
-
我们应该怎么做才能看到问题?如果我输入 control-f 然后输入字母“o”然后回车,会发生什么?此外,我们不需要看到这么多代码块。除非我们应该将所有代码放在一个文件中,否则请只包含一个完整的示例。
-
期望的行为应该是:我按下对话框的查找,应该选择条目e的整个文本而不关闭对话框。 @BryanOakley
-
如果不在对话框中输入任何内容,它应该选择条目小部件中的所有内容?
标签: python python-3.x tkinter tkinter-entry python-3.7