Как привязать клавишу ввода к функции в tkinter?

Я начинающий Python, работающий на MacOS.

Я делаю программу с графическим интерфейсом синтаксического анализатора текста в tkinter, где вы набираете команду в виджете Entry и нажимаете на виджет Button, который запускает функцию parse(), ect, вывод результатов в виджет Text, text- стиль приключений.

> Обойти кнопку

Я не могу позволить тебе сделать это, Дейв.

Я пытаюсь найти способ избавиться от необходимости перетаскивать мышь на Button каждый раз, когда пользователь вводит команду, но это оказалось сложнее, чем я думал.

Я предполагаю, что правильный код выглядит как self.bind('<Return>', self.parse())? Но я даже не знаю, где это поставить. root, __init__, parse() и create_widgets() этого не хотят.

Для ясности, единственная причина, по которой кто-то должен нажать Enter в проге, - это запуск parse(), поэтому его не нужно специально привязывать к виджету Entry. Везде, где это работает, хорошо.

В ответ на 7студ, основной формат:

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()

Ответ 1

Попробуйте запустить следующую программу. Вы просто должны быть уверены, что ваше окно сосредоточено, когда вы нажмете 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 одной и той же функции, потому что функция команды должна быть функцией, которая не принимает аргументов, тогда как функция связывания должна быть функция, которая принимает один аргумент (объект события):

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:

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()

Ответ 2

Другая альтернатива - использовать лямбду:

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" решает проблему.

Ответ 3

так что вы могли бы связать это так, но как бы вы связали его после этого, например, если бы я хотел, чтобы он перешел на новый экран.

Ответ 4

Отличный ответ дорогой Seçkin Savaşçı