اذهب إلى المحتوى
  • 0

مشكلة في python tkinter عند استدعاء دالة لعرض المدخلات على واجهة البرنامج !!

Hussein Ouda

السؤال

كتبت كود برنامج على python tkinter خاص ببيانات الموظفين 
وتم الاتصال بقواعد البيانات وادخال المعلومات على الجدول بنجاح, 

from tkinter import *
from tkinter import ttk
import pymysql

class Employee:
    # ----------- إنشاء نافذة البرنامج -----------
    def __init__(self, root):
        self.root = root
        self.root.geometry('1300x650+22+22') # الأرقام الإضافية بعد الطول والعرض (22) هي توصيت الشاشة مسافة من اليسار ومن الأعلى
        self.root.title('برنامج إدارة الموظفين')
        self.root.configure(background="#316df4")
        self.root.resizable(False, False)
        title = Label(self.root,
                      text='[بيانات الموظفين]',
                      bg='#316df4',
                      font=('monospace',18),
                      fg='white'
                      )
        title.pack(fill='x')

        # ----------- variable -----------
        # -------- variable = البيانات الشخصية --------
        self.id_var = StringVar()
        self.name_var = StringVar()
        self.mail_var = StringVar()
        self.id_number_var = StringVar()
        self.date_birth_var = StringVar()
        self.gender_var = StringVar()
        self.social_status_var = StringVar()
        self.family_var = StringVar()
        # -------- variable = معلومات الاتصال --------
        self.nationality_var = StringVar()
        self.id_photo_var = StringVar()
        self.country_var = StringVar()
        self.governorate_var = StringVar()
        self.city_var = StringVar()
        self.phone_var = StringVar()
        self.skype_var = StringVar()
        self.telegram_var = StringVar()

        # ----------- تقسيم لأختيارات علوية -----------
        nb = ttk.Notebook(self.root)
        nb.place(x=900,y=34, width=400, height=460)

        f1 = Frame(nb, width='500', height='100', bg='#fff')
        nb.add(f1, text='بيانات شخصية')

        f2 = Frame(nb, width='500', height='100', bg='#fff')
        nb.add(f2, text='معلومات الاتصال')

        # ----------- أدوات التحكم  في البيانات الشخصية 1 -----------
        # Manage_Frame = Frame(self.root, bg='white')
        # Manage_Frame.place(x=10,y=190, width=200, height=460)
        lbl_ID = Label(f1, text='الرقم التسلسلي', bg='#fff', fg='#05234f', font=('monospace', 14))
        lbl_ID.pack()
        ID_Entry = Entry(f1, textvariable=self.id_var, bd='2', bg='#05234f', fg='#fff', justify='center')
        ID_Entry.pack()

        lbl_name = Label(f1, text='اسم الموظف', bg='#fff', fg='#05234f', font=('monospace', 14))
        lbl_name.pack()
        Name_Entry = Entry(f1, textvariable=self.name_var, bd='2', bg='#05234f', fg='#fff', justify='center')
        Name_Entry.pack()

        lbl_email = Label(f1, text='البريد الإلكتروني', bg='#fff', fg='#05234f', font=('monospace', 14))
        lbl_email.pack()
        Email_Entry = Entry(f1, textvariable=self.mail_var, bd='2', bg='#05234f', fg='#fff', justify='center')
        Email_Entry.pack()

        lbl_ID_Number = Label(f1, text='رقم الهوية', bg='#fff', fg='#05234f', font=('monospace', 14))
        lbl_ID_Number.pack()
        ID_Number_Entry = Entry(f1, textvariable=self.id_number_var, bd='2', bg='#05234f', fg='#fff', justify='center')
        ID_Number_Entry.pack()

        lbl_Date_Birth = Label(f1, text='تاريخ الميلاد', bg='#fff', fg='#05234f', font=('monospace', 14))
        lbl_Date_Birth.pack()
        Date_Birth_Entry = Entry(f1, textvariable=self.date_birth_var, bd='2', bg='#05234f', fg='#fff', justify='center')
        Date_Birth_Entry.pack()

        lbl_Gender = Label(f1, text='الجنس', bg='#fff', fg='#05234f', font=('monospace', 14))
        lbl_Gender.pack()
        combo_Gender = ttk.Combobox(
            f1,
            value=('ذكر', 'أنثى'),
            state='readonly',
            textvariable=self.gender_var
        )
        combo_Gender.pack()

        lbl_Social_Status = Label(f1, text='الحالة الاجتماعية', bg='#fff', fg='#05234f', font=('monospace', 14))
        lbl_Social_Status.pack()
        combo_Social_Status = ttk.Combobox(
            f1,
            value=('أعزب', 'متزوج'),
            state='readonly',
            textvariable=self.social_status_var
        )
        combo_Social_Status.pack()

        lbl_Family_Members = Label(f1, text='عدد أفراد الأسرة', bg='#fff', fg='#05234f', font=('monospace', 14))
        lbl_Family_Members.pack()
        Family_Members_Entry = Entry(f1, textvariable=self.family_var, bd='2', bg='#05234f', fg='#fff', justify='center')
        Family_Members_Entry.pack()

        # ----------- أدوات التحكم  في معلومات الاتصال 2 -----------
        # Manage_Frame = Frame(self.root, bg='white')
        # Manage_Frame.place(x=900, y=190, width=200, height=460)
        lbl_Nationality = Label(f2, text='الجنسية', bg='#fff', fg='#05234f', font=('monospace', 14))
        lbl_Nationality.pack()
        Nationality_Entry = Entry(f2, textvariable=self.nationality_var, bd='2', bg='#05234f', fg='#fff', justify='center')
        Nationality_Entry.pack()

        lbl_ID_Photo = Label(f2, text='صورة الهوية', bg='#fff', fg='#05234f', font=('monospace', 14))
        lbl_ID_Photo.pack()
        ID_Photo_Entry = Entry(f2, textvariable=self.id_photo_var, bd='2', bg='#05234f', fg='#fff', justify='center')
        ID_Photo_Entry.pack()

        lbl_Country = Label(f2, text='الدولة', bg='#fff', fg='#05234f', font=('monospace', 14))
        lbl_Country.pack()
        Country_Entry = Entry(f2, textvariable=self.country_var, bd='2', bg='#05234f', fg='#fff', justify='center')
        Country_Entry.pack()

        lbl_State = Label(f2, text='الولاية / المحافظة', bg='#fff', fg='#05234f', font=('monospace', 14))
        lbl_State.pack()
        State_Entry = Entry(f2, textvariable=self.governorate_var, bd='2', bg='#05234f', fg='#fff', justify='center')
        State_Entry.pack()

        lbl_City = Label(f2, text='المدينة', bg='#fff', fg='#05234f', font=('monospace', 14))
        lbl_City.pack()
        City_Entry = Entry(f2, textvariable=self.city_var, bd='2', bg='#05234f', fg='#fff', justify='center')
        City_Entry.pack()

        lbl_Phone_Number = Label(f2, text='رقم الموبايل', bg='#fff', fg='#05234f', font=('monospace', 14))
        lbl_Phone_Number.pack()
        Phone_Number_Entry = Entry(f2, textvariable=self.phone_var, bd='2', bg='#05234f', fg='#fff', justify='center')
        Phone_Number_Entry.pack()

        lbl_Skype = Label(f2, text='سكايب', bg='#fff', fg='#05234f', font=('monospace', 14))
        lbl_Skype.pack()
        Skype_Entry = Entry(f2, textvariable=self.skype_var, bd='2', bg='#05234f', fg='#fff', justify='center')
        Skype_Entry.pack()

        lbl_Telegram = Label(f2, text='تلغرام', bg='#fff', fg='#05234f', font=('monospace', 14))
        lbl_Telegram.pack()
        Telegram_Entry = Entry(f2, textvariable=self.telegram_var, bd='2', bg='#05234f', fg='#fff', justify='center')
        Telegram_Entry.pack()

        # ----------- buttons الأزرار -----------
        btn_Frame = Frame(self.root, bg="#fff")
        btn_Frame.place(x=900, y=500, width=400, height=148)
        title2 = Label(btn_Frame, text='لوحة التحكم', font=('monospace', 16), bg='#316df4', fg='#fff')
        title2.pack(fill='x')

        add_btn = Button(btn_Frame, text='إضافة موظف', bg='#05234f', fg='#fff', cursor='plus', command=self.add_student)
        add_btn.place(x=280, y=50, width=80, height=30)

        del_btn = Button(btn_Frame, text='حذف موظف', bg='#05234f', fg='#fff', cursor='target')
        del_btn.place(x=165, y=50, width=80, height=30)

        update_btn = Button(btn_Frame, text='تعديل بيانات', bg='#05234f', fg='#fff', cursor='circle')
        update_btn.place(x=50, y=50, width=80, height=30)

        clear_btn = Button(btn_Frame, text='إفراغ الحقول', bg='#05234f', fg='#fff', cursor='sizing')
        clear_btn.place(x=280, y=100, width=80, height=30)

        exit_btn = Button(btn_Frame, text='إغلاق البرنامج', bg='#05234f', fg='#fff', cursor='cross')
        exit_btn.place(x=165, y=100, width=80, height=30)

        about_btn = Button(btn_Frame, text='من نحن', bg='#05234f', fg='#fff', cursor='heart', bitmap='info')
        about_btn.place(x=50, y=100, width=80, height=30)

        # ----------- search manage البحث -----------
        search_Frame = Frame(self.root, bg="#fff")
        search_Frame.place(x=2, y=35, width=896, height=50)

        lbl_search = Label(search_Frame, text='البحث', font=('monospace', 16), bg='#fff', fg='#05234f')
        lbl_search.place(x=830, y=12)

        combo_search = ttk.Combobox(search_Frame, justify='right')
        combo_search['value']=('الرقم التسلسلي', 'الاسم', 'الإيميل', 'رقم الهوية', 'الجنس', 'الحالة الاجتماعية', 'المدينة', 'رقم الهاتف', 'المؤهل العلمي', 'الجامعة', 'نوع المهارة', 'المسمى الوظيفي', 'المعرفة المهنية', 'برامج التصميم', 'برامج المونتاج', 'مهارات البرمجة')
        combo_search.place(x=680, y=14)

        search_Entry = Entry(search_Frame, bd='2', bg='#05234f', fg='#fff', justify='right')
        search_Entry.place(x=545, y=14)

        search_btn = Button(search_Frame, text='بحث', bg='#05234f', fg='#fff', cursor='circle')
        search_btn.place(x=460, y=10, width=80, height=30)

        # ----------- dietals عرض النتائج والبيانات -----------
        Dietals_Frame = Frame(self.root, bg="#fff")
        Dietals_Frame.place(x=2, y=88, width=896, height=560)
            # -------- scroll --------
        scroll_x = Scrollbar(Dietals_Frame, orient=HORIZONTAL)
        scroll_y = Scrollbar(Dietals_Frame, orient=VERTICAL)
            # -------- treeview --------
        self.student_table = ttk.Treeview(Dietals_Frame,
            columns=('Telegram', 'Skype', 'Phone', 'City', 'Governorate', 'Country', 'ID photo', 'Nationality',
                     'Family', 'Social Status', 'Gender', 'Date Birth', 'ID Number', 'E-mail', 'Name', 'ID'),
            xscrollcommand=scroll_x.set,
            yscrollcommand=scroll_y.set)
        self.student_table.place(x=20, y=2, width=890, height=540)
        scroll_x.pack(side=BOTTOM, fill='x')
        scroll_y.pack(side=LEFT, fill='y')
        scroll_x.config(command=self.student_table.xview)
        scroll_y.config(command=self.student_table.yview)
        self.student_table['show'] = 'headings'

        self.student_table.heading('Telegram', text='تلغرام')
        self.student_table.heading('Skype', text='سكايب')
        self.student_table.heading('Phone', text='رقم الموبايل')
        self.student_table.heading('City', text='المدينة')
        self.student_table.heading('Governorate', text='المحافظة')
        self.student_table.heading('Country', text='الدولة')
        self.student_table.heading('ID photo', text='صورة الهوية')
        self.student_table.heading('Nationality', text='الجنسية')

        self.student_table.heading('Family', text='عدد أفراد الأسرة')
        self.student_table.heading('Social Status', text='الحالة الاجتماعية')
        self.student_table.heading('Gender', text='الجنس')
        self.student_table.heading('Date Birth', text='تاريخ الميلاد')
        self.student_table.heading('ID Number', text='رقم الهوية')
        self.student_table.heading('E-mail', text='البريد الإلكتروني')
        self.student_table.heading('Name', text='الاسم')
        self.student_table.heading('ID', text='الرقم التسلسلي')

        # ----------- con + add -----------
        self.fetch_all()
    def add_student(self):
        con = pymysql.connect(
            host = 'localhost',
            user = 'root',
            password = '',
            database = 'stud')
        cur = con.cursor()
        cur.execute("insert into student values(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)",(
                    self.id_var.get(),
                    self.name_var.get(),
                    self.mail_var.get(),
                    self.id_number_var.get(),
                    self.date_birth_var.get(),
                    self.gender_var.get(),
                    self.social_status_var.get(),
                    self.family_var.get(),

                    self.nationality_var.get(),
                    self.id_photo_var.get(),
                    self.country_var.get(),
                    self.governorate_var.get(),
                    self.city_var.get(),
                    self.phone_var.get(),
                    self.skype_var.get(),
                    self.telegram_var.get()
                    ))
        con.commit()
        con.close()

    def fetch_all(self):
        con = pymysql.connect(host='localhost', user = 'root', password = '', database = 'employ')
        cur = con.cursor()
        cur.execute('select * from employees')
        rows = cur.fetchall()
        if len (rows) !=0:
            self.student_table.delete(*self.student_table.get_children)
            for row in rows:
                self.student_table.insert("", END, value=row)
            con.commit()
        con.close()


