Python Tkinter GUI将“返回”绑定到函数

时间:2017-07-20 15:44:55

标签: python user-interface tkinter bind

我无法弄清楚如何将'Enter'键与函数或更具体的按钮绑定。我想将'Enter'键与self.search函数绑定。我有下面的代码,我尝试了很多不同的方法。现在它只是清除输入框。任何帮助将不胜感激。

class MainGUI:
def __init__(self, master):
    self.master = master
    master.minsize(width=500, height=175)
    master.title("Serial Number Decode")

    self.label = Label(master, text="Serial Number Decoder")
    self.label.pack()
    self.textBox=Text(master, height=1, width=30)
    self.textBox.place(relx=0.5, rely=0.1, anchor='n')
    self.textBox2=Text(master, height=2, width=50,font=("Sans",12))

    self.textBox2.place(relx=0.5, rely=0.5, anchor='s')
    self.search_button = Button(master, text="Search", command=self.search)
    self.search_button.place(relx=0.75, rely=0.15, anchor='w')

    #self.search_button.bind('<Return>', self.search)

    self.master.bind('<Return>', self.search) #Just clears the entry box

    self.multiLook_button = Button(master, text="MultiLook", command=self.multiLook)
    self.multiLook_button.place(relx=0.7, rely=0.6, anchor='w')

    self.multiSearch_button = Button(master, text="MultiSearch", command=self.multiSearch)
    self.multiSearch_button.place(relx=0.84, rely=0.6, anchor='w')

    self.close_button = Button(master, text="Close", command=master.quit)
    self.close_button.place(relx=0.85, rely=0.15, anchor='w')

1 个答案:

答案 0 :(得分:3)

假设您在班级中定义了search,那么您就走上正轨:

class MainGUI():

    def __init__(self, master):
        # ... Code ...


    def search(self, event):
        # ... Code ...

您可以按原样访问该方法:

self.search_button.bind('<Return>', self.search)

使用此方法,search_button窗口小部件必须具有焦点,以便在按下Enter时触发事件绑定。

此外,我将建议一种不同的方式来构建您的应用程序,这将有助于为您的代码添加可读性,并允许更容易的扩展,例如,如果您希望将来添加到应用程序。在开发GUI时,最好采用有条理的方法,即系统化或逐步 - 模块化可以帮助解决这个问题。

import tkinter as tk

class MainGUI(tk.Frame):

    def __init__(self, master=None):

        tk.Frame.__init__(self, master)

        self.master.minsize(width=500, height=175)
        self.master.title("Serial Number Decode")

        self.main_label()
        self.text_boxes()
        self.buttons()


    def main_label(self):
        self.label = tk.Label(self, text='Serial Number Decoder')
        self.label.pack()


    def text_boxes(self):
        # First we create the widgets
        self.textBox = tk.Text(self, height=1, width=30)
        self.textBox2 = tk.Text(self, height=2, width=50, font=("Sans",12))

        # Next place them within the GUI
        self.textBox.place(relx=0.5, rely=0.1, anchor='n')
        self.textBox2.place(relx=0.5, rely=0.5, anchor='s')


    def buttons(self):
        self.search_button = tk.Button(self, text="Search", command=self.search)

        # You can set a widget to have the 'focus' like so:
        self.search_button.focus()

        # And bind an event on focus in, focus out, enter, shift, etc. - e.g.:
        self.search_button.bind('<FocusIn>', self.do_something)
        self.search_button.bind('<FocusOut>', self.do_something_else)
        self.search_button.bind('<Return>', self.search)

        # Other buttons below...


    def search(self, event=None):
        # Do something now that the event has been triggered

有几点需要注意 - def search(self, event=None),我在这里给事件关键字参数设置了默认值None,因为如果单击按钮(来自设置command=self.search),则会发生'事件' '将传递给方法,但是如果从绑定触发方法,则会传递'event'。另外,我在代码示例中并不是很透彻,我编写了一些代码,并对其进行了结构化,纯粹是为了示例,例如,我没有在GUI中注册搜索按钮,因此它不会显示,或者self.do_something未定义,因此运行此操作实际上会引发AttributeError。我希望这一切都有帮助!最后,这是tkinter的一个很好的资源,NMT Tkinter