[英]Unable to append entry to list when using lambda
我在嘗試 append 我從 tkinter 的用戶輸入中收到的條目時遇到問題。我在網上找到了一些代碼,它使用 lambda 將每組條目發送到我修改過的屏幕以達到我的目的。 雖然它沒有按預期運行。
輸入示例:
Channel: 101
Serial: 123
然后我按下“下一步”按鈕,我的第一個結果是:
[['Chamber 6', 'DL 7'], ['Chan 101 (VDC)', '123']]
這是我所期望的。 問題是當我添加另一個條目時。
第二個輸入:
Channel: 103
Serial: 456
然后我再次按下一個按鈕,我的第二個結果是:
[['Chamber 6', 'DL 7'], ['Chan 103 (VDC)', '456'], ['Chan 103 (VDC)', '456']]
它總是 append 最后一個列表 x 次,而不是每次都附加修改后的列表。 使用 numpy 數組時,我也得到相同的結果。
下面是我的代碼。 有人可以解釋我需要做什么來解決這個問題嗎? 提前致謝!
# importing module
from pandas import *
import numpy as np
import tkinter as tk
fields = 'Channel', 'Serial'
chan_data = [['Chamber 6', 'DL 7']]
temp_arr = ['','']
def fetch(entries):
for entry in entries:
field = entry[0]
text = entry[1].get()
if field =='Channel':
temp_arr[0] = 'Chan ' + text + ' (VDC)'
elif field == 'Serial':
temp_arr[1] = text
chan_data.append(temp_arr)
print (chan_data)
def makeform(root, fields):
entries = []
for field in fields:
row = tk.Frame(root)
lab = tk.Label(row, width=15, text=field, anchor='w')
ent = tk.Entry(row)
row.pack(side=tk.TOP, fill=tk.X, padx=5, pady=5)
lab.pack(side=tk.LEFT)
ent.pack(side=tk.RIGHT, expand=tk.YES, fill=tk.X)
entries.append((field, ent))
return entries
if __name__ == '__main__':
root = tk.Tk()
ents = makeform(root, fields)
root.bind('<Return>', (lambda event, e=ents: fetch(e)))
b1 = tk.Button(root, text='Next',command=(lambda e=ents: fetch(e)))
b1.pack(side=tk.LEFT, padx=5, pady=5)
b2 = tk.Button(root, text='Quit', command=root.destroy)
b2.pack(side=tk.LEFT, padx=5, pady=5)
root.mainloop()
我正在使用 Spyder 作為我的 IDE,我正在使用 Python 3.7.9。
問題是temp_arr = ['','']
它只需要在方法內部移動,因為它引用相同的 object x
次。
def fetch(entries):
temp_arr = ['',''] <-----------
for entry in entries:
field = entry[0]
text = entry[1].get()
if field =='Channel':
temp_arr[0] = 'Chan ' + text + ' (VDC)'
elif field == 'Serial':
temp_arr[1] = text
chan_data.append(temp_arr)
print (chan_data)
要解決此問題,您需要在將列表傳遞給 append 時復制該列表:
#Three ways to copy
chan_data.append(temp_arr.copy())
chan_data.append(list(temp_arr))
chan_data.append(temp_arr[:])
列表temp_arr
是通過引用附加的,因此更改原始temp_arr
列表會更改chan_data
中的列表,因為它們只是對temp_arr
的引用。 調用copy()
或list()
創建一個新列表; 更改temp_arr
不會更改復制的列表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.