[ad_1]
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.
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.
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:
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()[^]
#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.
[ad_2]
コメント