我想從輸入欄位中獲取一個整數并在其下方創建新的輸入框。我已經撰寫了一個代碼來使用一個按鈕來做到這一點。但是,當我輸入數字時,我想在沒有按鈕的情況下自動完成,行會更新。
我看到了一種實作自動化的方法是使用callback.
from tkinter import *
root = Tk()
root.geometry("400x400")
n_para = IntVar()
label1 = Label(root, text="Numeric parameters")
label1.grid(row=0, column=0)
entry1 = Entry(root, textvariable=n_para)
entry1.grid(row=0, column=1)
def update():
for i in range(1, n_para.get() 1):
entryX = Entry(root)
entryX.grid(row=i 1, column=0)
entryY = Entry(root)
entryY.grid(row=i 1, column=1)
entryZ = Entry(root)
entryZ.grid(row=i 1, column=2)
button1 = Button(root, text="update", command=update)
button1.grid(row=1, column=0)
root.mainloop()
因此,我將代碼更改為以下使用callback.
from tkinter import *
root = Tk()
root.geometry("400x400")
n_para = IntVar()
label1 = Label(root, text="Numeric parameters")
label1.grid(row=0, column=0)
entry1 = Entry(root, textvariable=n_para)
entry1.grid(row=0, column=1)
def update(*args):
try:
for i in range(1, n_para.get() 1):
entryX = Entry(root)
entryX.grid(row=i 1, column=0)
entryY = Entry(root)
entryY.grid(row=i 1, column=1)
entryZ = Entry(root)
entryZ.grid(row=i 1, column=2)
except ValueError:
return
n_para.trace_add('write', update)
root.mainloop()
當我輸入一個數字時,它會起作用并引發錯誤:_tkinter.TclError: expected floating-point number but got ""我不知道那是為了什么。
此外,代碼僅在我以升序格式輸入數字時才有效。比如我先輸入5,然后改成3就不行了。
uj5u.com熱心網友回復:
您應該使用 StringVar 與條目關聯,因為條目包含文本。
StringVar 中有一個方法可以跟蹤任何更改:StringVar().trace()。請參閱下面的示例代碼:
from tkinter import *
root = Tk()
root.geometry("400x400")
n_para = StringVar()
label1 = Label(root, text="Numeric parameters")
label1.grid(row=0, column=0)
entry1 = Entry(root, textvariable=n_para)
entry1.grid(row=0, column=1)
def update(*args):
print('update', n_para.get())
n_para.trace('w', update) # Trace changes in n_para and run update if detected
root.mainloop()
您得到的錯誤是因為條目包含文本。在使用它之前,您必須將其轉換為 int。
新示例
您可以通過多種方式做到這一點,但這里有一個示例:
from tkinter import *
root = Tk()
root.geometry("400x400")
n_para = StringVar()
label1 = Label(root, text="Numeric parameters")
label1.grid(row=0, column=0)
entry1 = Entry(root, textvariable=n_para)
entry1.grid(row=0, column=1)
row_list = [] # List of all currently displayed entry rows
# and each row is a list of entrys within this list
def update(*args):
try:
para = int(n_para.get())
except ValueError:
return # Return without changes if ValueError occurs
rows = len(row_list)
diff = para - rows # Compare old number of rows with entry value
if diff == 0:
return # Return without changes
elif diff > 0: # Add rows of entrys and remember them
for row in range(rows 1, rows diff 1):
entry_list = [] # Local list for entrys on this row
for col in range(3):
e = Entry(root)
e.grid(row=row, column=col)
entry_list.append(e) # Add entry to list
row_list.append(entry_list) # Add entry list to row
elif diff < 0: # Remove rows of entrys and froget them
for row in range(rows-1, rows-1 diff, -1):
for widget in row_list[row]:
widget.grid_forget()
widget.destroy()
del row_list[-1]
n_para.trace('w', update) # Trace changes in n_para
root.mainloop()
你是這么想的嗎?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/456987.html
下一篇:我正在嘗試從條目中獲取一個int
