Найти - Пользователи
Полная версия: Tkinter focus_force
Начало » Python для новичков » Tkinter focus_force
1
noob_saibot
from Tkinter import *
root = Tk()
root.after(5000, lambda: root.focus_force())
root.mainloop()
С lambda отрабатывает на уже открытом окне, без него окно открывается просто через 5 секунд.

“lambda param_list: expression
Короткая форма создания (безымянной) функции, возвращающей значение выра-
жения expression. Ее поведение аналогично поведению функции, созданной с
помощью инструкции ‘def name(param_list): return expression’.”
- Г. Россум, Ф.Л.Дж. Дрейк, Д.С.Откидач
Язык программирования Python.

Но:
from Tkinter import *
root=Tk()
def lol():
    return root.focus_force()
root.after(5000, lol())
root.mainloop()
отрабатывает также как и без lambda (тоесть открывает окно через 5 секунд). Или я что-то не уловил и записал неправильно?
4kpt_II
Я вообще не понял вопроса. Что Вы хотите выяснить?
noob_saibot
4kpt_II
Я вообще не понял вопроса. Что Вы хотите выяснить?
1. Почему без lambda root.after не отрабатывает как надо?
from Tkinter import *
root = Tk()
root.after(5000, lambda: root.focus_force())
root.mainloop()
2. Правильно ли я заменил lambda?
from Tkinter import *
root=Tk()
def lol():
    return root.focus_force()
root.after(5000, lol())
root.mainloop()
4kpt_II
А что Вы хотите реализовать?
noob_saibot
4kpt_II
А что Вы хотите реализовать?
Мне надо чтобы сразу открывалось окно, далее через 5 секунд отрабатывал focus_force.
Я так понял .after как раз для этого и нужен
И разобраться с lambda. Правильно ли я усвоил её назначение.
4kpt_II
Понял. Теоретически нужно так, но у меня root всегда отрабатывает в фокусе, поэтому не могу проверить:

from Tkinter import *
#
root = Tk()
#
def lol():
    root.focus_force()
#
root.after(5000, lol)
root.mainloop()

Ну и напоминаю, что

from Tkinter import*

Так делать нельзя ни в коем случае.

P.S. Будут вопросы - пишите…
noob_saibot
Вот нашёл.
    def after(self, ms, func=None, *args):
        """Call function once after given time.
        MS specifies the time in milliseconds. FUNC gives the
        function which shall be called. Additional parameters
        are given as parameters to the function call.  Return
        identifier to cancel scheduling with after_cancel."""
        if not func:
            # I'd rather use time.sleep(ms*0.001)
            self.tk.call('after', ms)
        else:
            def callit():
                try:
                    func(*args)
                finally:
                    try:
                        self.deletecommand(name)
                    except TclError:
                        pass
            name = self._register(callit)
            return self.tk.call('after', ms, name)
root.after воспринимает root.focus_forse() как not func и отрабатывает так:
if not func:
            # I'd rather use time.sleep(ms*0.001)
            self.tk.call('after', ms)
Вот почему без lambda нельзя
4kpt_II
Что Вы имеете ввиду? Можно без lambda.
Просто в первом посту Вы передавали не объект функции, а объект результата ее выполнения. Поэтому и не работало.

Так неверно в принципе:

root.after(5000, lol())

Так Вы передаете в обработчик не функцию, а результат ее выполнения.

Нужно всегда делать так:

root.after(5000, lol)

В этом случае Вы передаете в обработчик функцию. Это касается как метода .after так и других методов. В частности .bind в первом случае тоже выполнятся не будет.

А вот lambda нужна тогда, когда вы хотите еще в эту функцию что-то передать. В этом случае, если Вы опять напишите

root.after(5000, lol(12))

То опять свяжите обработчик с результатом выполнения, что Вам не подходит.
Поэтому делается через анонимную функцию:

root.after(5000, lambda: lol(12))

P.S. Будут вопросы - пишите…

P.S.S. Вообще желательно по tkinter в ветке GUI
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB