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

تصحيح الأخطاء في كود Python لفتح وعرض ملف Excel باستخدام tkinter

Ali Ali49

السؤال

السلام عليكم

الرجاء تصحيح كتابة الكود 

حيث أريد جلب إسم إوراق العمل من ملف الإكسل إلى أداة Combobox عند إختيار الملف

الكود الأول ملف كلاس مستقل 

from openpyxl import load_workbook

class load_document:
    def __init__(self, BATH=None):
        self.BATH = BATH
        self.workbook = None
        self.sheet = None
        
    def load_file(self):
        if self.BATH:
            self.workbook = load_workbook(self.BATH)
            self.sheet = self.workbook.active

كود البرنامج

import ttkbootstrap as ttk
from ttkbootstrap.constants import *
from openpyxl import load_workbook
from pathlib import Path
from tkinter import filedialog
from L_Documents import load_document

BOOK1 = load_document()
column_values=()
def COLS_V():
    
    file_path = filedialog.askopenfilename(initialdir="C:\\Users\\Cakow\\PycharmProjects\\Main",title="Open file okay?",filetypes= (("text files","*.xlsx"),("all files","*.*")))
    BOOK1 = load_document(file_path)
    BOOK1.load_file()
    column_values = BOOK1.workbook.sheetnames
    

# أدوات الواجهة
root = ttk.Window(themename="minty")
#-----------------------------------------------------------
frame = ttk.Frame(root)
frame.pack()
#-----------------------------------------------------------
widgets_frame = ttk.LabelFrame(frame, text="إختر الملف")
widgets_frame.grid(row=0, column=0, padx=20, pady=5, sticky="nsew")
#-----------------------------------------------------------
b1 = ttk.Button(widgets_frame, text="إختر الملف", bootstyle=("info", "outline"), command=COLS_V)
b1.grid(row=0, column=0, padx=5, pady=5,  sticky="ew")
#-----------------------------------------------------------
combo = ttk.Combobox(widgets_frame, values=column_values)
combo.grid(row=2, column=0, padx=5, pady=5,  sticky="ew")
root.mainloop()

 

تم التعديل في بواسطة Mustafa Suleiman
تعديل عنوان السؤال
رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

يبدو أن الكود يحتوي على بعض الأخطاء.

جرب تعديل الدالة `COLS_V` لتحديث قيم `Combobox` بعد اختيار الملف، و يمكنك القيام بذلك عن طريق إضافة السطر التالي في نهاية الدالة `COLS_V`:

combo['values'] = column_values

بالإضافة إلى ذلك، دعنا نغيير السطر التالي:

column_values = BOOK1.workbook.sheetnames

إلى:

global column_values
column_values = BOOK1.workbook.sheetnames

هذا يضمن أن قيم `column_values` ستتحدث عند اختيار الملف. 

ليصبح الكود المعدل بالكامل بالشكل :

from openpyxl import load_workbook
import ttkbootstrap as ttk
from tkinter import filedialog

class load_document:
    def __init__(self, BATH=None):
        self.BATH = BATH
        self.workbook = None
        self.sheet = None
        
    def load_file(self):
        if self.BATH:
            self.workbook = load_workbook(self.BATH)
            self.sheet = self.workbook.active

BOOK1 = load_document()
column_values=()

def COLS_V():
    # اختيار الملف
    file_path = filedialog.askopenfilename(initialdir="C:\\Users\\Cakow\\PycharmProjects\\Main",title="Open file okay?",filetypes= (("text files","*.xlsx"),("all files","*.*")))
    BOOK1 = load_document(file_path)
    BOOK1.load_file()
    # تحديث قيم column_values
    global column_values
    column_values = BOOK1.workbook.sheetnames
    # تحديث قيم Combobox
    combo['values'] = column_values
    

# أدوات الواجهة
root = ttk.Window(themename="minty")
#-----------------------------------------------------------
frame = ttk.Frame(root)
frame.pack()
#-----------------------------------------------------------
widgets_frame = ttk.LabelFrame(frame, text="إختر الملف")
widgets_frame.grid(row=0, column=0, padx=20, pady=5, sticky="nsew")
#-----------------------------------------------------------
b1 = ttk.Button(widgets_frame, text="إختر الملف", bootstyle=("info", "outline"), command=COLS_V)
b1.grid(row=0, column=0, padx=5, pady=5,  sticky="ew")
#-----------------------------------------------------------
combo = ttk.Combobox(widgets_frame, values=column_values)
combo.grid(row=2, column=0, padx=5, pady=5,  sticky="ew")
root.mainloop()
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

إخي بارك الله فيك

تمام الكود يعمل كما كنت إريد

لنفترض أني قمت بالتعديل التالي أين الخطأ الأن

from openpyxl import load_workbook
import ttkbootstrap as ttk
from tkinter import filedialog

class load_document:
    def __init__(self, BATH=None):
        self.BATH = BATH
        self.workbook = None
        self.sheet = None
        
    def load_file(self):
        if self.BATH:
            self.workbook = load_workbook(self.BATH)
            self.sheet = self.workbook.active

BOOK1 = load_document()
column_values=()

def COLS_V():
    # اختيار الملف
    file_path = filedialog.askopenfilename(initialdir="C:\\Users\\Cakow\\PycharmProjects\\Main",title="Open file okay?",filetypes= (("text files","*.xlsx"),("all files","*.*")))
    BOOK1 = load_document(file_path)
    BOOK1.load_file()


