2013-06-08 17 views
14

Jestem początkującym użytkownikiem języka Python, działającym na MacOS.Jak powiązać klawisz Enter z funkcją w urządzeniu Tkinter?

Robię program z GUI parsera tekst w Tkinter, gdzie możesz wpisać jakąś komendę w Entry widget i uderzył Button widżet, który wyzwala moje parse() FUNCT, ect, drukowanie wyników do Text widget, styl tekstu przygodowego.

> Circumvent the button

I can't let you do that, Dave.

Staram się znaleźć sposób, aby pozbyć się potrzeby ciągnąć myszy nad do Button każdym razem, gdy użytkownik wyda polecenie, ale okazało się trudniejsze, niż myślałem.

Zgaduję, że poprawny kod wygląda na self.bind('<Return>', self.parse())? Ale nie wiem nawet, gdzie to umieścić. root, __init__, parse() i create_widgets() nie chcę tego.

Żeby było jasne, to jedyny powód każdy powinien uderzyć wprowadzić w prog jest zainicjowanie parse(), więc nie musi być forsowane do widgetu Entry specjalnie. Gdziekolwiek działa, jest w porządku.

W odpowiedzi na 7stud, podstawowy format:

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

Odpowiedz

24

Spróbuj uruchomić następujący program. Musisz tylko mieć pewność, że twoje okno jest skupione po naciśnięciu przycisku Return - aby to zrobić, najpierw kliknij przycisk kilka razy, aż zobaczysz jakieś wyjście, a następnie bez klikania nigdzie indziej naciśnij 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() 

Wtedy po prostu trzeba podkręcić trochę rzeczy przy podejmowaniu zarówno wywołanie button click i hitting Return tę samą funkcję - ponieważ funkcja poleceń musi być funkcja, która nie przyjmuje żadnych argumentów, natomiast funkcja wiążą musi być funkcja, która pobiera jeden argument (obiekt event):

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

Albo można po prostu zrezygnować z użyciem polecenia argument przycisku i zamiast używać bind() służy do podłączania funkcji onclick przycisku, co oznacza, że ​​funkcja musi weź jeden argument - podobnie jak w 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() 

Oto ona w otoczeniu klasy:

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

Otrzymuję NameError: self nie jest zdefiniowany, używając 'def pars (self, event): ...' i 'root.bind ('', self.parse)', tymczasem mój przycisk 'command = self.parse' nadal działa dobrze ... – Ghosty

+0

@Ghosty, dodałem dwa kolejne przykłady. – 7stud

+0

Oczywiście używasz klas w swoim programie, więc jeśli umieścisz tylko podstawową strukturę swoich zajęć (mogą być puste), mogę zmodyfikować przykład, abyś pracował w ustawieniu klasy. – 7stud

5

Inną alternatywą jest użycie lambda:

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

Pełny kod:

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

Jak widać , utworzenie funkcji lambda z nieużywaną zmienną "event" rozwiązuje problem.

+0

Twój kod używa zewnętrznego obrazu 'Iconshock-Folder-Gallery.ico', co prawdopodobnie spowodowałoby błąd dla każdego, kto go uruchomił. –

Powiązane problemy