Активное окно Enter в Tkinter

ЗИЛ

Новичок
Пользователь
Янв 3, 2022
43
1
8
Python:
from tkinter import *

root = Tk()
current_entry = None

def on_focus(evt):
    global current_entry
    current_entry = evt.widget
    #вот здесь нельзя и получить строку из активного окна? current_entry.get() тут применить невозможно
    #мы не знаем заранее какое окно выберет пользователь


def on_click():
    if current_entry==e1: #код в этом блоке примерный/демонстрационный
        e1.insert('insert', 'Hello!')
    elif current_entry == e2:
        e2.insert('insert', 'Hello!')
    elif current_entry == e3:
        e2.insert('insert', 'Hello!')
    elif current_entry == e4:
        e2.insert('insert', 'Hello!')
    elif current_entry == e5:
        e2.insert('insert', 'Hello!')
    elif current_entry == e6:
        e2.insert('insert', 'Hello!')



e1 = Entry(root)
e1.bind('<FocusIn>', on_focus)
e1.pack()

e2 = Entry(root)
e2.bind('<FocusIn>', on_focus)
e2.pack()

e3 = Entry(root)
e3.bind('<FocusIn>', on_focus)
e3.pack()

e4 = Entry(root)
e4.bind('<FocusIn>', on_focus)
e4.pack()

e5 = Entry(root)
e5.bind('<FocusIn>', on_focus)
e5.pack()

e6 = Entry(root)
e6.bind('<FocusIn>', on_focus)
e6.pack()

button = Button(root, text='Click me', command=on_click)
button.pack()

root.mainloop()
Полученная из Enter строка проверяется и потом значение из неё пересчитываются и вставляются во все строки. Приходится проводить проверок столько сколько окон. Нельзя ли тут оптимизировать/сократить код? Получить строку из активного окна и сделать один раз её проверку?
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 661
474
83
не понятно, зачем вам нужно именно такое поведение...

current_entry.get() тут применить невозможно
почему же, можно его применить, но у вас в коде функция вызывается при появлении фокуса на виджете, то есть текста там еще не будет
можно помудрить с событием FocusOut, это пропадание фокуса с виджета, но тут тоже нужно будет переключать фокус на другой виджет для вызова функции
как то так
Python:
from tkinter import *

root = Tk()
current_entry = None

def on_focus(evt):
    print(evt.widget.get())
    # global current_entry
    # current_entry = evt.widget
    #вот здесь нельзя и получить строку из активного окна? current_entry.get() тут применить невозможно
    #мы не знаем заранее какое окно выберет пользователь


def on_click():
    button.focus_set()
    # if current_entry==e1: #код в этом блоке примерный/демонстрационный
    #     e1.insert('insert', 'Hello!')
    # elif current_entry == e2:
    #     e2.insert('insert', 'Hello!')
    # elif current_entry == e3:
    #     e2.insert('insert', 'Hello!')
    # elif current_entry == e4:
    #     e2.insert('insert', 'Hello!')
    # elif current_entry == e5:
    #     e2.insert('insert', 'Hello!')
    # elif current_entry == e6:
    #     e2.insert('insert', 'Hello!')



e1 = Entry(root)
e1.bind('<FocusOut>', on_focus)
e1.pack()

e2 = Entry(root)
e2.bind('<FocusOut>', on_focus)
e2.pack()

e3 = Entry(root)
e3.bind('<FocusOut>', on_focus)
e3.pack()

e4 = Entry(root)
e4.bind('<FocusOut>', on_focus)
e4.pack()

e5 = Entry(root)
e5.bind('<FocusOut>', on_focus)
e5.pack()

e6 = Entry(root)
e6.bind('<FocusOut>', on_focus)
e6.pack()

button = Button(root, text='Click me', command=on_click)
button.pack()

root.mainloop()

опишите задачу, что вы делаете, может есть другие варианты...
 
Последнее редактирование:

ЗИЛ

Новичок
Пользователь
Янв 3, 2022
43
1
8
Прошу пардону за пропадание -- обстоятельства.
Проблема тащемта решена.
Если кому понадобится:
Python:
from tkinter import *

root = Tk()
current_entry = None

def on_focus(evt):
    global current_entry
    current_entry = evt.widget

def on_click():
    if current_entry==e1:
        e1.insert('insert', 'Hello!')
    elif current_entry == e2:
        e2.insert('insert', 'Hello!')
    elif current_entry == e3:
        e3.insert('insert', 'Hello!')
    elif current_entry == e4:
        e4.insert('insert', 'Hello!')
    elif current_entry == e5:
        e5.insert('insert', 'Hello!')
    elif current_entry == e6:
        e6.insert('insert', 'Hello!')

e1 = Entry(root)
e1.bind('<FocusIn>', on_focus)
e1.pack()

e2 = Entry(root)
e2.bind('<FocusIn>', on_focus)
e2.pack()

e3 = Entry(root)
e3.bind('<FocusIn>', on_focus)
e3.pack()

e4 = Entry(root)
e4.bind('<FocusIn>', on_focus)
e4.pack()

e5 = Entry(root)
e5.bind('<FocusIn>', on_focus)
e5.pack()

e6 = Entry(root)
e6.bind('<FocusIn>', on_focus)
e6.pack()

button = Button(root, text='Click me', command=on_click)
button.pack()

root.mainloop()

Теперь ровно такая же проблема в GTK+ v3.х (python3).
Может кто подскажет -- где посмотреть методы главного окна в GTK+ ?
 

Форум IT Специалистов