2024-05-15 00:19:46 发布
网友
我正在使用WindowsXP,Python2.6.x和TKinter。在应用程序中使用文本小部件,但缺少标准弹出菜单(剪切、复制、粘贴、删除、全选)。如何让它出现?
我找到了办法,多亏了this post。我做了一些修改。在底部有一个最小的main来尝试它。
main
from Tkinter import * def rClicker(e): ''' right click context menu for all Tk Entry and Text widgets ''' try: def rClick_Copy(e, apnd=0): e.widget.event_generate('<Control-c>') def rClick_Cut(e): e.widget.event_generate('<Control-x>') def rClick_Paste(e): e.widget.event_generate('<Control-v>') e.widget.focus() nclst=[ (' Cut', lambda e=e: rClick_Cut(e)), (' Copy', lambda e=e: rClick_Copy(e)), (' Paste', lambda e=e: rClick_Paste(e)), ] rmenu = Menu(None, tearoff=0, takefocus=0) for (txt, cmd) in nclst: rmenu.add_command(label=txt, command=cmd) rmenu.tk_popup(e.x_root+40, e.y_root+10,entry="0") except TclError: print ' - rClick menu, something wrong' pass return "break" def rClickbinder(r): try: for b in [ 'Text', 'Entry', 'Listbox', 'Label']: # r.bind_class(b, sequence='<Button-3>', func=rClicker, add='') except TclError: print ' - rClickbinder, something wrong' pass if __name__ == '__main__': master = Tk() ent = Entry(master, width=50) ent.pack(anchor="w") #bind context menu to a specific element ent.bind('<Button-3>',rClicker, add='') #or bind it to any Text/Entry/Listbox/Label element #rClickbinder(master) master.mainloop()
多亏了Gonzo的代码和蓝色的'<Control-c>',我的textwidget右键工作了。 我没有50个声誉,但我有一个问题,我面临的是,右键将触发功能,而不管点击点的位置。 通过以下方式得出结论:
'<Control-c>',
def show_menu(self, e): if e.widget==self.text: self.tk.call("tk_popup", self.menu, e.x_root, e.y_root)
现在,当你点击文本小部件时,只会触发右按钮的弹出窗口。
我想我会分享我的解决方案,基于stackoverflow上的几个代码片段。它包括测试的最低应用程序:
编辑:类绑定可能无法工作。如果是这种情况,请使用普通绑定并在select_all函数中返回“break”。
import Tkinter as tk if 1: # nice widgets import ttk else: ttk = tk class EntryPlus(ttk.Entry): def __init__(self, *args, **kwargs): ttk.Entry.__init__(self, *args, **kwargs) _rc_menu_install(self) # overwrite default class binding so we don't need to return "break" self.bind_class("Entry", "<Control-a>", self.event_select_all) self.bind("<Button-3><ButtonRelease-3>", self.show_menu) def event_select_all(self, *args): self.focus_force() self.selection_range(0, tk.END) def show_menu(self, e): self.tk.call("tk_popup", self.menu, e.x_root, e.y_root) class TextPlus(tk.Text): def __init__(self, *args, **kwargs): tk.Text.__init__(self, *args, **kwargs) _rc_menu_install(self) # overwrite default class binding so we don't need to return "break" self.bind_class("Text", "<Control-a>", self.event_select_all) self.bind("<Button-3><ButtonRelease-3>", self.show_menu) def event_select_all(self, *args): self.focus_force() self.tag_add("sel","1.0","end") def show_menu(self, e): self.tk.call("tk_popup", self.menu, e.x_root, e.y_root) def _rc_menu_install(w): w.menu = tk.Menu(w, tearoff=0) w.menu.add_command(label="Cut") w.menu.add_command(label="Copy") w.menu.add_command(label="Paste") w.menu.add_separator() w.menu.add_command(label="Select all") w.menu.entryconfigure("Cut", command=lambda: w.focus_force() or w.event_generate("<<Cut>>")) w.menu.entryconfigure("Copy", command=lambda: w.focus_force() or w.event_generate("<<Copy>>")) w.menu.entryconfigure("Paste", command=lambda: w.focus_force() or w.event_generate("<<Paste>>")) w.menu.entryconfigure("Select all", command=w.event_select_all) if __name__ == "__main__": class SampleApp(tk.Tk): def __init__(self, *args, **kwargs): tk.Tk.__init__(self, *args, **kwargs) self.entry = EntryPlus(self) self.text = TextPlus(self) self.entry.pack() self.text.pack() self.entry.insert(0, "copy paste") self.text.insert(tk.INSERT, "copy paste") app = SampleApp() app.mainloop()
我找到了办法,多亏了this post。我做了一些修改。在底部有一个最小的
main
来尝试它。多亏了Gonzo的代码和蓝色的
'<Control-c>',
我的textwidget右键工作了。 我没有50个声誉,但我有一个问题,我面临的是,右键将触发功能,而不管点击点的位置。 通过以下方式得出结论:现在,当你点击文本小部件时,只会触发右按钮的弹出窗口。
我想我会分享我的解决方案,基于stackoverflow上的几个代码片段。它包括测试的最低应用程序:
编辑:类绑定可能无法工作。如果是这种情况,请使用普通绑定并在select_all函数中返回“break”。
相关问题 更多 >
编程相关推荐