web-dev-qa-db-ja.com

Enterキーをtkinterの関数にバインドするにはどうすればよいですか?

私はPython自己学習を開始し、MacOSで実行しています。

私はtkinterでテキストパーサーGUIを使用してプログラムを作成しています。ここでは、Entryウィジェットにコマンドを入力し、Buttonウィジェットを押すと、parse()がトリガーされます。 funct、ect、結果をTextウィジェット、テキストアドベンチャースタイルに出力します。

>ボタンを回避する

そんなことさせてくれない、デイブ。

ユーザーがコマンドを発行するたびにマウスをButtonに引っ​​張る必要をなくす方法を見つけようとしていますが、これは思ったより難しいことがわかりました。

正しいコードはself.bind('<Return>', self.parse())のように見えると思いますか?しかし、私はそれをどこに置くべきかさえ知りません。 root、___init___、parse()、およびcreate_widgets()は必要ありません。

明確にするために、progでenterを押す必要がある唯一の理由は、parse()をトリガーすることであるため、Entryウィジェットに特別に支持される必要はありません。動作する場所ならどこでも構いません。

7studに対する基本フォーマットは次のとおりです。

_from tkinter import *
import tkinter.font, random, re

class Application(Frame):

    def __init__(self, master):
        Frame.__init__(self, master, ...)
        self.grid()
        self.create_widgets()
        self.start()


    def parse(self):
        ...


    def create_widgets(self):

        ...

        self.submit = Button(self, text= "Submit Command.", command= self.parse, ...)
        self.submit.grid(...)


root = Tk()
root.bind('<Return>', self.parse)

app = Application(root)

root.mainloop()
_
31
Ghosty

次のプログラムを実行してみてください。 Returnキーを押したときにウィンドウにフォーカスがあることを確認する必要があります。これを確認するには、最初に出力が表示されるまでボタンを数回クリックし、他の場所をクリックせずにReturnキーを押します。

import tkinter as tk

root = tk.Tk()
root.geometry("300x200")

def func(event):
    print("You hit return.")
root.bind('<Return>', func)

def onclick():
    print("You clicked the button")

button = tk.Button(root, text="click me", command=onclick)
button.pack()

root.mainloop()

次に、両方のbutton clickおよびhitting Return同じ関数を呼び出します。コマンド関数は引数を取らない関数である必要がありますが、バインド関数は引数を1つ取る関数(イベントオブジェクト)である必要があるためです。

import tkinter as tk

root = tk.Tk()
root.geometry("300x200")

def func(event):
    print("You hit return.")

def onclick(event=None):
    print("You clicked the button")

root.bind('<Return>', onclick)

button = tk.Button(root, text="click me", command=onclick)
button.pack()

root.mainloop()

または、ボタンのコマンド引数を使用するのをやめて、代わりにbind()を使用してボタンにonclick関数をアタッチします。つまり、関数はReturnのように1つの引数を取る必要があります。

import tkinter as tk

root = tk.Tk()
root.geometry("300x200")

def func(event):
    print("You hit return.")

def onclick(event):
    print("You clicked the button")

root.bind('<Return>', onclick)

button = tk.Button(root, text="click me")
button.bind('<Button-1>', onclick)
button.pack()

root.mainloop()

これはクラス設定にあります:

import tkinter as tk

class Application(tk.Frame):
    def __init__(self):
        self.root = tk.Tk()
        self.root.geometry("300x200")

        tk.Frame.__init__(self, self.root)
        self.create_widgets()

    def create_widgets(self):
        self.root.bind('<Return>', self.parse)
        self.grid()

        self.submit = tk.Button(self, text="Submit")
        self.submit.bind('<Button-1>', self.parse)
        self.submit.grid()

    def parse(self, event):
        print("You clicked?")

    def start(self):
        self.root.mainloop()


Application().start()
45
7stud

別の方法は、ラムダを使用することです:

ent.bind("<Return>", (lambda event: name_of_function()))

完全なコード:

from tkinter import *
from tkinter.messagebox import showinfo

def reply(name):
    showinfo(title="Reply", message = "Hello %s!" % name)


top = Tk()
top.title("Echo")
top.iconbitmap("Iconshock-Folder-Gallery.ico")

Label(top, text="Enter your name:").pack(side=TOP)
ent = Entry(top)
ent.bind("<Return>", (lambda event: reply(ent.get())))
ent.pack(side=TOP)
btn = Button(top,text="Submit", command=(lambda: reply(ent.get())))
btn.pack(side=LEFT)

top.mainloop()

ご覧のとおり、未使用の変数「event」を使用してラムダ関数を作成すると、問題が解決します。

7