def COLS_V2():
    global column_values
    column_values = BOOK1.workbook.sheetnames
    # تحديث قيم Combobox
    combo['values'] = column_values     

# أدوات الواجهة
root = ttk.Window(themename="minty")
#-----------------------------------------------------------
frame = ttk.Frame(root)
frame.pack()
#-----------------------------------------------------------
widgets_frame = ttk.LabelFrame(frame, text="إختر الملف")
widgets_frame.grid(row=0, column=0, padx=20, pady=5, sticky="nsew")
#-----------------------------------------------------------
b1 = ttk.Button(widgets_frame, text="إختر الملف", bootstyle=("info", "outline"), command=COLS_V)
b1.grid(row=0, column=0, padx=5, pady=5,  sticky="ew")

b2 = ttk.Button(widgets_frame, text="إدرج أوراق العمل للقائمة", bootstyle=("info", "outline"), command=COLS_V2)
b2.grid(row=1, column=0, padx=5, pady=5,  sticky="ew")
#-----------------------------------------------------------
combo = ttk.Combobox(widgets_frame, values=column_values)
combo.grid(row=2, column=0, padx=5, pady=5,  sticky="ew")
root.mainloop()
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

الكود به عدة أخطاء:

  • في السطر import ttkbootstrap as ttk، الوارد في السطر الثاني، تحتاج إلى استبدالها بـ from tkinter import ttk، حيث أن ttkbootstrap ليس وحدة معترف بها في مكتبة tkinter.
  • في السطر BOOK1 = load_document(file_path)، يجب تمرير القيمة file_path كوسيطة للكائن load_document بدلاً من BATH، وتغيير السطر إلى BOOK1 = load_document(file_path).
  • يجب استدعاء load_file() لتحميل الملف داخل الدالة COLS_V() بعد تعيين قيمة BATH لكائن BOOK1، وتغيير السطر BOOK1.load_file() إلى BOOK1.load_file().
  • تحديث قائمة column_values داخل الدالة COLS_V2() بعد تحميل الملف واستعادة أسماء الأوراق، أي تغيير السطر column_values = BOOK1.workbook.sheetnames إلى column_values = BOOK1.sheet.sheetnames.
from openpyxl import load_workbook
from tkinter import ttk, filedialog

class load_document:
    def __init__(self, BATH=None):
        self.BATH = BATH
        self.workbook = None
        self.sheet = None
        
    def load_file(self):
        if self.BATH:
            self.workbook = load_workbook(self.BATH)
            self.sheet = self.workbook.active

BOOK1 = load_document()
column_values = ()

def COLS_V():
    # اختيار الملف
    file_path = filedialog.askopenfilename(initialdir="C:\\Users\\Cakow\\PycharmProjects\\Main",title="Open file okay?",filetypes=(("text files","*.xlsx"),("all files","*.*")))
    BOOK1 = load_document(file_path)
    BOOK1.load_file()

def COLS_V2():
    global column_values
    column_values = BOOK1.sheet.sheetnames
    # تحديث قيم Combobox
    combo['values'] = column_values

# أدوات الواجهة
root = ttk.Tk()
#-----------------------------------------------------------
frame = ttk.Frame(root)
frame.pack()
#-----------------------------------------------------------
widgets_frame = ttk.LabelFrame(frame, text="إختر الملف")
widgets_frame.grid(row=0, column=0, padx=20, pady=5, sticky="nsew")
#-----------------------------------------------------------
b1 = ttk.Button(widgets_frame, text="إختر الملف", style="info.Outline.TButton", command=COLS_V)
b1.grid(row=0, column=0, padx=5, pady=5, sticky="ew")

b2 = ttk.Button(widgets_frame, text="إدرج أوراق العمل للقائمة", style="info.Outline.TButton", command=COLS_V2)
b2.grid(row=1, column=0, padx=5, pady=5, sticky="ew")
#-----------------------------------------------------------
combo = ttk.Combobox(widgets_frame, values=column_values)
combo.grid(row=2, column=0, padx=5, pady=5, sticky="ew")
root.mainloop()

 

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

  • 0

بعض الأخطاء التي لا تؤثر على عمل البرامج و لكن ستسبب بعض المشاكل في حال كنت تعمل في فريق، و هي طريقة التسمية الخاصة بأي شيء.

لقد قمت بتسمية الكلاس بأحرف صغيرة و هذا خطأ، يجب تسميته بحيث يكون أول حرف من كل كلمة كبير.

لقد قمت بتسمية متغير ضمن الكلاس بأحرف كبيرة بشكل كامل، هذا نقوم به فقط للثوابت العامة و ليس للمتغيرات المحلية، يجب تسميته بأحرف صغيرة فقط.

من غير الجيد نهائياً القيام بما يلي:

from ttkbootstrap.constants import *

هذا من أسوء الأمور التي قد يقوم بها الشخص في بايثون، يجب تحديد ما تريد تصديره بشكل واضح أو قم بكتابة ما يلي:

from ttkbootstrap import constants

هكذا يمكنك الوصول إلى قيمة ضمن constants عن طريق كتابة constants.val حيث val هي القيمة المراد الوصول إليها.

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

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...