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

إظهار قائمة النسخ واللصق لأداة Treeview

Ahmed Ahmed64

السؤال

 

السلام عليكم

استخدمت في تصميم الواجهة مكتبة 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

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

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

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

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

  • 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

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

  • 0

ما المقصود بإضافة أداة الإدخال عليهم؟

تقصد تمكين أداة Entry من النسخ واللصق مثل TreeView؟

إذا كان هذا ما تقصده، فستحتاج لتكرار نفس الخطوات للأداة Entry

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

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...