使用 lambda 时无法将条目附加到列表
Unable to append entry to list when using lambda
我在尝试附加从 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']]
它总是附加最后一个列表 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 = ['','']
它只需要在方法内部移动,因为它引用同一个对象 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)
要解决此问题,您需要在将列表传递到附加时复制列表:
#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
不会更改复制的列表。
我在尝试附加从 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']]
它总是附加最后一个列表 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 = ['','']
它只需要在方法内部移动,因为它引用同一个对象 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)
要解决此问题,您需要在将列表传递到附加时复制列表:
#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
不会更改复制的列表。