root = Tk()
ob = Employee(root)
root.mainloop()


ولكن بعد كتابة دالة جديدة لعرض تلك المدخلات على واجهة البرنامج :

def fetch_all(self):
        con = pymysql.connect(host='localhost', user = 'root', password = '', database = 'employ')
        cur = con.cursor()
        cur.execute('select * from employees')
        rows = cur.fetchall()
        if len (rows) !=0:
            self.student_table.delete(*self.student_table.get_children)
            for row in rows:
                self.student_table.insert("", END, value=row)
        	con.commit()
        con.close()

وعند استدعاء الدالة :

self.fetch_all()

يعطيني الخطأ التالي: 

line 560, in fetch_all
    self.student_table.delete(*self.student_table.get_children)
TypeError: tkinter.ttk.Treeview.delete() argument after * must be an iterable, not method

أرجو الإفادة

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

 

وجدت حل الإشكالية 

يقول الخطأ 

أنه يتوقع الحصول على iterable أي مؤشر على غرض معين،

بينما يستقبل دالة، لذلك يجب استدعاء الدالة بوضع أقواس () لها 

self.student_table.delete(*self.student_table.get_children())
                                                          ^^

شكر لك يا طيب على مرورك المتفاعل 

 

 

تم التعديل في بواسطة Hussein Aoda
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1

المشكلة تكمن في تمرير القيمة ل delete حيث تقوم بتمرير التابع get_children يجب استدعاءه ثم تمرير القيمة المرجعة منه وليس تمريره كتابع كالتالي 

self.student_table.delete(*self.student_table.get_children())

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...