0

我正在玩 Python Tkinter,而事件绑定在我的脚本中不起作用。这是我的脚本:

import tkinter as tk
from tkinter import ttk

def quit():
    exit(0)

class ChartApp(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        container = tk.Frame(self)
        container.pack(side='top', fill='both', expand=True)

        menubar = tk.Menu(container)
        filemenu = tk.Menu(menubar, tearoff=0)
        filemenu.add_command(label="Exit", command=quit)
        menubar.add_cascade(label="File", menu=filemenu)
        tk.Tk.config(self, menu=menubar)

        self.frames = {}
        # This is not an error to have 2 StartPage. I am planning to implement multiple pages afterwards
        for F in (StartPage, StartPage):
            frame = F(container, self)

            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky='nsew')

        self.show_frame(StartPage)

    def show_frame(self, cont):
        frame = self.frames[cont]
        frame.tkraise()

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

        def printsomething(msg):
            print(msg + " is selected!")

        pg1_button = ttk.Button(self, text="Page 1", command=lambda: printsomething("Page 1"))
        pg1_button.grid(row=1, column=0, pady=10, padx=10, sticky='e')

        pg2_button = ttk.Button(self, text="Page 2", command=lambda: printsomething("Page 2"))
        pg2_button.grid(row=1, column=1, pady=10, padx=10, sticky='w')

        self.bind("a", lambda event: self.focus_set())
        self.bind("a", printsomething("Page 1"))

app = ChartApp()
app.mainloop()

我想按下键盘上的按钮“a”,就好像我点击pg1_buttion执行该printsomething功能一样。但是,它不起作用。此外,一旦我运行我的脚本,我就会自动获得以下输出。

Output:
Page 1 is selected!
Page 1 is selected!

我确定自动输出与这两行有关,但我不知道为什么

self.bind("a", lambda event: self.focus_set())
self.bind("a", printsomething("Page 1"))

另一个问题,我有一个菜单栏文件-> 退出。我想按下按钮“f”然后“e”退出GUI。我在“filemenu.add_command”中尝试了加速器选项,但它不起作用。那么接下来我可以尝试什么?谢谢!

4

1 回答 1

0

显然显示的框架没有焦点。我尝试添加focus_set到该show_frame()方法中,这似乎有效。

def show_frame(self, cont):
    frame = self.frames[cont]
    frame.tkraise()
    frame.focus_set()

但也许您应该将事件绑定到根窗口。

此外,您似乎正在尝试将键“a”绑定到多个回调。你可以这样做,但它有点复杂:

self.bind("a", first_callback)
self.bind("a", second_callback, "+")   # Add callback

最后的“+”使 bind 明白它不应该替换 first_callback 而是添加 second_callback。

于 2020-05-14T21:46:48.083 回答