Python Tkinter 事件绑定
Python Tkinter Event Binding
我正在玩 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"))
另外一个问题,我有一个菜单栏File -> Exit。我想按按钮 "f" 然后 "e" 退出 GUI。我在 'filemenu.add_command' 中尝试了加速器选项,但它不起作用。
那么接下来我可以尝试什么?谢谢!
显然显示的框架没有焦点。我尝试将 focus_set
添加到 show_frame()
方法中,这似乎有效。
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
frame.focus_set()
但也许您应该改为将事件绑定到根 window。
此外,您似乎正试图将键 "a" 绑定到多个回调。你可以这样做,但有点复杂:
self.bind("a", first_callback)
self.bind("a", second_callback, "+") # Add callback
最后的“+”让 bind 明白它不应该替换 first_callback 而是添加 second_callback.
我正在玩 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"))
另外一个问题,我有一个菜单栏File -> Exit。我想按按钮 "f" 然后 "e" 退出 GUI。我在 'filemenu.add_command' 中尝试了加速器选项,但它不起作用。 那么接下来我可以尝试什么?谢谢!
显然显示的框架没有焦点。我尝试将 focus_set
添加到 show_frame()
方法中,这似乎有效。
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
frame.focus_set()
但也许您应该改为将事件绑定到根 window。
此外,您似乎正试图将键 "a" 绑定到多个回调。你可以这样做,但有点复杂:
self.bind("a", first_callback)
self.bind("a", second_callback, "+") # Add callback
最后的“+”让 bind 明白它不应该替换 first_callback 而是添加 second_callback.