Я довольно новичок в python, и я пытался настроить интерфейс TKinter с 9 полями ввода.Я использовал первую строку кода ниже, чтобы отслеживать значение каждого виджета, но когда я попытался очистить свой код с помощью второй строки ниже, я обнаружил, что все три вложенных массива привязаны к одним и тем же 3 виджетам.Мне кажется, что я упускаю что-то очевидное здесь.
data = [[StringVar(), StringVar(), StringVar()],
[StringVar(), StringVar(), StringVar()],
[StringVar(), StringVar(), StringVar()]]
data = [[StringVar() for i in range(3)]for x in range(3)]
Редактировать: я публикую весь код,
from tkinter import *
from tkinter import ttk, StringVar
import asyncio
import websockets
ip = "10.30.128.92"
port = 5678
root = Tk()
status = StringVar()
async def send_data(*args):
buffer = [[0]*3]*3
try:
for i in range(3):
for j in range(3):
val = float(data[i][j].get())
if 0 < val < 255:
buffer[i][j] = val
elif val >= 255:
buffer[i][j] = 255
else:
buffer[i][j] = 0
print(buffer)
except ValueError:
pass
status.set("Connecting...")
root.update()
await asyncio.sleep(1)
try:
async with websockets.client.connect("ws://{}:{}".format(ip, port)) as websocket:
status.set("Connected")
root.update()
await asyncio.sleep(1)
status.set("Transmitting Values")
root.update()
await asyncio.sleep(1.3)
print("Connection at ws://{}:{} established".format(ip, port))
print("Awaiting Server reply code")
msg = await websocket.recv()
print(msg)
print("Transmitting RGB values")
await websocket.send(str(buffer))
status.set("Data Transmitted ✓")
root.update()
await asyncio.sleep(1)
print("Closing connection at ws://{}:{}".format(ip, port))
websocket.close()
except ConnectionRefusedError:
status.set("Unable to Connect")
root.update()
await asyncio.sleep(1)
print("Unable to connect to server at w://{}:{}".format(ip, port))
def run(*args):
asyncio.run(send_data(args))
root.title("LED Manager")
root.iconbitmap('exbICO.ico')
mainframe = ttk.Frame(root, padding=".3i")
mainframe.grid(column=0, row=0)
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)
#Holds the values of each entry box
#data = [[StringVar(), StringVar(), StringVar()],
# [StringVar(), StringVar(), StringVar()],
# [StringVar(), StringVar(), StringVar()]]
data =[[StringVar() for i in range(3)] for x in range(3)]
print(data)
#Holds references to the entry box widgets
data_entry = [[0]*3]*3
#Creates ttk Entry widgets that feed into values of data[][] and the places them into the frame
for i in range(3):
for j in range(3):
data_entry[i][j] = ttk.Entry(mainframe, width=7, textvariable=data[i][j])
data_entry[i][j].grid(column=i+1, row=j+2)
data_entry[i][j].focus()
#Creates the labels on all entry boxes and buttons
ttk.Label(mainframe, textvariable=status).grid(column=4, row=2)
ttk.Label(mainframe, text="Red 0-255").grid(column=0, row=2)
ttk.Label(mainframe, text="Green 0-255").grid(column=0, row=3)
ttk.Label(mainframe, text="Blue 0-255").grid(column=0, row=4)
ttk.Label(mainframe, text="LED #1").grid(column=1, row=1)
ttk.Label(mainframe, text="LED #2").grid(column=2, row=1)
ttk.Label(mainframe, text="LED #3").grid(column=3, row=1)
ttk.Button(mainframe, text="Send", command=run).grid(column=4, row=3)
for child in mainframe.winfo_children(): child.grid_configure(padx=5, pady=5)
root.bind('<Return>', run)
while True:
try:
root.update_idletasks()
root.update()
except TclError:
sys.exit(0)
Запуск этого с пониманием списка приводит к другому поведениюдля меня, чем если бы другая строка не закомментирована