[ad_1]
مرحبًا يا شباب، لماذا يعود هذا الرمز بالخطأ في السطر 44 لأن رأيي صحيح 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()
السطر 44 هو
data_list = event.data
تفريغ الخطأ:
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 ^^^^^^^^^^
ما حاولت:
لا شيء خاص في الوقت الراهن
الحل 4
أظن أن المشكلة في receive_data
وظيفة. عندما يقوم بإنشاء <<DataReceived>>
من الممكن أن تكون بيانات الحدث “لا شيء”. تحتاج إلى التحقق من ذلك data_list
يحتوي على بعض البيانات الفعلية قبل تمريرها إلى معالج الأحداث.
[edit]
عند إجراء المزيد من الاختبارات، يبدو أن الأحداث المخصصة لا تحتوي على ملف data
يصف. يرى tkinter — واجهة Python إلى وثائق Tcl/Tk — Python 3.11.4[^] للتفاصيل.
لكن وثائق tkinter متناثرة إلى حد ما.
[/edit]
الحل 5
يرتبط خطأك بالطريقة التي تصل بها إلى بيانات كائن الحدث المخصص. في التعليمات البرمجية الخاصة بك، قمت بإنشاء فئة حدث مخصصة تسمى “CustomEvent” للتعامل مع البيانات المخصصة، ولكنك تحاول الوصول إلى سمة البيانات الخاصة بكائن الحدث مباشرة، وهو ما يسبب الخطأ.
تحتاج إلى تعديل الطريقة التي تنشئ بها الحدث المخصص –
def generate_custom_event(widget, data): event = CustomEvent(widget, data) widget.event_generate("<<DataReceived>>", when="tail", data=event)
تحتاج إلى تعديل وظيفة “receive_data” لاستخدام وظيفة “generate_custom_event” لإرسال البيانات المستلمة كحدث مخصص –
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)
في وظيفة “update_table”، تحتاج إلى الوصول إلى سمة البيانات لكائن الحدث المخصص –
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]
إذا ظهر الخطأ أدناه في التعليقات، فهذا يعني أنك تحاول التعامل مع الترابط في تطبيق “Tkinter”. “Tkinter” ليس آمنًا لسلسلة الرسائل، مما يعني أنه لا يمكنك تحديث واجهة المستخدم الرسومية من سلسلة رسائل غير رئيسية مباشرة. تحتاج إلى التأكد من تنفيذ تحديثات واجهة المستخدم الرسومية من الموضوع الرئيسي. تحتاج إلى استخدام طريقة “root.after()” لجدولة التحديثات في سلسلة المحادثات الرئيسية. يمكنك معرفة المزيد من – كيفية جدولة إجراء باستخدام طريقة 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...
الحل 6
يظهر الخطأ أدناه في التعليقات، فهذا يعني أنك تحاول التعامل مع الترابط في تطبيق “Tkinter”.
https://projectfreetv.onl/ https://waplus.win/
الحل 1
نظرًا لأنه قد مضى أكثر من 5 ساعات، ولم تخبرنا بعد برسالة الخطأ التي تظهر لك، فإن أفضل ما يمكننا فعله هو أن نقدم لك مساعدة عامة حول رسالة خطأ في بناء الجملة: كيفية كتابة التعليمات البرمجية لحل مشكلة، دليل المبتدئين الجزء 2: أخطاء في بناء الجملة[^]
وسأضع هذا هناك أيضًا: طرح الأسئلة هو مهارة[^] – أقترح عليك قراءة كليهما جيدًا، ومن المفترض أن يساعدك في المستقبل.
[ad_2]
コメント