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

السؤال

نشر (معدل)

 

السلام عليكم

استخدمت في تصميم الواجهة مكتبة tkinter

لدي أداة Treeview  حاولت كتابة شفرة تقوم  بإظهار قائمة النسخ واللصق عند الضغط بالماوس

        self.popup_menu = tk.Menu(self.frame, tearoff=0)
        self.popup_menu.add_command(label="Cut", command=lambda: self.entry1.event_generate("<<Cut>>"))
        self.popup_menu.add_command(label="Copy", command=lambda : self.entry1.event_generate("<<Copy>>"))
        self.popup_menu.add_command(label="Paste", command=lambda: self.entry1.event_generate("<<Paste>>"))

 

self.tree.bind("<Button-3>", self.show_popup_menu)

 

    def show_popup_menu(self,event):
        self.popup_menu.post(event.x_root, event.y_root)

المشكلة أن القائمة تظهر عند الضغط ولاكن لا يتم النسخ من السجل أو الصف المحدد في Treeview

أرجو توضيح أن يتم التعديل في كتابة الكود

حاولت مع هذه الشفرة ولم تنجح

    def popup(self, event):
        iid = self.tree.identify_row(event.y)
        if iid:
            self.tree.selection_set(iid)
            self.contextMenu.post(event.x_root, event.y_root)            
        else:
            pass

 

تم التعديل في بواسطة Ahmed Ahmed64

Recommended Posts

  • 0
نشر (معدل)

ربما تحتاج استبدال هذه الأسطر

        self.popup_menu.add_command(label="Cut", command=lambda: self.entry1.event_generate("<<Cut>>"))
        self.popup_menu.add_command(label="Copy", command=lambda : self.entry1.event_generate("<<Copy>>"))
        self.popup_menu.add_command(label="Paste", command=lambda: self.entry1.event_generate("<<Paste>>"))

بهذه

	self.popup_menu.add_command(label="Cut", command=lambda: self.cut_item())
	self.popup_menu.add_command(label="Copy", command=lambda: self.copy_item())
	self.popup_menu.add_command(label="Paste",  command=lambda: self.paste_item())

def cut_item():
    item = tree.selection()[0]
    
    root.clipboard_clear()
    
    root.clipboard_append(tree.item(item, option="text"))
    
    tree.delete(item)

def copy_item():
    item = tree.selection()[0]

    root.clipboard_clear()

    root.clipboard_append(tree.item(item, option="text"))

def paste_item():
    text = root.clipboard_get()

    tree.insert("", "end", text=text)

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

مع استخدام

def show_popup_menu(self,event):
  	self.popup_menu.post(event.x_root, event.y_root)

 

تم التعديل في بواسطة El Sayed El Tohamy
  • 0
نشر
بتاريخ 11 ساعة قال El Sayed El Tohamy:

ربما تحتاج استبدال هذه الأسطر

        self.popup_menu.add_command(label="Cut", command=lambda: self.entry1.event_generate("<<Cut>>"))
        self.popup_menu.add_command(label="Copy", command=lambda : self.entry1.event_generate("<<Copy>>"))
        self.popup_menu.add_command(label="Paste", command=lambda: self.entry1.event_generate("<<Paste>>"))

بهذه

	self.popup_menu.add_command(label="Cut", command=lambda: self.cut_item())
	self.popup_menu.add_command(label="Copy", command=lambda: self.copy_item())
	self.popup_menu.add_command(label="Paste",  command=lambda: self.paste_item())

def cut_item():
    item = tree.selection()[0]
    
    root.clipboard_clear()
    
    root.clipboard_append(tree.item(item, option="text"))
    
    tree.delete(item)

def copy_item():
    item = tree.selection()[0]

    root.clipboard_clear()

    root.clipboard_append(tree.item(item, option="text"))

def paste_item():
    text = root.clipboard_get()

    tree.insert("", "end", text=text)

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

مع استخدام

def show_popup_menu(self,event):
  	self.popup_menu.post(event.x_root, event.y_root)

 

شكرا أخي 

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

def show_popup_menu(self,event):
  	self.popup_menu.post(event.x_root, event.y_root)

 

  • 0
نشر (معدل)

سأرسل لك الشيفرة كاملة

import tkinter as tk
from tkinter import ttk

root = tk.Tk()

tree = ttk.Treeview(root)
tree.pack()

