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

تغيير قيمة Entry حسب الخيار في combo box في tkinter

Ahmed Ahmed64

السؤال

أرجو المساعدة كيف أستطيع عند إختيار قيمة من أداة combo أن تظهر القيمة المقابلة لها من العمود الثاني أو على سبيل المثال العمود الثالت حيث أضهر النتيحة في مربع النص

from tkinter import *

from tkinter import ttk

from openpyxl.workbook import workbook

from openpyxl import load_workbook



FORM_A=Tk()

FORM_A.geometry('800x500')



w_book1=load_workbook('Employee.xlsx')

sheet_1=w_book1.active



employee={}

i=1

for row in sheet_1.iter_rows(min_row=1, max_row=9,min_col=1,max_col=5,values_only=True):

    id=i

    st={"Employee-number":row[0],"Employee-name":row[1],"employee-phone":row[2],"Employee-email":row[3],}

    i+=1

    employee[id]=st

numbers = [row["Employee-number"] for row in employee.values()]

names = [row["Employee-name"] for row in employee.values()]

Combo1=ttk.Combobox(FORM_A,width=50,values=numbers).pack(pady=30)

Combo2=ttk.Combobox(FORM_A,width=50,values=names).pack(pady=30)

print(employee)



# هنا أريد إدراج قيمة العود الثاني المقابلة للعمود الأول عند الإختيار من أداة الكومبوبكس

Entry1=Entry(FORM_A,width=50).pack(pady=30)




FORM_A.mainloop()

Employee.xlsx

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

Recommended Posts

  • 0

للقيام بهذا الأمر نقوم باستعمال ال events، إنه مفهوم عام في تطوير تطبيقات سطح المكتب، نقوم بربط تابع ما بحدث ما، مثلاً هنا يمكنك ربط تابع ما بحدث اختيار قيمة من ال combo box.

هناك مثلاً الحدث <<ComboboxSelected>> و الذي يحدث عندما يتم اختيار قيمة من ال combo box، يمكنك تمرير تابع ليتم استدعاءه في هذه الحالة كما يلي:

combo.bind("<<ComboboxSelected>>", callbackFunc)

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

عند الحصول على القيمة يمكنك عندها ببساطة تغيير قيمة ال entry إلى تلك القيمة.

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

  • 0
بتاريخ 37 دقائق مضت قال Ahmed Ahmed:

أنا هنا أستعمل قاموس ( الرجاء التوضيح أكثر ) على المثال المرسل حتى أفهم الطريقة

انت تقوم باستعمال قاموس لملئ الخانات في ال combo box، و أصبح لديك غرض من الصف الخاص بال combo box، هذا الصف لديه حدث هو اختيار قيمة، يمكنك ربط هذا الحدث بتابع، هذا التابع سيأخذ القيمة الحالية لل combo box و ينظر ما يقابلها، يمكنك إيجاد المتقابلات عن طريق صنع قاموس اضافي مفاتيحه القيم من ال combo box و القيم هي ما يقابل هذه المفاتيح، أي ما تريد عرضه في ال Entry.

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

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

  • 0

ذكرت أني أحتاج أن أقوم بإنشاء قاموس إضافي مفاتيحة القيم من ال combo box

حاولت برمجة هذا الكود ولاكن لم أستفد منه 

namme= {key:val for key,val in employee.items()}

الرجاء توجيهي خطوة بخطوة  لكي أستوعب المطلوب بشكل أفضل

ما المطلوب أولا

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

  • 0
بتاريخ 15 دقائق مضت قال Ahmed Ahmed:

ذكرت أني أحتاج أن أقوم بإنشاء قاموس إضافي مفاتيحة القيم من ال combo box

حاولت برمجة هذا الكود ولاكن لم أستفد منه 

namme= {key:val for key,val in employee.items()}

الرجاء توجيهي خطوة بخطوة  لكي أستوعب المطلوب بشكل أفضل

ما المطلوب أولا

في البداية قم باستخراج الأعمدة التي تريدها إلى لائحة، كما قمت بذلك مع الأسماء مثلاً، بعد ذلك يمكننا المرور على اللائحتين و وضع قيمة أحدهما كمفتاح و الأخرى كقيمة (ما نضعه في ال combo يكون المفتاح و القيمة ما يقابله)، سأعطيك مثالاً على لائحتين عشوائيتين:

a = ["n1", "n2", "n3"]
b = [11, 22, 33]
 
d = {k:v for (k, v) in zip(a, b)}
print(d)
# {'n1': 11, 'n2': 22, 'n3': 33}

