【问题标题】:Focusing the empty entry box when user clicks the error messagebox in tkinter当用户单击 tkinter 中的错误消息框时聚焦空输入框
【发布时间】:2020-11-16 01:58:11
【问题描述】:

在 tkinter GUI 中,我创建了一个“注册帐户”窗口。如果用户在一个或多个条目(在条目框中)未填写的情况下单击注册按钮,则会出现一个错误消息框。 我想要的是当用户单击 tkinter 错误消息框的“确定”按钮时,光标应该移动到那个特定的空输入框,从而指示用户哪个输入框是空的。

from tkinter import *
import tkinter.messagebox

class MyGUI:
def __init__(self):
    self.root = Tk()

    self.entrybox = []

    for i in range(9): #Creating 9 Entry Boxes
        self.entrybox.append(Entry(self.root, width = 10, font = 'Verdana 10'))

    for i in self.entrybox: #packing each Entry Box      
        i.pack(pady = 5)

    okButton = Button(self.root, text = 'OK', command = self.get_entryvalues)
    okButton.pack()

    mainloop()

def get_entryvalues(self):
    values = []
    for i in self.entrybox:
        values.append(i.get())
    if '' in values:
        tkinter.messagebox.showerror('Error', '1 or more entries are not filled!', parent = self.root)
    else:
        tkinter.messagebox.showinfo('Info', 'Form submitted', parent = self.root)


mygui = MyGUI()

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    您可以在 get_entryvalues() 函数内的 for 循环中找到的第一个空条目上调用 focus()

    from tkinter import *
    import tkinter.messagebox
    
    class MyGUI:
        def __init__(self):
            self.root = Tk()
    
            self.entrybox = []
            for i in range(9): #Creating 9 Entry Boxes
                btn = Entry(self.root, width=10, font='Verdana 10')
                btn.pack(pady=5)
                btn.bind('<Return>', self.next_entry)
                self.entrybox.append(btn)
    
            okButton = Button(self.root, text='OK', command=self.get_entryvalues)
            okButton.pack()
    
            self.root.mainloop()
    
        def get_entryvalues(self):
            for e in self.entrybox:
                if e.get().strip() == '':
                    tkinter.messagebox.showerror('Error', '1 or more entries are not filled!', parent=self.root)
                    e.focus() # focus the empty entry
                    return
            tkinter.messagebox.showinfo('Info', 'Form submitted', parent=self.root)
    
        def next_entry(self, event):
            event.widget.tk_focusNext().focus()
    
    mygui = MyGUI()
    

    【讨论】:

    • 是的,它正在工作。但我还想要一件事。是否有可能当用户填写第一个输入框并按“Enter Key”时,光标应该自动移动到第二个输入框。现在实际发生的情况是,当我填写了一个输入框时,我必须单击下一个输入框才能将光标移动到那里,这很烦人且效率较低。
    • @AdnanAkram 答案已更新。其实你可以按Tab键进入下一个条目。
    【解决方案2】:

    由于您没有包含任何代码,这里有一个 sn-p 来帮助您。

    from tkinter import *
    from tkinter import messagebox
    
    root = Tk()
    
    
    def something():
        if e.get() == '':
            messagebox.showerror('Error message box',
                                 'Please fill the blank field', parent=root)
            e.focus_force() #to get the lost focus back
    
    
    l = Label(root, text='Snippet')
    l.pack()
    
    e = Entry(root)
    e.pack(pady=10)
    
    b = Button(root, text='Click me!!', command=something)
    b.pack()
    
    e.focus_force()  # to have focus to the entry box wen the program starts
    
    root.mainloop()
    

    如果您的输入字段为空白,则会显示一个消息框,单击“确定”后焦点会返回到窗口的输入框。

    如果您只有 1 个窗口,messagebox 中的 parent 参数是完全可选的,但它会为出现消息框的窗口提供一些焦点(如果您正在处理超过 1 个窗口。

    如果有任何问题或有疑问,请告诉我:D

    【讨论】:

    • 现在在我的代码中,我使用 for 循环创建了 9 个输入框。假设用户只填写了第 3 和第 5 个框。现在,当用户单击“确定”按钮时,将出现错误消息框。现在我希望光标移动到第一个空框。填满后,将光标移至第 2 个空框,然后移至第 4 个空框,再移至第 6 个空框,以此类推。您附加的代码可以理解为 1 个输入框。但就我而言,现在我有 9 个输入框,我不知道哪些框或哪些框不会被用户填写。
    • 我个人不认为使用循环来创建输入框是一种实用的方法,因为如果这个人有超过 2 个空框,光标会变吗?然后你必须标记每个空输入框?那里的代码变得更加棘手,因此建议使用变量并制作单独的输入框,这样您就可以更灵活地使用值和所有内容。我还在寻找方法
    • 但是如果我们单独创建输入框,您不认为这会很困难并且会使代码变长。我的意思是假设我有 20 个输入框而不是 9 个。现在我必须制作 20 个单独的框,打包它们,然后通过分配 20 个不同的变量来单独获取它们的值。那么在这种情况下,光标的问题将如何解决?
    • 我认为 acw1668 已经给了你想要的答案?
    • 是的,我得到了答案。谢谢你们两个!! ?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    相关资源
    最近更新 更多