Почему эти две строки кода не дают одинаковых результатов? - PullRequest
1 голос
/ 18 мая 2019

Я довольно новичок в 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)

Запуск этого с пониманием списка приводит к другому поведениюдля меня, чем если бы другая строка не закомментирована

1 Ответ

3 голосов
/ 18 мая 2019

Они делают то же самое:

from tkinter import *
win = Tk()
data = [[StringVar(), StringVar(), StringVar()],
        [StringVar(), StringVar(), StringVar()],
        [StringVar(), StringVar(), StringVar()]]
print(data)

data = [[StringVar() for i in range(3)]for x in range(3)]
print(data)

Yeilds:

[[<tkinter.StringVar object at 0x0000024E4EC16470>, <tkinter.StringVar object at 0x0000024E4EC162B0>, <tkinter.StringVar object at 0x0000024E4EE7E400>], [<tkinter.StringVar object at 0x0000024E4EF8B3C8>, <tkinter.StringVar object at 0x0000024E4EF8B438>, <tkinter.StringVar object at 0x0000024E4EF8B4A8>], [<tkinter.StringVar object at 0x0000024E4EF8B518>, <tkinter.StringVar object at 0x0000024E4EF8B588>, <tkinter.StringVar object at 0x0000024E4EF8B5F8>]]

и

[[<tkinter.StringVar object at 0x0000024E4EF8B6D8>, <tkinter.StringVar object at 0x0000024E4EF8B668>, <tkinter.StringVar object at 0x0000024E4EF8B748>], [<tkinter.StringVar object at 0x0000024E4EF8B780>, <tkinter.StringVar object at 0x0000024E4EF8B7B8>, <tkinter.StringVar object at 0x0000024E4EF8B7F0>], [<tkinter.StringVar object at 0x0000024E4EF8B828>, <tkinter.StringVar object at 0x0000024E4EF8B860>, <tkinter.StringVar object at 0x0000024E4EF8B898>]]

Если вы спрашиваете, почему 0x0000024E4EC16470! = 0x0000024E4EF8B6D8 (первый экземпляр), это потому, что это число говорит вам, где в памяти находится объект. Оба являются StringVar объектами, но они просто в разных местах. Например, я представляю, что ваши соседи также являются объектами human, но, поскольку они являются вашими соседями, у них другой адрес!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...