Tkinter将Enter绑定到焦点下一个条目

2024-10-03 21:29:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个函数,它将enter绑定到“insert”框架中的下一个输入字段。但是,对于最后一个输入字段,它将返回所有字段中输入的文本。我尝试过使用迭代器获取下一个输入字段,但没有成功。我不熟悉Python和Tkinter。我的主要问题围绕着“getinsert”函数,我如何集中精力在下一个输入字段上?有没有什么方法可以让当前的焦点加1?另外,如何检查it是否在最后一个字段上,以便可以调用“getinsert”函数?在

任何帮助都将不胜感激

import tkinter as tk
from tkinter import messagebox

master = tk.Tk()

insertnames = ["Title", "Location", "Tags", "Section", "Blah"]
insertentries = {}
insertlabels = {}
main = tk.Frame(master)
insert = tk.Frame(master)
currentnames = iter(insertnames[0])

def mainmenu():
    main.pack()
    insertbutton.pack(fill = 'x')

def insertcall():
    main.forget()
    insert.pack()
    insertform()
    insertentries["Title"].bind('<Return>', insertfocus)
    insertentries["Location"].bind('<Return>', insertfocus)
    insertentries["Tags"].bind('<Return>', getinsert)

def getinsert(event):
    for entry in insertentries:
        print (insertentries[entry].get())
        insertentries[entry].delete(0, 'end')
    insert.forget()
    mainmenu()

def insertfocus(event):
    currentnames.next()
    insertentries[currentnames].focus()

def insertform():
    i = 0

    for name in insertnames:
        e = tk.Entry(insert)
        e.grid(row = i, column = 1)
        insertentries[name] = e

        lab = tk.Label(insert, text = name)
        lab.grid(row = i, column = 0)
        insertlabels[name] = lab

        i += 1

insertbutton = tk.Button(main, text = "Insert", command = insertcall)
mainmenu()

tk.mainloop()

Tags: 函数namemasterreturnbindmaindefpack
3条回答

您可以将相关条目小部件的<;Return>;键绑定到如下函数:

def entry_next(self, event):         
    event.widget.tk_focusNext().focus()
    return("break")

我知道这不是最好的选择,但是一个冗长的方法是硬编码。有更多字典经验的人也许可以在循环中完成,但我做不到:)

import tkinter as tk

insertnames = ["Title", "Location", "Tags", "Section", "Blah"]
obj = []

root = tk.Tk()

firstFrame = tk.Frame(root)
entryFrame = tk.Frame(root)

def mainmenu():
    firstFrame.pack()
    insertButton.pack(fill='x')

def insertcall():
    firstFrame.forget()
    entryFrame.pack()

    title = tk.Entry(entryFrame)
    title.bind('<Return>', lambda event: focus(title))
    title.grid(row=0, column=1)
    obj.append(title)
    tk.Label(entryFrame, text='Title').grid(row=0, column=0)

    location = tk.Entry(entryFrame)
    location.bind('<Return>', lambda event: focus(location))
    location.grid(row=1, column=1)
    obj.append(location)
    tk.Label(entryFrame, text='Location').grid(row=1, column=0)

    tags = tk.Entry(entryFrame)
    tags.bind('<Return>', lambda event: focus(tags))
    tags.grid(row=2, column=1)
    obj.append(tags)
    tk.Label(entryFrame, text='Tags').grid(row=2, column=0)

    section = tk.Entry(entryFrame)
    section.bind('<Return>', lambda event: focus(section))
    section.grid(row=3, column=1)
    obj.append(section)
    tk.Label(entryFrame, text='Section').grid(row=3, column=0)

    blah = tk.Entry(entryFrame)
    blah.bind('<Return>', lambda event: focus(blah))
    blah.grid(row=4, column=1)
    obj.append(blah)
    tk.Label(entryFrame, text='Blah').grid(row=4, column=0)

def focus(entryobj):
    i = 0
    for item in obj: #for each try and get next item unless it gives an error (then it must be the last entry so put it to 0)
        try:
            if item == entryobj:
                obj[i+1].focus_set()
                break
        except IndexError:
            obj[0].focus_set()
        i += 1

insertButton = tk.Button(firstFrame, text='Insert', command=insertcall)
insertButton.pack()

mainmenu()

root.mainloop()

您正在复制tab键的功能,以便在一组小部件之间移动。这使用虚拟事件<<NextWindow>><<PrevWindow>>。所以要做的是让您的<Return>处理程序生成这个事件。然后对于最后一个条目,您要转到一个特定的小部件。我已经创建了一个这样做的例子。您可以在一个小部件集合中使用类似这样的东西,或者如果您深入研究tk_focusNext函数正在做什么来确定下一个小部件要转到的内容,您可以安排检查包含框架中的小部件。在

Edit:通过从python生成遍历事件来模拟tk::TabToWindow函数

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()

相关问题 更多 >