tree.insert("", "end", text="Item 1")
tree.insert("", "end", text="Item 2")
tree.insert("", "end", text="Item 3")

popup = tk.Menu(tree, tearoff=0)
popup.add_command(label="Copy", command=lambda: copy_item())
popup.add_command(label="Paste", command=lambda: paste_item())

def copy_item():
    item = tree.selection()[0]
    # تنظيف الذاكرة
    root.clipboard_clear()
    # نسخ عنوان العنصر إلى الذكرة
    root.clipboard_append(tree.item(item, option="text"))

# تعريف وظيفة لعملية اللصق
def paste_item():
    text = root.clipboard_get()    
    tree.insert("", "end", text=text)

# تعريف وظيفة لإظهار القائمة
def show_popup(event):
    # تحديد الصف تحت مؤشر الفأرة
    row = tree.identify_row(event.y)
    # في حالة أن الصف ليس فارغًا
    if row:
        # نقوم باختيار الصف من الشجرة
        tree.selection_set(row)
        # إظهار القائمة
        popup.post(event.x_root, event.y_root)

tree.bind("<Button-3>", show_popup)

root.mainloop()

يمكنك استخدام الشيفرة كما هي أو وضعها داخل تصنيف class

تم التعديل في بواسطة El Sayed El Tohamy
  • 0
نشر
بتاريخ 5 ساعة قال El Sayed El Tohamy:

سأرسل لك الشيفرة كاملة

import tkinter as tk
from tkinter import ttk

root = tk.Tk()

tree = ttk.Treeview(root)
tree.pack()

tree.insert("", "end", text="Item 1")
tree.insert("", "end", text="Item 2")
tree.insert("", "end", text="Item 3")

popup = tk.Menu(tree, tearoff=0)
popup.add_command(label="Copy", command=lambda: copy_item())
popup.add_command(label="Paste", command=lambda: paste_item())

def copy_item():
    item = tree.selection()[0]
    # تنظيف الذاكرة
    root.clipboard_clear()
    # نسخ عنوان العنصر إلى الذكرة
    root.clipboard_append(tree.item(item, option="text"))

# تعريف وظيفة لعملية اللصق
def paste_item():
    text = root.clipboard_get()    
    tree.insert("", "end", text=text)

# تعريف وظيفة لإظهار القائمة
def show_popup(event):
    # تحديد الصف تحت مؤشر الفأرة
    row = tree.identify_row(event.y)
    # في حالة أن الصف ليس فارغًا
    if row:
        # نقوم باختيار الصف من الشجرة
        tree.selection_set(row)
        # إظهار القائمة
        popup.post(event.x_root, event.y_root)

tree.bind("<Button-3>", show_popup)

root.mainloop()

يمكنك استخدام الشيفرة كما هي أو وضعها داخل تصنيف class

استفسار أستاذي بخصوص هذا السطر

popup.post(event.x_root, event.y_root)

استبدلت root     بكلمة  self التي تعود على البرنامج ولاكن جدث خطأ

AttributeError: 'Event' object has no attribute 'x_self'

  • 0
نشر (معدل)
بتاريخ 21 دقائق مضت قال El Sayed El Tohamy:

أنت أنشات تصنيفًا class وتريد وضع الشيفرات بداخله؟

هل التصنيف يرث من أي تصنيف آخر؟

يرجى مشاركة الأجزاء الأولى من الشيفرات الخاصة بك، بحيث يظهر إنشاء التصنيف والباني __init__

        self.tree = ttk.Treeview(self.Frame_C)
        self.tree.grid(row=0, column=0, sticky='nsew')

        self.tree.insert("", "end", text="Item 1")
        self.tree.insert("", "end", text="Item 2")
        self.tree.insert("", "end", text="Item 3")
        
        self.popup = tk.Menu(self, tearoff=0)
        self.popup.add_command(label="Copy", command=lambda: self.copy_item())
        self.popup.add_command(label="Paste", command=lambda: self.paste_item())
        
        self.tree.bind("<Button-3>", self.show_popup)

ttk.Treeview  داخل فريم self.Frame_C

و  self.Frame_C داخل فريم self.Frame_Basis

و self.Frame_Basis ترث من self 

مسمى الكلاس app

class App(ctk.CTk,tk.Tk):
    def __init__(self):
        super().__init__()

 

تم التعديل في بواسطة Ahmed Ahmed64
  • 0
نشر

