<p>您正在复制tab键的功能,以便在一组小部件之间移动。这使用虚拟事件<code><<NextWindow>></code>和<code><<PrevWindow>></code>。所以要做的是让您的<code><Return></code>处理程序生成这个事件。然后对于最后一个条目,您要转到一个特定的小部件。我已经创建了一个这样做的例子。您可以在一个小部件集合中使用类似这样的东西,或者如果您深入研究tk_focusNext函数正在做什么来确定下一个小部件要转到的内容,您可以安排检查包含框架中的小部件。在</p>
<p><strong>Edit</strong>:通过从python生成遍历事件来模拟<code>tk::TabToWindow</code>函数</p>
<pre><code>import tkinter as tk
class MyEntry(tk.Entry):
"""Entry widget with Return bound to provide tabbing functionality"""
def __init__(self, master, **kw):
tk.Entry.__init__(self, master, **kw)
self.next_widget = None
self.bind("<Return>", self.on_ret)
def on_ret(self, ev):
if self.next_widget:
self.event_generate('<<TraverseOut>>')
self.next_widget.focus()
self.next_widget.event_generate('<<TraverseIn>>')
else:
self.event_generate('<<NextWindow>>')
return "break"
def set_next(self, widget):
"""Override the default next widget for this instance"""
self.next_widget = widget
def add_entry(parent, row, **kwargs):
widget = MyEntry(parent, **kwargs)
widget.grid(row=row, column=0, sticky=tk.NSEW)
return widget
def main(args=None):
root = tk.Tk()
frame = tk.LabelFrame(root, text="Entries", width=200, height=200)
entries = []
for row in range(4):
e = add_entry(frame, row)
entries.append(e)
e.set_next(entries[0])
frame.grid_columnconfigure(0, weight=1)
frame.grid_rowconfigure(0, weight=0)
button = tk.Button(root, text="Exit", command=root.destroy)
frame.grid(row=0, column=0, sticky=tk.NSEW)
button.grid(row=1, column=0, sticky=tk.SE)
root.grid_columnconfigure(0, weight=1)
root.grid_rowconfigure(0, weight=1)
entries[0].focus_set()
root.mainloop()
if __name__ == '__main__':
main()
</code></pre>