7

Tkinterに、すべてのキーボードレイアウトで機能するキーの組み合わせをバインドする方法はありますか?(スキャンコードでバインド)

たとえば、次のようなすべてのレイアウトで、キーボードの左下隅にある同じ'Control-Z'物理キーで機能するバインディングが必要です。     *ロシア語のレイアウト、     *ギリシャ語のレイアウトなど。

これが私が試したことです:

from Tkinter import *
root=Tk()
def f(event):
    print 'undo'
button1=Button(root, text=u'Button')
button1.pack()
button1.bind('<Control-z>', f)
root.mainloop()

ロシア語とギリシャ語のキーボードレイアウトでは機能しません。

アップデート-2:

私はWindowsでさらにいくつかの実験を行いましたが、今では一般的なルールは次のようになっています。

    1)言語がラテン文字セットに基づいている場合、キーは「値によって」(ドイツ語フランス語Dvorak)マップされるため、同じアクションが異なる物理キーにマップされます。
    2)そうでない場合(たとえば、 ロシア語ギリシャ語)、すべての主要なアクセラレータは「位置ごとに」マッピングされます(通常、同じキーにマークされている対応する英語の文字と一致します)。

2番目のケースのみに特別な注意が必要です。これがすでにいくつかのライブラリに実装されている場合、何かアイデアはありますか?

アップデート-3

ロシア語のキーボードやロシア語のWindowsがなくても簡単に再現できます。

1)[スタート]->[コントロールパネル]->[地域と言語のオプション]
2)[言語]-> [詳細]
3)ロシア語を追加します。

それでおしまい。これで、Alt-Shiftがロシア語に切り替わり、次の面白い記号を入力できるようになります。

ロシアのキーボード

別のAlt-Shiftを押すと元に戻ります。

ウィキペディアがロシア語の表音レイアウトについて言っていることを忘れてください。最近は使われていません。少なくともロシア国内。

すべてのWindowsアプリケーション(wxPythonアプリケーションを含む)はCtrl-я、元に戻す、Ctrl-ч切り取り、Ctrl-сコピーなどに使用します。

4

5 に答える 5

1

私が主に興味を持っているのは、Windows のロシア語のレイアウトです。

私が現在使用している迅速で汚い回避策は次のとおりです。

import Tkinter

def copy(event):
    print 'Ctrl-C'

root = Tkinter.Tk()
root.bind('<Control-ntilde>', copy)
root.mainloop()

これにより、他の言語で <Ctrl +実際のntilde>と競合する可能性があります。

どのレイアウトが現在アクティブであるかを判断できれば克服できる可能性があるため、2 番目の質問: Tkinter はキーボード レイアウトを決定します。

もう 1 つの欠点は、修飾キーの「ユニバーサル」な処理により、Ctrl-Alt-V を押したときにも起動することですが、それは英語のレイアウトにも当てはまるため、別の話です。

于 2013-01-23T08:04:34.070 に答える
1

これには、部分的でかなり醜い解決策があります。Ctrl以下のコードでは、テキスト ウィジェットを含むウィンドウがあり、標準+Cキーボード イベントとそれらの適切な処理の間に「インボックス」接続があります。ただし、単にキーボード レイアウトをロシア語などに変更すると、これらの機能が機能しなくなります。この問題を解決するために、これらのイベントの実装を書き直したところ、すべてが正常に機能するようになりました。しかし、私はそのような解決策に少し不満を感じています。誰もがより良いアイデアを持っていますか?..たとえば、python tkinter で「通常の」キーを押す (または模倣する) 方法はありますか?

import tkinter

root = tkinter.Tk()

class MyWind (tkinter.Frame):
    def __init__(self, parent):
        tkinter.Frame.__init__(self, parent)
        self.create_UI()

    def create_UI(self):
        text_field = tkinter.Text(self)
        text_field.insert(tkinter.END, "Hello world")
        text_field.pack()

def print_event(event):
    print ("Event character code <char>: '%s'" % event.char)
    print ("   Event key symbol <keysym>: '%s'" % event.keysym)
    print ("   Event key code <keycode>: '%s'" % event.keycode)

def work_out_event(event): # Here is the solution
    widget_type = type(event.widget)
    if widget_type == tkinter.Text:
        content = event.widget.selection_get()
        print ("Selected content = '%s'" % content)
        root.clipboard_clear() 
        root.clipboard_append(content)

def lurker1(event):
    print ("Crtl + C (english) pressed!")       
    print_event(event)

def lurker2(event):
    print ("Crtl + C (russian) pressed!")
    print_event(event)
    work_out_event(event)        

root.bind("<Control-c>", lurker1)      # "C" character with the english keyboard layout
root.bind("<Control-ntilde>", lurker2) # "C" character with the russian keyboard layout

root.app = MyWind(root)
root.app.pack()
root.mainloop()
于 2014-08-20T19:06:00.457 に答える
0

古い 1999 年に既に提案されている別のオプションは、Tkinter から wxPython に切り替えることです。そこでは、すべてのタイプのキーボード レイアウトに対してアクセラレータの処理が自動的に行われます (たとえば、エディタの例はこちら: http://wiki.wxpython.org/AnotherTutorial )。

于 2013-01-23T09:16:08.907 に答える
0
def copy(event):
    print 'Ctrl-C'
    master.clipboard_append('text')

そしてそれは動作します!

于 2014-12-06T11:04:39.607 に答える