تعليمة zip تقوم بوضع القيم المتقابلة من اللائحتين سوياً، و من ثم قمت بتحويل هذه القيم إلى مفاتيح و قيم في قاموس.

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

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

  • 0
numbers = [row["Employee-number"] for row in employee.values()] 
names = [row["Employee-name"] for row in employee.values()] 
d = {k:v for (k, v) in zip(numbers, names)}

هل ماقمت به الأن صححيح ,, إذا كان ذلك كيف أتعامل مع الكومبوبكس في ذلك أم ينقص أم ما ,, هل حان الأمر الأن لأتعامل مع الكود التالي 

combo.bind("<<ComboboxSelected>>", callbackFunc)

مثال هل يعمل الكود السابق بهكذا طريقة

def callbackFunc(event😞

    print("ok")         

Combo1.bind("<<ComboboxSelected>>", callbackFunc)

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

  • 0
بتاريخ منذ ساعة مضت قال Ahmed Ahmed:
numbers = [row["Employee-number"] for row in employee.values()] 
names = [row["Employee-name"] for row in employee.values()] 
d = {k:v for (k, v) in zip(numbers, names)}

هل ماقمت به الأن صححيح ,, إذا كان ذلك كيف أتعامل مع الكومبوبكس في ذلك أم ينقص أم ما ,, هل حان الأمر الأن لأتعامل مع الكود التالي 

combo.bind("<<ComboboxSelected>>", callbackFunc)

مثال هل يعمل الكود السابق بهكذا طريقة

def callbackFunc(event😞

    print("ok")         

Combo1.bind("<<ComboboxSelected>>", callbackFunc)

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

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

  • 0
def callbackFunc(event):
    value1=Combo1.get()
    print(value1)

Combo1=ttk.Combobox(FORM_A,width=50,values=numbers)
Combo1.bind("<<ComboboxSelected>>", callbackFunc)
Combo1.pack(pady=30)

النتيجة تظهر القيمة المختارة من Combo1 

أين الخطأ .... أريد إظهار القيمة المقابلة للقيمة المختارة من القاموس للمتغبر الذي أعطيته إسم d

d = {k:v for (k, v) in zip(numbers, names)} 

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

  • 0
بتاريخ 4 دقائق مضت قال Ahmed Ahmed:
def callbackFunc(event):
    value1=Combo1.get()
    print(value1)

Combo1=ttk.Combobox(FORM_A,width=50,values=numbers)
Combo1.bind("<<ComboboxSelected>>", callbackFunc)
Combo1.pack(pady=30)

النتيجة تظهر القيمة المختارة من Combo1 

أين الخطأ .... أريد إظهار القيمة المقابلة للقيمة المختارة من القاموس للمتغبر الذي أعطيته إسم d

d = {k:v for (k, v) in zip(numbers, names)} 

كل ما عليك القيام به هو استعمال القاموس d، أي بدلا من طباعة value1 نقوم بطباعة d[value1]، و بذلك نحصل على القيمة المقابلة.

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

  • 0
def callbackFunc(event):
    value1=Combo1.get()
    print (d[value1])
    
numbers = [row["Employee-number"] for row in employee.values()] 
names = [row["Employee-name"] for row in employee.values()] 

d = {k:v for (k, v) in zip(numbers, names)}

Combo1=ttk.Combobox(FORM_A,width=50,values=numbers)
Combo1.bind("<<ComboboxSelected>>", callbackFunc)
Combo1.pack(pady=30)

يبد أن لدي خطأ هنا النتيجة تظهر لي قيمة نفس العمود بوجود خطأ كالتالي

image.png.161844e5d7e7137bc99363856052f2a4.png

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

  • 0
بتاريخ منذ ساعة مضت قال Ahmed Ahmed:
def callbackFunc(event):
    value1=Combo1.get()
    print (d[value1])
    
numbers = [row["Employee-number"] for row in employee.values()] 
names = [row["Employee-name"] for row in employee.values()] 

d = {k:v for (k, v) in zip(numbers, names)}

Combo1=ttk.Combobox(FORM_A,width=50,values=numbers)
Combo1.bind("<<ComboboxSelected>>", callbackFunc)
Combo1.pack(pady=30)

يبد أن لدي خطأ هنا النتيجة تظهر لي قيمة نفس العمود بوجود خطأ كالتالي

image.png.161844e5d7e7137bc99363856052f2a4.png

إن القيم تصبح سلاسل نصية في ال combo box لذلك كل ما عليك هو تحويلها إلى رقم كما يلي:

d[int(value1)]

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

  • 0
بتاريخ 4 دقائق مضت قال Kais Hasan:

إن القيم تصبح سلاسل نصية في ال combo box لذلك كل ما عليك هو تحويلها إلى رقم كما يلي:

d[int(value1)]

عند محاولة الطباعة لم يظهر لي شي ؟

print= d[int(value1)]

 

بتاريخ 7 دقائق مضت قال Ahmed Ahmed:

عند محاولة الطباعة لم يظهر لي شي ؟

print= d[int(value1)]

 

رائع جداً 

مشكلة في تمرير القيمة (أين الخطأ )

def callbackFunc(event):
    value1=Combo1.get()
    A1= d[int(value1)]
    Entry1.text=A1

 

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

  • 0
بتاريخ 10 دقائق مضت قال Ahmed Ahmed:

عند محاولة الطباعة لم يظهر لي شي ؟

print= d[int(value1)]

 

رائع جداً 

مشكلة في تمرير القيمة (أين الخطأ )

def callbackFunc(event):
    value1=Combo1.get()
    A1= d[int(value1)]
    Entry1.text=A1

 

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

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

  • 0
بتاريخ 14 دقائق مضت قال Kais Hasan:

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

أخي الحبيب أشكرك جزيل الشكر والإمتنان على الوقت والجهذ المبذول منك لكي توصل المعلومة ولك مني كل التقدير والإحترام

أخي الأن وصلت إلى المعلومة التي كنت أعجز عن القيام بها والأن وقفت عند جزئية بسيطة ولا أدري الخطأ أين

المطلوب الأن بعد التحصل على قيمة المتغير A1 تمريرها إلى Entry

def callbackFunc(event):
    value1=Combo1.get()
    A1= d[int(value1)]
    Entry1.config(text=A1)

 

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

  • 0
بتاريخ 2 دقائق مضت قال Ahmed Ahmed:

أخي الحبيب أشكرك جزيل الشكر والإمتنان على الوقت والجهذ المبذول منك لكي توصل المعلومة ولك مني كل التقدير والإحترام

أخي الأن وصلت إلى المعلومة التي كنت أعجز عن القيام بها والأن وقفت عند جزئية بسيطة ولا أدري الخطأ أين

المطلوب الأن بعد التحصل على قيمة المتغير A1 تمريرها إلى Entry

def callbackFunc(event):
    value1=Combo1.get()
    A1= d[int(value1)]
    Entry1.text=A1

 

العفو، هذا واجبنا.

إن المكون Entry بشكل عام يستعمل لإدخال نص و ليس لعرض نص، في حال كنت متأكداً بأنه لن يتم إدخال نص يمكن القيام بذلك كما يلي:

Entry1.insert(0, str(...))

يجب وضع ما تريده بدلاً من الثلاث نقاط.

في حال كان من الممكن أن يتم إدخال نص و لكن تريد محي النص المدخل و إظهار ما تريده فقط يمكن القيام بذلك كما يلي:

n = len(Entry1.get())
Entry1.delete(0, n)
Entry1.insert(0, str(...))

و لكن أنصحك باستعمال المكون label في حال كنت تريد عرض شيء فقط بدون إدخال.

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

  • 0
بتاريخ 2 دقائق مضت قال Kais Hasan:

العفو، هذا واجبنا.

إن المكون Entry بشكل عام يستعمل لإدخال نص و ليس لعرض نص، في حال كنت متأكداً بأنه لن يتم إدخال نص يمكن القيام بذلك كما يلي:

Entry1.insert(0, str(...))

يجب وضع ما تريده بدلاً من الثلاث نقاط.

في حال كان من الممكن أن يتم إدخال نص و لكن تريد محي النص المدخل و إظهار ما تريده فقط يمكن القيام بذلك كما يلي:

n = len(Entry1.get())
Entry1.delete(0, n)
Entry1.insert(0, str(...))

و لكن أنصحك باستعمال المكون label في حال كنت تريد عرض شيء فقط بدون إدخال.

أشكرك أخي فعلا هذا ماقمت به الأن قبل الحصول على الجواب من حضرتك حيث أني إستخدمت label لذلك

تحياتي أخي ( بارك الله فيك ) وزادك الله علماً

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

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

  • 0
بتاريخ 11 دقائق مضت قال Ahmed Ahmed:

أشكرك أخي فعلا هذا ماقمت به الأن قبل الحصول على الجواب من حضرتك حيث أني إستخدمت label لذلك

تحياتي أخي ( بارك الله فيك ) وزادك الله علماً

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

ليس لدي معلومات عن كورس عن هذا الأمر، و لكن بالطبع يمكنك المحاولة و البحث و في حال واجهتك مشاكل يمكنك نشر سؤال آخر و سنساعدك في حله.

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

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...