简体   繁体   English

Python tkinter(复制/粘贴不适用于其他语言)

[英]Python tkinter (copy/paste not working with other languages)

I found out that whenever i switch the language from english to russian tkinter stops reacting to Ctrl + C , Ctrl + V or Ctrl + X .我发现每当我将语言从英语切换到俄语时,tkinter 都会停止对Ctrl + CCtrl + VCtrl + X做出反应。

It still works when i switch back to english, even if the text is in russian.当我切换回英语时它仍然有效,即使文本是俄语。

I tried all code snippets i could find on stack exchange remotely related to copy-paste topic, adding stuff similar to original code like self.bind('<Control-м>', self.paste) ("м" is the same button in russian as "v" in english), but still nothing works.我尝试了所有可以在堆栈交换中找到的与复制粘贴主题相关的远程代码片段,添加类似于原始代码的内容,如self.bind('<Control-м>', self.paste) (“м” 是同一个按钮在俄语中为“v”在英语中),但仍然没有任何效果。

Would really appreciate any help/ideas on how to fix it.非常感谢有关如何修复它的任何帮助/想法。

from Tkinter import Tk, Entry   

def _onKeyRelease(event):
    ctrl  = (event.state & 0x4) != 0
    if event.keycode==88 and  ctrl and event.keysym.lower() != "x": 
        event.widget.event_generate("<<Cut>>")

    if event.keycode==86 and  ctrl and event.keysym.lower() != "v": 
        event.widget.event_generate("<<Paste>>")

    if event.keycode==67 and  ctrl and event.keysym.lower() != "c":
        event.widget.event_generate("<<Copy>>")


master = Tk()
master.geometry("500x500+1+1")
master.bind_all("<Key>", _onKeyRelease, "+")
Entry(master).pack()
Entry(master).pack()
Entry(master).pack()
master.mainloop()

I did this.我这样做了。

1.First received the current layout language on the advice of here : 1.首先根据这里的建议接收当前布局语言:

def is_ru_lang_keyboard(self):
    u = ctypes.windll.LoadLibrary("user32.dll")
    pf = getattr(u, "GetKeyboardLayout")
    return hex(pf(0)) == '0x4190419'

2. Then I defined the keys() method taking into account the layout, because without a condition in the case of the English layout, the method gave a duplicate string when inserting: 2.然后我定义了keys()方法考虑到布局,因为在英文布局的情况下没有条件,该方法在插入时给出了重复的字符串:

    def keys(event):
        if self.is_ru_lang_keyboard():
            if event.keycode==86:
                event.widget.event_generate("<<Paste>>")
            if event.keycode==67: 
                event.widget.event_generate("<<Copy>>")    
            if event.keycode==88: 
                event.widget.event_generate("<<Cut>>")    
            if event.keycode==65535: 
                event.widget.event_generate("<<Clear>>")
            if event.keycode==65: 
                event.widget.event_generate("<<SelectAll>>")

3.Bound the keys() method of the Entry field to the "Control-KeyPress" event: 3.将Entry字段的keys()方法绑定到“Control-KeyPress”事件:

self.my_entry.bind("<Control-KeyPress>", keys)

You can use <Key> to check what keycode is used when you press Control-м and then use it to find keysym on page like Tcl/Tk - keysym .您可以使用<Key>来检查按下Control-м时使用的keycode ,然后使用它在页面上查找keysym ,例如Tcl/Tk - keysym Maybe you will have to use <Control-Cyrillic_em>也许你将不得不使用<Control-Cyrillic_em>

import tkinter as tk

def copy(event):
    print('copy')

def paste(event):
    print('paste')

def test(event):    
    print('event.char:', event.char)
    print('event.keycode:', event.keycode)
    print('event.keysym:', event.keysym)
    print('---')

root = tk.Tk()

root.bind('<Key>', test)

root.bind('<Control-c>', copy)
root.bind('<Control-v>', paste)
root.bind('<Control-Cyrillic_em>', paste)

root.mainloop()

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

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