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