Python 3.x 每当输入框为空时显示MessageBox错误

Python 3.x 每当输入框为空时显示MessageBox错误,python-3.x,tkinter,tkinter-entry,tkmessagebox,Python 3.x,Tkinter,Tkinter Entry,Tkmessagebox,我知道你可以通过检查输入框的长度来检查它是否为空。不过,我很难实现它,因为我的输入框是动态创建的,不能在一个循环中遍历所有输入框 这是我的密码: from tkinter import * class Window(Canvas): def __init__(self,master=None,**kwargs): Canvas.__init__(self,master,**kwargs) self.frame = Frame(self)

我知道你可以通过检查输入框的长度来检查它是否为空。不过,我很难实现它,因为我的输入框是动态创建的,不能在一个循环中遍历所有输入框

这是我的密码:

from tkinter import *

class Window(Canvas):
    def __init__(self,master=None,**kwargs):
        Canvas.__init__(self,master,**kwargs)
        self.frame = Frame(self)
        self.create_window(0,0,anchor=N+W,window=self.frame)
        self.row = 1

        self.input_x = []
        self.input_y = []

        self.x_values = []
        self.y_values = []

        self._init_entries()

    def _init_entries(self):
        x_value  = Label(self.frame, text='x', font='Helvetica 10 bold').grid(row = self.row, column = 2)
        y_value  = Label(self.frame, text='y', font='Helvetica 10 bold').grid(row = self.row, column = 3)
        self.row += 1

    def add_entry(self):

        def validate_int_entry(text):
            if text == "":
                return True
            try:
                value = int(text)
            except ValueError:
                return False
            return value
        vcmd_int = (root.register(validate_int_entry), "%P")

        x_value = Entry(self.frame, validate = "key", validatecommand=vcmd_int, justify = RIGHT, width=10)
        x_value.grid(row = self.row, column = 2)

        y_value = Entry(self.frame, validate = "key", validatecommand=vcmd_int, justify = RIGHT, width=10)         
        y_value.grid(row = self.row, column = 3)

        self.row += 1

        self.input_x.append(x_value)
        self.input_y.append(y_value)


    def save_entry(self):

        self.x_values.clear()
        self.y_values.clear()

        for entry in self.input_x:
            x = int(entry.get())
            self.x_values.append(x)
        print(self.x_values)

        for entry in self.input_y:
            x = int(entry.get())
            self.y_values.append(x)
        print(self.y_values)


if __name__ == "__main__":
    root = Tk()

    root.resizable(0,0)
    root.title('Lot')

    lot = Window(root)
    lot.grid(row=0,column=0)

    scroll = Scrollbar(root)
    scroll.grid(row=0,column=1,sticky=N+S)

    lot.config(yscrollcommand = scroll.set)
    scroll.config(command=lot.yview)
    lot.configure(scrollregion = lot.bbox("all"), width=1000, height=500)

    def add_points():
        lot.add_entry()
        lot.configure(scrollregion = lot.bbox("all"))

    b1 = Button(root, text = "Add points", command = add_points)
    b1.grid(row=1,column=0)

    def get_value():
        b1.destroy()
        lot.save_entry()

    b2 = Button(root, text = "Get value!", command = get_value)
    b2.grid(row=2,column=0)

    root.mainloop()
下面是一个GUI示例,其中用户单击了“添加点”按钮5次,但忘记填写其中一个输入框


由于我设置了输入框只能接受“int”,那么它将抛出一个错误。如何在每次输入框为空时显示MessageBox(如果可能的话,我可以告诉用户哪个输入框为空)?

在添加新行之前,我已经更改了您的add_entry功能,它将检查这两个字段,如果发现它为空,则会弹出警告消息

def add_entry(self):

    for entry in self.input_x:
        if entry.get() is '':
            return messagebox.showwarning('Warning', 'Empty Fields')

    for entry in self.input_y:
        if entry.get() is '':
            return messagebox.showwarning('Warning', 'Empty Fields')

    def validate_int_entry(text):
        if text == "":
            return True
        try:
            value = int(text)
        except ValueError:
            return False
        return value
    vcmd_int = (root.register(validate_int_entry), "%P")

    x_value = Entry(self.frame, validate = "key", validatecommand=vcmd_int, justify = RIGHT, width=10)
    x_value.grid(row = self.row, column = 2)

    y_value = Entry(self.frame, validate = "key", validatecommand=vcmd_int, justify = RIGHT, width=10)
    y_value.grid(row = self.row, column = 3)

    self.row += 1

    self.input_x.append(x_value)
    self.input_y.append(y_value)

在添加新行之前,我已经更改了您的添加输入功能。它将检查两个字段,如果发现为空,则会弹出警告消息

def add_entry(self):

    for entry in self.input_x:
        if entry.get() is '':
            return messagebox.showwarning('Warning', 'Empty Fields')

    for entry in self.input_y:
        if entry.get() is '':
            return messagebox.showwarning('Warning', 'Empty Fields')

    def validate_int_entry(text):
        if text == "":
            return True
        try:
            value = int(text)
        except ValueError:
            return False
        return value
    vcmd_int = (root.register(validate_int_entry), "%P")

    x_value = Entry(self.frame, validate = "key", validatecommand=vcmd_int, justify = RIGHT, width=10)
    x_value.grid(row = self.row, column = 2)

    y_value = Entry(self.frame, validate = "key", validatecommand=vcmd_int, justify = RIGHT, width=10)
    y_value.grid(row = self.row, column = 3)

    self.row += 1

    self.input_x.append(x_value)
    self.input_y.append(y_value)

您可以从tkinter导入messagebox,然后显示弹出的messagebox。showwarning(“警告”,“警告消息”)如果字段为空,我知道这一点。问题是如何访问输入框,因为它是动态创建的。您将输入项存储在两个列表中
self.input\x
self.input\y
,因此请在列表上循环并使用项索引显示警告。@Kenly,由于我的计划是将错误处理任务放在“save_entry”函数中,因此我很难在该列表中循环。基本上,我希望用户先填写所有的输入框,然后再检查其中一些是否为空。我通过使用
all(x.get()在self中不是x的“”。在if语句中输入_x
,如果返回false则抛出一个错误。虽然有多列,但看起来不太好。您可以从tkinter导入messagebox,然后显示弹出的messagebox。showwarning(“警告”,“警告消息”)如果字段为空,我知道。问题是如何访问输入框,因为它是动态创建的。您将条目存储在两个列表中
self.input_x
self.input_y
,因此循环列表并使用项索引显示警告。@Kenly,我在该列表中循环了一段时间,因为我的计划是将错误置于在“save_entry”函数中处理任务。基本上,我希望用户先填充所有的输入框,然后再检查其中是否有空。我通过使用
all(x.get()对于self中的x不是“”。请在if语句中输入_x
,如果返回false,则会引发错误。虽然有多个列,但看起来不太好。这是一个不错的透视图,请检查(上一个)在添加另一个之前先行。虽然看起来很奇怪,但我没有想到。在这种情况下,用户可以很容易地跟踪空框,尤其是有很多点的空框。我也可以绕过清除列表,因为只有在“添加项”函数中处理错误后才会调用“保存项”函数。@aryastark我很高兴这对你有帮助。这是一个很好的视角,检查(上一篇)在添加另一个之前先行。虽然看起来很奇怪,但我没有想到。在这种情况下,用户可以很容易地跟踪空框,尤其是有很多点的空框。我也可以绕过清除列表,因为只有在“添加项”函数中处理错误后才会调用“保存项”函数。@aryastark我很高兴这对你有帮助。