Метод привязки Tkinter не работает из-за фокуса в записи в предыдущем кадре - PullRequest
1 голос
/ 27 апреля 2019

У меня Tkinter GUI из нескольких кадров.

В кадре 1 есть 3 записи и 1 кнопка. Записи устанавливают строковые значения для некоторых переменных, и кнопка отображает кадр 2. В кадре 2 есть 1 метка и 1 кнопка. Кнопка закрывает программу.

В кадре 2 у меня есть 2 метода привязки. Мне нужно запустить функцию, когда нажата кнопка мыши-1 (левый клик), и еще одна, когда нажата Escape.

Проблема в том, что, если я заполняю записи (в кадре 1), нажатие клавиши Escape не работает, а при нажатии кнопки мыши (1) (в кадре 2). Если я не заполняю записи, все работает нормально.

Я знаю, что это проблема фокуса. Когда я заполняю записи, они получают фокус, но если я не заполняю их, когда появляется кадр 2, он получает фокус, и клавиша Escape работает нормально.

self.focus_set() метод в кадре 2 - это то, что заставляет 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, но я не знаю, как.

1 Ответ

0 голосов
/ 27 апреля 2019

Решение вашей проблемы очень простое. Просто поместите рамку 2 в фокус при поднятии.

Здесь я вижу, что вы используете эту функцию для переключения кадров, так почему бы не добавить еще одну строку для решения проблем с фокусировкой.

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

Видите, это было так просто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...