في البداية لن تحتاج للوراثة غير من التصنيف tk.Tk فقط،

هذه الشيفرة كاملة بعد وضعها داخل تصنيف class يسمى app

import tkinter as tk
from tkinter import ttk

class app(tk.Tk):
    def __init__(self) -> None:
        super().__init__()
        
// لاحظ أن الكائن التالي يحتاج مكتبة
// ttk
        self.tree = ttk.Treeview(self)
        self.tree.pack()

        self.tree.insert("", "end", text="Item 1")
        self.tree.insert("", "end", text="Item 2")
        self.tree.insert("", "end", text="Item 3")

        self.popup = tk.Menu(self.tree, tearoff=0)
        self.popup.add_command(label="Copy", command=lambda: self.copy_item())
        self.popup.add_command(label="Paste", command=lambda: self.paste_item())

        self.tree.bind("<Button-3>", self.show_popup)

    def copy_item(self):
        item = self.tree.selection()[0]
        self.clipboard_clear()
        self.clipboard_append(self.tree.item(item, option="text"))

    def paste_item(self):
        text = self.clipboard_get()
        self.tree.insert("", "end", text=text)

    def show_popup(self, event):
        row = self.tree.identify_row(event.y)
        if row:
            self.tree.selection_set(row)
            self.popup.post(event.x_root, event.y_root)

form = app()
form.mainloop()

 

  • 0
نشر
بتاريخ 8 دقائق مضت قال El Sayed El Tohamy:

في البداية لن تحتاج للوراثة غير من التصنيف tk.Tk فقط،

هذه الشيفرة كاملة بعد وضعها داخل تصنيف class يسمى app

import tkinter as tk
from tkinter import ttk

class app(tk.Tk):
    def __init__(self) -> None:
        super().__init__()
        
// لاحظ أن الكائن التالي يحتاج مكتبة
// ttk
        self.tree = ttk.Treeview(self)
        self.tree.pack()

        self.tree.insert("", "end", text="Item 1")
        self.tree.insert("", "end", text="Item 2")
        self.tree.insert("", "end", text="Item 3")

        self.popup = tk.Menu(self.tree, tearoff=0)
        self.popup.add_command(label="Copy", command=lambda: self.copy_item())
        self.popup.add_command(label="Paste", command=lambda: self.paste_item())

        self.tree.bind("<Button-3>", self.show_popup)

    def copy_item(self):
        item = self.tree.selection()[0]
        self.clipboard_clear()
        self.clipboard_append(self.tree.item(item, option="text"))

    def paste_item(self):
        text = self.clipboard_get()
        self.tree.insert("", "end", text=text)

    def show_popup(self, event):
        row = self.tree.identify_row(event.y)
        if row:
            self.tree.selection_set(row)
            self.popup.post(event.x_root, event.y_root)

form = app()
form.mainloop()

 

نعم أخي لقد نجحت الشفرة 

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

جزاك الله خيراً أستاذي

هل من الممكن التعديل عليه قليلا فقد كنت أحاول ولاكن دون جدوى أحتاج للتعديل على الشفره لكي تتمشى أيضا مع أداة tk.Entry

  • 0
نشر

يمكنك إضافة أي أداة مهما كانت المكتبة الخاصة بها، يتم ذلك داخل الباني __init__ بحيث تجعل المعامل الأول للأداة هو self

مثل المثال التالي:

class app(tk.Tk):
    def __init__(self) -> None:
        super().__init__()
        
        self.tree = ttk.Treeview(self)
        self.tree.pack()

        self.entry2 = tk.Entry(self)
        self.entry2.pack()

 

  • 0
نشر
بتاريخ 25 دقائق مضت قال El Sayed El Tohamy:

يمكنك إضافة أي أداة مهما كانت المكتبة الخاصة بها، يتم ذلك داخل الباني __init__ بحيث تجعل المعامل الأول للأداة هو self

مثل المثال التالي:

class app(tk.Tk):
    def __init__(self) -> None:
        super().__init__()
        
        self.tree = ttk.Treeview(self)
        self.tree.pack()

        self.entry2 = tk.Entry(self)
        self.entry2.pack()

 

أستاذي لم يكن هذا سؤال يبدو أن السؤال لم يكن مفهوم لديك

سؤالي من خلال شيفرة النسخ واللصق كيف أضيف عليهم أداة الإدخال Entry

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...