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

السؤال

نشر (معدل)

السلام عليكم

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

حيث أريد جلب إسم إوراق العمل من ملف الإكسل إلى أداة 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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...