2013-06-08 30 views
14

Tôi là người bắt đầu tự học Python, chạy trên hệ điều hành MacOS.Làm cách nào để gắn khóa nhập vào một hàm trong tkinter?

Tôi đang thực hiện một chương trình với một giao diện phân tích cú pháp văn bản trong Tkinter, nơi bạn gõ một lệnh trong một widget Entry, và nhấn một widget Button, mà gây nên parse() funct của tôi, vv, in kết quả cho một widget Text, phong cách phiêu lưu văn bản.

> Circumvent the button

I can't let you do that, Dave.

Tôi đang cố gắng để tìm một cách để thoát khỏi sự cần thiết để chuyên chở chuột lên đến Button mỗi khi người dùng đưa ra một lệnh, nhưng điều này hóa ra khó hơn tôi nghĩ.

Tôi đoán mã chính xác trông giống như self.bind('<Return>', self.parse())? Nhưng tôi thậm chí không biết đặt nó ở đâu. root, __init__, parse()create_widgets() không muốn.

Để rõ ràng, lý do duy nhất mà mọi người nên nhấn enter trong prog là kích hoạt parse(), do đó, nó không cần phải được tán thành tiện ích Entry cụ thể. Bất cứ nơi nào nó hoạt động là tốt.

Để đối phó với 7stud, định dạng cơ bản:

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

Trả lời

24

Thử chạy chương trình sau đây. Bạn chỉ cần chắc chắn rằng cửa sổ của bạn có tiêu điểm khi bạn nhấn Return - để đảm bảo nó hoạt động, trước tiên hãy nhấp vào nút một vài lần cho đến khi bạn thấy một số đầu ra, sau đó không nhấp vào bất kỳ nơi nào khác nhấn 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() 

Sau đó, bạn chỉ cần điều chỉnh một chút khi thực hiện cả hai cuộc gọi button clickhitting Return chức năng tương tự - vì chức năng lệnh cần phải được một hàm không có đối số, trong khi chức năng ràng buộc cần phải có hàm mang theo một đối số (đối tượng sự kiện):

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

Hoặc, bạn chỉ có thể từ bỏ sử dụng đối số lệnh của nút và thay vào đó sử dụng bind() để đính kèm các chức năng onclick nút, có nghĩa là chức năng cần lấy một đối số - giống như với Trả lại:

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

Dưới đây là trong một khung cảnh lớp:

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

Tôi nhận được một NameError: tự không được định nghĩa, sử dụng 'phân tích cú pháp (tự, sự kiện): ...' và 'root.bind ('', self.parse)', trong khi đó nút lệnh 'của tôi = self.parse' vẫn hoạt động tốt ... – Ghosty

+0

@Ghosty, tôi đã thêm hai ví dụ khác. – 7stud

+0

Bạn rõ ràng đang sử dụng các lớp trong chương trình của bạn, vì vậy nếu bạn chỉ đăng cấu trúc cơ bản của các lớp của bạn (chúng có thể trống), tôi có thể sửa đổi ví dụ để bạn làm việc trong một thiết lập lớp. – 7stud

5

Một lựa chọn khác là sử dụng một lambda:

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

Full mã:

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

Như bạn có thể nhìn thấy , tạo ra một hàm lambda với biến "event" không được sử dụng giải quyết vấn đề.

+0

Mã của bạn sử dụng hình ảnh bên ngoài 'Iconshock-Folder-Gallery.ico', điều này có thể dẫn đến lỗi cho bất kỳ ai đang chạy nó. –

Các vấn đề liên quan