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
在自定义条目中,我有一个上下文菜单,具有复制所选文本的功能,由 pyperclip 执行。
从上下文菜单执行 'copy_to_clipboard' 功能时,一切正常...所选文本已复制到剪贴板。当我关闭程序时,文本仍保留在剪贴板上,我可以将其粘贴到任何其他应用程序中。
但是当我 运行 使用键盘快捷键 'Control + C' 相同的 'copy_to_clipboard' 功能时,文本会正常复制到剪贴板,但是当我关闭 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()
这里我用的是LinuxMint 20.2 x64 Cinnamon x11,
代码不工作,我设法修复了复制功能在这里为我工作,在函数末尾添加这一行:
return 'break'
固定:
def copy_to_clipboard(self, event=None):
self.clipboard_clear()
self.update()
pyperclip.copy(self.selection_get())
self.update()
return 'break'
在自定义条目中,我有一个上下文菜单,具有复制所选文本的功能,由 pyperclip 执行。
从上下文菜单执行 'copy_to_clipboard' 功能时,一切正常...所选文本已复制到剪贴板。当我关闭程序时,文本仍保留在剪贴板上,我可以将其粘贴到任何其他应用程序中。
但是当我 运行 使用键盘快捷键 'Control + C' 相同的 'copy_to_clipboard' 功能时,文本会正常复制到剪贴板,但是当我关闭 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()
这里我用的是LinuxMint 20.2 x64 Cinnamon x11, 代码不工作,我设法修复了复制功能在这里为我工作,在函数末尾添加这一行:
return 'break'
固定:
def copy_to_clipboard(self, event=None):
self.clipboard_clear()
self.update()
pyperclip.copy(self.selection_get())
self.update()
return 'break'