Python Tkinter循环在插入SQLITE之前验证条目

Python Tkinter循环在插入SQLITE之前验证条目,python,sqlite,loops,tkinter,Python,Sqlite,Loops,Tkinter,我试图在将信息插入SQLITE数据库之前验证一个条目。 我有一个带按钮的主Tkinter画布。在这种情况下,该按钮将打开另一个窗口,用户可以在其中输入所需的字段。我的想法是避免用户提交空字段。 我设法有一个消息框,说有什么问题,但一旦我按下“确定”的代码继续并关闭输入窗口。 步骤1-打开输入窗口: def open_add_ship_window(): global ship_window ship_window = Tk() ship_window.title('Add

我试图在将信息插入SQLITE数据库之前验证一个条目。 我有一个带按钮的主Tkinter画布。在这种情况下,该按钮将打开另一个窗口,用户可以在其中输入所需的字段。我的想法是避免用户提交空字段。 我设法有一个消息框,说有什么问题,但一旦我按下“确定”的代码继续并关闭输入窗口。 步骤1-打开输入窗口:

def open_add_ship_window():
    global ship_window
    ship_window = Tk()
    ship_window.title('Add Ship')
    ship_window.iconbitmap(
        'C:/Users/eduardo.js.ramos/Desktop/VSCode/img directory/ship_icon_1.ico')
    ship_window.geometry("400x200")
    global ship_name_ship_window
    global ship_imo_ship_window
    global ISM_ship_window
    global ISM_IMO_ship_window
    # Create Text Boxes
    ship_name_ship_window = Entry(ship_window, width=40)
    ship_name_ship_window.grid(row=0, column=1, pady=(10, 0))
    ship_imo_ship_window = Entry(ship_window, width=40)
    ship_imo_ship_window.grid(row=1, column=1)
    ISM_ship_window = Entry(ship_window, width=40)
    ISM_ship_window.grid(row=2, column=1)
    ISM_IMO_ship_window = Entry(ship_window, width=40)
    ISM_IMO_ship_window.grid(row=3, column=1)
    # Create Labels
    ship_name_ship_window_label = Label(
        ship_window, text="Vessel Name")
    ship_name_ship_window_label.grid(row=0, column=0, pady=(10, 0))
    ship_imo_ship_window_label = Label(
        ship_window, text="Vessel IMO")
    ship_imo_ship_window_label.grid(row=1, column=0)
    ISM_ship_window_label = Label(ship_window, text="ISM Company")
    ISM_ship_window_label.grid(row=2, column=0)
    ISM_IMO_ship_window_label = Label(
        ship_window, text="ISM IMO Number")
    ISM_IMO_ship_window_label.grid(row=3, column=0)
    # Create Save New Ship Button
    save_ship_btn = Button(
        ship_window, text="Add New Ship", command=add_ship)
    save_ship_btn.grid(row=4, column=0, columnspan=2,
                       pady=10, padx=10, ipadx=50)
步骤2-将数据提交到SQLITE数据库:

def add_ship():
    # connect to database
    conn = sqlite3.connect('PSC.sdb')
    # create cursor
    c = conn.cursor()
    while True:
        if len(ship_name_ship_window.get()) != 0 \
                or len(ship_imo_ship_window.get()) != 0 \
                or len(ISM_ship_window.get()) != 0 \
                or len(ISM_IMO_ship_window.get()) != 0:
            c.execute("INSERT INTO ships VALUES(:name, :imoship, :ism, :ismimo , null, null)",
                      {
                          'name': ship_name_ship_window.get(),
                          'imoship': ship_imo_ship_window.get(),
                          'ism': ISM_ship_window.get(),
                          'ismimo': ISM_IMO_ship_window.get()
                      })
        else:
            messagebox.showwarning(title='Review Needed', message='Please complete all fieds.')
            continue
    conn.commit()
    conn.close()
    ship_window.destroy()

你们有什么建议吗?

关闭消息框后,主循环结束,因此您可能必须将上述代码放入循环中,这样一旦消息框显示错误,循环就不会结束

一种可能的方法是:

While True :
"""Input tags here"""
if len(ship_name_ship_window.get()) != 0 \
                or len(ship_imo_ship_window.get()) != 0 \
                or len(ISM_ship_window.get()) != 0 \
                or len(ISM_IMO_ship_window.get()) != 0:
            c.execute("INSERT INTO ships VALUES(:name, :imoship, :ism, :ismimo , null, null)",
                      {
                          'name': ship_name_ship_window.get(),
                          'imoship': ship_imo_ship_window.get(),
                          'ism': ISM_ship_window.get(),
                          'ismimo': ISM_IMO_ship_window.get()
                      })
            break
else:
     messagebox.showwarning(title='Review Needed', message='Please complete all fieds.')
     continue
  • 您应该将
    add_ship()
    中的最后三行移动到
    if
    块中
  • if
    语句中将
    更改为
  • 移除while循环
下面是修改后的
添加装运()


这样行吗?有什么问题?为什么不使用
sqlite
占位符来代替在
值(:name,…)
中传递值的方法呢?
我是这方面的初学者,没有任何IT背景,试图学习和生产一些可能会产生额外收入的东西。我也是一个初学者,但是您必须对您的问题进行详细说明,以便有人能够提供帮助您应该在
if
语句中使用
而不是
。我打开了第二个tkinter窗口,其中有4个输入框和1个按钮。该按钮在SQLITE数据库中插入新行。如果一个或多个输入框未完成,我希望消息框弹出以提醒用户,并将其带回窗口,用户可以在该窗口中继续键入剩余信息“关闭消息框后,mainloop将跳过”
root.mainloop()
仅当应用程序关闭时才会结束。我已经尝试过这种方法,但之后我会一次又一次地收到消息框@CoolCloud关闭的循环不是主循环,而是我将输入框保留为空的循环。只需将输入框放入我创建的循环中,然后重试again@VedantMatanhelia输入标签是什么意思?这个“'name':ship\u name\u ship\u window.get()”?非常有效,解决了我的问题。非常感谢您的时间和耐心@acw1668
def add_ship():
    # get the information
    ship_name = ship_name_ship_window.get().strip()
    ship_imo = ship_imo_ship_window.get().strip()
    ism_ship = ISM_ship_window.get().strip()
    ism_imo = ISM_IMO_ship_window.get().strip()
    # if all is input
    if ship_name and ship_imo and ism_ship and ism_imo:
        # connect to database
        conn = sqlite3.connect('PSC.sdb')
        # create cursor
        c = conn.cursor()
        c.execute("INSERT INTO ships VALUES (:name, :imoship, :ism, :ismimo, NULL, NULL)",
                  {
                      'name': ship_name,
                      'imoship': ship_imo,
                      'ism': ism_ship,
                      'ismimo': ism_imo
                  })
        conn.commit()
        conn.close()
        ship_window.destroy()
    else:
        messagebox.showwarning(title='Review Needed', message='Please complete all fieds.')