繁体   English   中英

Tkinter - 通过绑定复制到剪贴板(Control+c 快捷键):关闭程序时剪贴板为空,但通过 tkinter 上下文菜单一切正常

[英]Tkinter - Copy to clipboard via bind (Control+c shortcut): Clipboard is empty when closing program, but via tkinter context menu everything is normal

在自定义条目中,我有一个上下文菜单,其中 function 复制选定的文本,由 pyperclip 执行。

从上下文菜单中执行“copy_to_clipboard”function 时,一切正常...所选文本被复制到剪贴板。 当我关闭程序时,文本仍保留在剪贴板上,我可以将其粘贴到任何其他应用程序中。

但是,当我使用键盘快捷键“Control + C”运行相同的“copy_to_clipboard”function 时,文本会正常复制到剪贴板,但是当我关闭 tkinter 应用程序时,剪贴板会被删除。

如何解决这个问题?

例子:

from tkinter import *
import pyperclip

class Menu_Entry(Entry):
    def __init__(self,perant,*args,**kwargs):
        Entry.__init__(self,perant,*args,**kwargs)

        self.popup_menu=Menu(self,tearoff=0)
        self.popup_menu.add_command(label="nnnnnnnnnnnnnnnnnn")
        self.popup_menu.add_command(label="nnnnnnnnnnnnnnnnnn")
        self.popup_menu.add_separator()
        
        self.popup_menu.add_command(label="Copy",command=self.copy_to_clipboard, accelerator='Ctrl+C')

        self.bind('<Button-3>',self.popup)
        self.bind('<Menu>',self.popup)
        self.bind("<Control-a>",self.select_all)
        self.bind("<Control-A>",self.select_all)

        self.bind("<Control-c>",self.copy_to_clipboard)
        self.bind("<Control-C>",self.copy_to_clipboard)


    def popup(self, event):
        if self.select_present():
            self.popup_menu.entryconfig("Copy", state=NORMAL)
        else:
            self.popup_menu.entryconfig("Copy", state=DISABLED)

        self.popup_menu.tk_popup(event.x_root, event.y_root, 0)


    def select_all(self, event=None):
            self.select_range(0, END)
            self.icursor(END)
            return 'break'


    def copy_to_clipboard(self, event=None):
        if self.select_present():
            self.clipboard_clear()
            self.update()

            pyperclip.copy(self.selection_get())
            self.update()

            print('string: ', self.selection_get())


root = Tk()
root.title('test')
root.geometry('400x400')

root.ent_user = Menu_Entry(root)
root.ent_user.insert(-1, 'Select me ')
root.ent_user.pack()

root.mainloop()

在这里,我使用 Linux Mint 20.2 x64 Cinnamon x11,代码不起作用,我设法修复了副本 function 在这里为我工作,在 ZC1C4252678E178A 末尾添加此行

return 'break'

固定的:

def copy_to_clipboard(self, event=None):
    self.clipboard_clear()
    self.update()
    pyperclip.copy(self.selection_get())
    self.update()
    return 'break'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM