我有一个由多个框架组成的Tkinter GUI。
在第1帧中,有3个条目和1个按钮。这些条目将字符串值设置为某些变量,并且该按钮使第2帧出现。 在第2帧中有1个标签和1个按钮。该按钮将关闭程序。
在第2帧中,我有2种绑定方法。我需要在按下Mouse-Button-1(左键单击)时启动一个功能,而在按下Escape键时启动另一个功能。
问题在于,如果我填写了条目(在第1帧中),则按Escape键不起作用,而在第2帧中则使用了Mouse-Button-1。如果我不填写条目,则一切正常。
我知道这是关注的问题。当我填充条目时,它们会获得焦点,但是如果我不填充它们,则当第2帧出现时,它将获得焦点,并且Escape键可以正常工作。
第2帧中的 self.focus_set()
方法使Mouse-Button-1起作用:实际上,如果我不使用此方法,即使此键绑定也不起作用。
这是我的代码:
from tkinter import *
def keyf1(Event):
print("function 1")
def keyf2(Event):
print("function 2")
def start(Event):
global nometopo
global classetopo
global sessione
nometopo = entry_nome.get()
classetopo = entry_classe.get()
sessione = entry_sessione.get()
entry_nome.delete(0, 'end')
entry_classe.delete(0, 'end')
entry_sessione.delete(0, 'end')
class EPMouse(Tk):
def __init__(self, *args, **kwargs):
Tk.__init__(self, *args, **kwargs)
container = Frame(self)
container.pack(side="top", fill="both", expand = True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
for F in (Frame_1, Frame_2):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame(Frame_1)
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
class Frame_1(Frame):
def __init__(self, parent, controller):
Frame.__init__(self, parent)
global entry_nome
global entry_classe
global entry_sessione
label_nome=Label(self,text="Nome soggetto: ").grid(row=2, column=0, sticky=E)
label_classe=Label(self,text="Classificato come: ").grid(row=3, column=0, sticky=E)
label_sessione=Label(self,text="Sessione: ").grid(row=5, column=0, sticky=E)
entry_nome = Entry(self)
entry_nome.grid(row=2,column=1)
entry_classe = Entry(self)
entry_classe.grid(row=3,column=1)
entry_sessione = Entry(self)
entry_sessione.grid(row=5,column=1)
button_start = Button(self, text="START!", command=lambda: [start(Event), controller.show_frame(Frame_2)]).grid(row=6, column=1, sticky=EW)
class Frame_2(Frame):
def __init__(self, parent, controller):
Frame.__init__(self, parent)
global label
label_header = Label(self, text="Click sx = F1 \n Esc = F2").pack()
button_stop = Button(self, text="STOP", command=lambda: app.destroy()).pack()
self.bind("<Button-1>", keyf1)
self.bind("<Escape>", keyf2)
self.focus_set()
app = EPMouse()
app.mainloop()
也许我需要把重点放在第1帧的条目中,但是我不知道如何。
答案 0 :(得分:0)
解决问题的方法非常简单。抬高第2帧即可。
在这里,我可以看到您正在使用此功能切换帧,所以为什么不再添加一行来解决焦点问题。
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
frame.focus_set()
看到就是这么简单。