Как привязать действие одной клавиши к кнопкам в разных окнах? - PullRequest
0 голосов
/ 08 марта 2019

Я много искал и до сих пор не знаю, в чем проблема. У меня есть два окна, запрашивающие некоторые значения, и в результате выполняются разные функции. Я пытался привязать клавишу «Ввод» к кнопкам разных окон (поэтому должны выполняться разные функции), но это не работает.

Единственное, что я мог сделать, это связать ключ со всем фреймом, затем отсоединить его и связать еще раз. Это работает, но мне любопытно, почему я не могу связать клавишу «Ввод» с отдельными кнопками, пока не появляется ошибка. Заранее спасибо!

Вот мой код:

import tkinter as tk              

class Page(tk.Tk):

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        self.shared_data = {
            "number_of_frequencies": tk.StringVar(),
            "frequencies": []}

        container = tk.Frame(self)
        container.grid()
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}
        for F in (StartPage, PageOne):
            frame = F(container, self)
            self.frames[F] = frame

            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame(StartPage)

    def create_entry_widget(self, i):
        self.number = tk.StringVar()
        self.number.set('')
        self.shared_data["frequencies"].append(self.number)
        new_widget = tk.Entry(self.master, textvariable=self.number)
        return new_widget

    def show_frame(self, c):
        for frame in self.frames.values():
            frame.grid_remove()
        frame = self.frames[c]
        frame.grid()
        global number_of_frequencies
        try:
            number_of_frequencies = int(self.shared_data["number_of_frequencies"].get())
            for i in range(number_of_frequencies):
                tk.Label(self.master, text="Frequency "+str(i+1)).grid(row=i, column=0, padx=10, pady=5)
                self.entry_widgets = self.create_entry_widget(i)
                self.entry_widgets.grid(row=i, column=1, padx=10, pady=5)

            page1 = self.get_page(PageOne)

            tk.Button(self, text="Exit",
                      command=lambda: self.quitALL()).grid(row=i+1, column=0, padx=10, pady=10)

            self.button1 = tk.Button(self, text = "     Done     ", 
                      command=lambda: [page1.enter_freqs(), self.quitALL()])

            self.unbind_all('<Return>') # work
            self.bind('<Return>', (lambda a: [page1.enter_freqs(), self.quitALL()])) # work

#            self.button1.bind('<Return>', (lambda a: [page1.enter_freqs(), self.quitALL()])) #doesn't work

            self.button1.grid(row=i+1, column=1, padx=10, pady=10)

            frame.tkraise()
        except:
            frame.tkraise()

    def get_page(self, page_class):
        return self.frames[page_class]

    def quitALL(self):
        self.destroy()


class StartPage(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller=controller

        self.text = tk.Text(self, bg='gray93', bd=0, height=1, width=30, font=('Helvetica', 14))
        self.text.insert(tk.INSERT, "Please enter number of frequencies:")
        self.text.grid(padx=10, pady=10)

        entry = tk.Entry(self, textvariable=self.controller.shared_data["number_of_frequencies"])
        entry.grid(padx=10)

        self.controller.bind('<Return>', (lambda a: controller.show_frame(PageOne))) # work

        self.button = tk.Button(self, text="     Done     ",
                            command=lambda: controller.show_frame(PageOne))
#        self.button.bind('<Return>', (lambda a: controller.show_frame(PageOne))) # doesn't work

        self.button.grid(padx=10, pady=10) 


class PageOne(tk.Frame): 
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller=controller
        self.freq_list = self.controller.shared_data["frequencies"]
        self.freq_list_int = []

    def enter_freqs(self):
        for freq in self.freq_list:
            self.freq_list_int.append(int(freq.get()))
        self.func(self.freq_list_int)

    def func(self, freq_list):
        print('some stuff')


if __name__ == "__main__":
    app = Page()
    app.mainloop()
...