15

私は初めての Python プログラムに取り組んでいますが、自分が何をしているのかほとんどわかりません。ctrl-a (コントロール a) を再バインドして、Text ウィジェット内のすべてのテキストを選択したいと考えています。現在のバインディングは ctrl-/ (コントロール /) です。バインディング部分は関数に直接ジャンプしますが、実際のテキスト選択は機能しません。代わりに、カーソルは最初の行の最初の文字にジャンプし (そうあるべきです)、他には何も起こりません。これは非常に簡単に修正できると確信していますが、何時間も費やした後、何が問題なのかわかりません。

Python 3、Windows:

from tkinter import *

# Select all the text in textbox (not working)
def select_all(event):
    textbox.tag_add(SEL, "1.0", END)
    textbox.mark_set(INSERT, "1.0")
    textbox.see(INSERT)

# Open a window
mainwin = Tk()

# Create a text widget
textbox = Text(mainwin, width=40, height=10)
textbox.pack()

# Add some text
textbox.insert(INSERT, "Select some text then right click in this window")

# Add the binding
textbox.bind("<Control-Key-a>", select_all)

# Start the program
mainwin.mainloop()
4

3 に答える 3

16

したがって、新しいコードは...

from tkinter import *

# Select all the text in textbox
def select_all(event):
    textbox.tag_add(SEL, "1.0", END)
    textbox.mark_set(INSERT, "1.0")
    textbox.see(INSERT)
    return 'break'

# Open a window
mainwin = Tk()

# Create a text widget
textbox = Text(mainwin, width=40, height=10)
textbox.pack()

# Add some text
textbox.insert(INSERT, "Select some text then right click in this window")

# Add the binding
textbox.bind("<Control-Key-a>", select_all)
textbox.bind("<Control-Key-A>", select_all) # just in case caps lock is on

# Start the program
mainwin.mainloop()

はい、それは完璧に機能します。ブライアン・オークリー、ありがとうございました。Steven Rumbalski:それは非常に良い点です。私もあなたのアドバイスに従いました。

于 2012-12-10T20:11:18.337 に答える
15

関数が文字列「break」を返すようにすることで、選択を行い、デフォルトのアクションを禁止する必要があります。

これは、Tkinter がイベントを処理する方法によるものです。「バインドタグ」と呼ばれるものを使用します。ウィジェットにバインドしているように見えますが、実際にはウィジェットの名前であるタグにバインドしています。ウィジェット クラス、ウィジェットが含まれるトップレベル ウィンドウ、およびタグ「all」へのバインディングも存在する可能性があります (さらに、必要に応じて独自のタグを作成することもできます)。

これらのタグのデフォルトの順序は、最も具体的なものから最も具体的でないものの順であり、イベントはその順序で処理されます。つまり、ウィジェット (最も限定的) とクラス (限定的でない) の両方にバインディングがある場合、バインディングは最初にウィジェットに対して起動し、次にクラス バインディング (次にトップレベル、次に「すべて」) に対して起動します。 」)。

これが意味することは、デフォルトでは、ウィジェットのバインディングはデフォルトのバインディングを置き換えるのでなく、拡張するということです。幸いなことに、文字列「break」を返すだけで、それ以降のバインディングの起動を禁止できます。これにより、バインディングのチェーンがそれ以上動作しなくなります。

于 2012-12-10T15:20:32.917 に答える
1

pyautogui これは、イベントを追加したい場所でコマンドを実行するだけという名前のモジュールで行うことができます。

import pyautogui
..., command=lambda *awargs:pyautogui.hotkey("ctrl","a")

モジュールを必ずインストールしてください。Windowsを使用している場合は、次の方法でインストールします

pip install pyautogui
于 2019-03-15T15:03:38.290 に答える