簡體   English   中英

跳過條目小部件中的無值 Tkinter Python

[英]Skip None values in entry widgets Tkinter Python

假設我們有一個 Tkinter 應用程序,其中包含許多這樣的入口小部件:

root = Tk()

entry1 = Entry(root, width=40)
entry1.grid(row=0, column=0)
entry2 = Entry(root, width=40)
enrtry2.grid(row=1,column=0)
entry3 = Entry(root, width=40)
enrtry3.grid(row=2,column=0)
entry4 = Entry(root, width=40)
enrtry4.grid(row=3,column=0)

root.mainloop()

這些小部件的值用於UPDATE數據庫。 我想要的是能夠跳過其中任何一個值,而不是在UPDATE語句中使用它。 現在我用我的代碼檢查小部件中是否有這樣的東西:

db = fdb.connector
c = db.cursor

values = [entry1.get(), entry2.get(), entry3.get(), entry4.get()]

for v in values:
   if len(v) == 0 or v is None:
     pass
   elif lev(v) != 0:
     c.execute(f"""UPDATE table1 SET column1 = {v[0]}, column2 = {v[1]}, column3 = {v[2]}, column4 = {v[3]} WHERE ID = 1;""")

問題是,當數據庫中的值之一為None時,我得到的值是NULL ,這是正確的,因為widget中沒有值。 我如何“告訴” python 當沒有提供值時,它應該跳過該值並繼續更新其他值?

編輯:感謝@TheLizzard,這個解決方案就像一個魅力:

string = "UPDATE table1 SET "
        at_least_one_set = False
        for i in range(12):
             if v[i] != "":
                 string += columns[i] + " = " + "'" + str(v[i]) + "'" + ", "
                 at_least_one_set = True
        if at_least_one_set:
            string = string[:-2]
            string += f" WHERE column_a = '{v[0]}' OR column_b = '{v[1]}';"
            c.execute(string)
        else:
            print("No values were set. Raise an error?")

EDIT2:經過一番研究,感謝@TheLizzard,@Arioch'The,@Mark Rotteveel,我提供了以下工作代碼並遵循此處的建議之一,現在這是安全的:

v = ["", "2", "3", ""]
column_names = ["column_a", "column_b", "column_c", "column_z"]
rowids = [row[0] for row in c.execute("SELECT id FROM table1 WHERE column_a = ? OR column_b = ?", (v[0], v[1], ))]

string = "UPDATE table1 SET "
at_least_one_set = False
for i in range(12):
    if v[i] != "":
        string += columns[i] + " = '{}'".format(v[i]) + ", "
        at_least_one_set = True
if at_least_one_set:
   string = string[:-2]
   string += " WHERE id = {}".format(rowids[0]) + ";"
   c.execute(string)

結果是:

UPDATE table1 SET column_b = '2', column_c = '3' WHERE id = 1;

嘗試這個:

v = ["", "2", "3", ""]
column_names = ["column_a", "column_b", "column_c", "column_z"]


string = "UPDATE table1 SET "
at_least_one_set = False
for i in range(4):
    if v[i] != "":
        string += column_names[i] + " = " + v[i] + ", "
        at_least_one_set = True
if at_least_one_set:
    string = string[:-2]
    string += ";"
    print(string)
else:
    print("No values were set. Raise an error?")

我動態創建一個以"UPDATE table1 SET "開頭並以";"結尾的字符串我跳過所有""的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM