سطر الخطأ 44، في update_table


مرحبًا يا شباب، لماذا يعود هذا الرمز بالخطأ في السطر 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: أخطاء في بناء الجملة[^]

وسأضع هذا هناك أيضًا: طرح الأسئلة هو مهارة[^] – أقترح عليك قراءة كليهما جيدًا، ومن المفترض أن يساعدك في المستقبل.

コメント

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