Найти - Пользователи
Полная версия: Кнопка "Tkinter.Button" нажимается сама собой
Начало » Python для новичков » Кнопка "Tkinter.Button" нажимается сама собой
1 2
py.user.next
Olezhka
Или это засирание происходит только при использовании “root.after()”?
При любой рекурсии оно висит в памяти, пока вызовы не завершились. Почему для root.after() нельзя применять рекурсию - потому что эти вызовы бесконечны. То есть ты один раз жмёшь на кнопку и они после этого одного нажатия всё запускаются и запускаются через каждую секунду, не завершаясь никогда. То есть оно мало того что в памяти висит постоянно и ещё и растёт в памяти по мере появления новых вызовов, так оно ещё и дойдёт таким образом до лимита рекурсии в конце концов и выпадет. В разных языках разный лимит рекурсии; только не во всех языках он в количестве выражается, как в питоне. Но суть в том, что эти вызовы будут повторяться и повторяться и при этом всё висеть и висеть.

Рекурсию можно применять только тогда, когда она неглубокая (не бесконечная) и когда она строго определена и вызовы завершаются гарантировано. А в других языках рекурсию можно применять, даже если она бесконечная, но тогда ты должен проконтролировать, чтобы она была хвостовой рекурсией и чтобы в языке была оптимизация хвостовой рекурсии в простой цикл. В Erlang'е вот такая рекурсия, поэтому там бесконечные рекурсии можно делать, они не обрушат программу.
Olezhka
py.user.next
Рекурсию можно применять только тогда, когда она неглубокая (не бесконечная) и когда она строго определена и вызовы завершаются гарантировано.
А как же тогда написать простейшие часы, которые будут каждую секунду выводить текущее время, если не пользоваться самозацикливанием рекурсивным функции “tick()” с помощью “root.after(1000, tick)”?!
Olezhka
А про симафор я имел ввиду вот что:
 stop = 0
def work(str_):
    global stop
    len_ = len(str_) - 1
    curr = 0
    while stop == 0:
        print(str_[curr])
        curr += 1
        if curr == len_:
            curr = 0
work('gfwer43t54t5t555555555555555555555555555555'+
     '5555555555555555555555555555555555555555555'+
     'hfghfghghfghgjuykukki878ki78ki8787ik78i55555')
print('end')
“stop = 0” - это симафор. И цикл в теле функции (без всякой рекурсии) будет выполняться, пока какая-то другая функция не изменит значение симафора на “stop = 1”. Да вот только проблема тут, как я понял, похоже, в том, что после вызова функции управление на следующий кадр-то не передается, пока функция не завершится… “print('end')”-то не выполняется…
py.user.next
Olezhka
А как же тогда написать простейшие часы, которые будут каждую секунду выводить текущее время, если не пользоваться самозацикливанием рекурсивным функции “tick()” с помощью “root.after(1000, tick)”?
У тебя tick() должна запуститься, отработать и выйти сразу. Внутри tick() нельзя вставлять эту строку.

Вот так это должно быть сделано
  
while True:
    root.after(1000, tick)
Это повтор через цикл, а не через рекурсивные вызовы.

Olezhka
И цикл в теле функции (без всякой рекурсии) будет выполняться, пока какая-то другая функция не изменит значение симафора на “stop = 1”.
Скорее всего, ты столкнёшься с тем, что stop вычислится один раз и будет иметь такое значение потом постоянно при каждой проверке в while. Семафор обычно сложнее устроен и обрабатывается он не просто одной проверкой какой-то. Поэтому и ставят таймеры, а к таймерам уже привязывают проверки.
Olezhka
py.user.next
У тебя tick() должна запуститься, отработать и выйти сразу. Внутри tick() нельзя вставлять эту строку.
Спасибо! Буду знать!
А как быть с тем, что после вызова функции управление на следующий кадр не передается, пока функция не завершится? Я так понимаю, даже цикл “while” после вызова функции остановится и не пойдет дальше (управление не передастся), пока функция не отработает? И как же этот момент обойти? Учить и юзать “threads”?
py.user.next
Olezhka
А как быть с тем, что после вызова функции управление на следующий кадр не передается, пока функция не завершится? Я так понимаю, даже цикл “while” после вызова функции остановится и не пойдет дальше (управление не передастся), пока функция не отработает? И как же этот момент обойти? Учить и юзать “threads”?
Да, для этого нужна многопоточность. Все независимые элементы разносятся по разным потокам и таким образом работают одновременно. Происходит постоянное быстрое переключение от одного потока к другому. Поэтому кажется, что они работают одновременно. А уже передача информации какой-то налаживается между потоками через какие-то средства, которые для потоков подходят (трубы, семафоры, таймеры, неблокирующие очереди и так далее). Абстракций там много всяких.
Olezhka
py.user.next
А уже передача информации какой-то налаживается между потоками через какие-то средства, которые для потоков подходят (трубы, семафоры, таймеры, неблокирующие очереди и так далее). Абстракций там много всяких.
Спасибо! Ясно. Короче, это ЦЕЛЫЙ МИР! ЮУТУБ Как и “tkinter”!
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