Línea de error 44, en update_table

programación


Hola chicos, ¿por qué este código devuelve un error en la línea 44? Mi opinión es correcta o_O

import tkinter as tk
from tkinter import ttk
import socket
import threading

def cell_selected(event):
    selected_item = tree.selection()[0]
    item_values = tree.item(selected_item, 'values')
    print("Selected item:", item_values)

def connect_action():
    threading.Thread(target=receive_data).start()

def exit_program():
    root.quit()

def receive_data():
    host = "127.0.0.1"
    port = 23456
    
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.bind((host, port))
        s.listen()
        print(f"In ascolto su {host}:{port}")
        
        try:
            conn, addr = s.accept()	
            with conn:
                print(f"Connesso da {addr}")
                
                while True:
                    data = conn.recv(1024)
                    if not data:
                        break
                    data_str = data.decode("utf-8")
                    data_list = data_str.split(",")
                    
                    root.event_generate("<<DataReceived>>", data=data_list)
                    
        except socket.error as e:
            print("Errore nella connessione:", e)

def update_table(event):
    data_list = event.data
    if data_list:
        tree.item(tree.get_children()[1], values=data_list)

root = tk.Tk()
root.title("Spreadsheet App")

# Creazione del widget Notebook (schede)
notebook = ttk.Notebook(root)
notebook.pack(fill="both", expand=True)

# Primo tab con il primo Treeview
tab1 = ttk.Frame(notebook)
notebook.add(tab1, text="Terminal")

columns = ("Order","TimeOp","Type","Size","Symbol","Price","S/L","T/P",
           "Price","Com.","Swap","Profit","Comment","Close")

tree = ttk.Treeview(tab1, columns=columns, show="headings")
for col in columns:
    tree.heading(col, text=col)
    
tree.bind("<ButtonRelease-1>", cell_selected)
tree.pack(padx=10, pady=10)

# Pulsante "Connetti" a destra
connect_button = tk.Button(root, text="Connetti", command=connect_action)
connect_button.pack(side="right", padx=10, pady=5)

# Secondo tab con il secondo Treeview
tab2 = ttk.Frame(notebook)
notebook.add(tab2, text="Storico")

tree2 = ttk.Treeview(tab2, columns=("Symbol","Price","S/L"), show="headings")
# ... Aggiungi colonne e dati al secondo Treeview ...

tree2.bind("<ButtonRelease-1>", cell_selected)
tree2.pack(padx=10, pady=10)

exit_button = tk.Button(root, text="Esci", command=exit_program)
exit_button.pack(side="right", pady=5)

class CustomEvent:
    def __init__(self, widget, data):
        self.widget = widget
        self.data = data

def generate_custom_event(widget, data):
    event = CustomEvent(widget, data)
    widget.event_generate("<<DataReceived>>", when="tail", data=event)

root.bind("<<DataReceived>>", update_table)  # Bind custom event

root.mainloop()

la línea 44 es

data_list = event.data

volcado de errores:

In ascolto su 127.0.0.1:23456
Connesso da ('127.0.0.1', 64976)
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.11_3.11.1264.0_x64__qbz5n2kfra8p0\Lib\tkinter\__init__.py", line 1948, in __call__
    return self.func(*args)
           ^^^^^^^^^^^^^^^^
  File "C:\Users\pct\Desktop\python\tabella.py", line 44, in update_table
    data_list = event.data
                ^^^^^^^^^^ 

Lo que he probado:

nada especial por el momento

Solución 4

Sospecho que el problema está en el receive_data función. Cuando genera el <<DataReceived>> evento es posible que los datos del evento sean “Ninguno”. Necesitas comprobar eso data_list contiene algunos datos reales antes de pasarlos al controlador de eventos.

[edit]

Al ejecutar pruebas adicionales, parece que los eventos personalizados no contienen un data atributo. Ver tkinter — Interfaz de Python para Tcl/Tk — Documentación de Python 3.11.4[^] para detalles.

Pero la documentación de tkinter es algo escasa.

[/edit]

Solución 5

Su error está relacionado con la forma en que accede a los datos del objeto de evento personalizado. En su código, ha creado una clase de evento personalizada llamada ‘CustomEvent’ para manejar los datos personalizados, pero está intentando acceder directamente al atributo de datos del objeto de evento, lo que está causando el error.

Debe modificar la forma en que genera el evento personalizado.

Pitón
def generate_custom_event(widget, data):
    event = CustomEvent(widget, data)
    widget.event_generate("<<DataReceived>>", when="tail", data=event)

Debe modificar la función ‘receive_data’ para usar la función ‘generate_custom_event’ para enviar los datos recibidos como un evento personalizado.

Pitón
def receive_data():
    host = "127.0.0.1"
    port = 23456
    
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.bind((host, port))
        s.listen()
        print(f"In ascolto su {host}:{port}")
        
        try:
            conn, addr = s.accept()	
            with conn:
                print(f"Connesso da {addr}")
                
                while True:
                    data = conn.recv(1024)
                    if not data:
                        break
                    data_str = data.decode("utf-8")
                    data_list = data_str.split(",")
                    
                    #Send the received data as a custom event
                    generate_custom_event(root, data_list)
                    
        except socket.error as e:
            print("Errore nella connessione:", e)

En su función ‘update_table’, debe acceder al atributo de datos del objeto de evento personalizado:

Pitón
def update_table(event):
    custom_event = event.data  #Access your custom event object
    data_list = custom_event.data
    if data_list:
        tree.item(tree.get_children()[1], values=data_list)

[EDIT]

Si se muestra el error a continuación en los comentarios, significa que está intentando manejar subprocesos en una aplicación ‘Tkinter’. ‘Tkinter’ no es seguro para subprocesos, lo que significa que no puede actualizar la GUI directamente desde un subproceso no principal. Debe asegurarse de que las actualizaciones de la GUI se realicen desde el hilo principal. Debe utilizar el método ‘root.after()’ para programar actualizaciones en el hilo principal. Puedes aprender más de – Cómo programar una acción con el método Tkinter after()[^]

Pitón
#All your previous code...

#Function to handle received data inside the the main thread
def handle_received_data(data_list):
    if data_list:
        tree.item(tree.get_children()[1], values=data_list)

#I have modified receive_data function here...
def receive_data():
    host = "127.0.0.1"
    port = 23456
    
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.bind((host, port))
        s.listen()
        print(f"In ascolto su {host}:{port}")
        
        try:
            conn, addr = s.accept()	
            with conn:
                print(f"Connesso da {addr}")
                
                while True:
                    data = conn.recv(1024)
                    if not data:
                        break
                    data_str = data.decode("utf-8")
                    data_list = data_str.split(",")
                    
                    #Schedule GUI update in the main thread here...
                    root.after(0, handle_received_data, data_list)
                    
        except socket.error as e:
            print("Errore nella connessione:", e)

#The rest of your code...

Solución 6

Se muestra el error a continuación en los comentarios, significa que está intentando manejar subprocesos en una aplicación ‘Tkinter’.

https://projectfreetv.onl/
https://waplus.win/

Solución 1

Dado que han pasado más de 5 horas y aún no nos ha dicho cuál es el mensaje de error que recibe, lo mejor que podemos hacer es brindarle ayuda genérica con mensajes de error de sintaxis: Cómo escribir código para resolver un problema, una guía para principiantes, parte 2: errores de sintaxis[^]

Y también incluiré esto: Hacer preguntas es una habilidad[^] – Te sugiero que leas bien ambos, deberían ayudarte en el futuro.

コメント

タイトルとURLをコピーしました