У меня есть функция, которая отлично работает, если в имени функции не используется ():
answer = message.AskQuestion(
self.loc_top, thread=self.refresh_play_top, align='left',
icon='warning', title = "Forget Location Confirmation", text=text)
Если я случайно использую (), E.G. thread=self.refresh_play_top() функция возвращает поврежденные данные:
answer = message.AskQuestion(
self.loc_top, thread=self.refresh_play_top(), align='left',
icon='warning', title = "Forget Location Confirmation", text=text)
Внутри функции .AskQuestion() есть это:
self.thread = thread # The thread run before button click
Как это можно изменить?
Используя принятый ответ:
self.refresh_play_top(), чтобы она всегда возвращала True или False, включая завершение функции, которая по умолчанию возвращает None.AskQuestion() (показана внизу): def __init__(self, parent, text=None, confirm='yes',
align='center', thread=None, icon='warning'):
self.top_level = parent # Allows .after() calls
self.confirm = confirm # Append "Are you sure?" line?
self.align = align # data (text lines) alignment
if thread is None:
self.thread = None
elif callable(thread):
self.thread = thread # The thread run before button click
else:
print("message.py, CommonSelf, invalid thread= passed")
self.thread = None
Спасибо экспертам, которые оперативно прокомментировали и ответили.
Вы можете пойти дальше. Это статическая проверка типов; вы можете проверить это во время выполнения, например. stackoverflow.com/a/65505019/4799172
Отвечает ли это на ваш вопрос? Узнайте, можно ли вызывать объект Python
@Barmar Я использую PyCharm, но еще не эту функцию. Спасибо!
@roganjosh Да и нет. Я отредактировал вопрос с решением. Пожалуйста, сообщите, если я должен закрыть как дубликат.






Если у вас когда-либо будет () в конце, python попытается вызвать это. Итак, когда у вас есть thread=self.refresh_play_top(), python вызовет функцию refresh_play_top, и эта функция что-то вернет — либо None, либо что-то, что не None. Затем этот возвращенный объект передается вашему message.AskQuestion(...). Итак, если self.refresh_play_top() возвращает 5, вы фактически выполняете thread=5. Любая попытка заставить ваш скрипт передавать вам возвращаемое значение функции (с помощью ()) вместо самой функции вызовет больше проблем.
Как пишут в комментариях некоторые люди, существуют программы проверки типов, которые могут помочь вам уловить это во время написания кода и помочь вам избежать ошибки. Это гораздо лучшая идея, чем пытаться впихнуть в программу некоторый код, чтобы вы могли писать код неправильно, но при этом делать то, что хотите.
self.refresh_play_top() ничего не возвращает. Он просто крутит обложку альбома каждые 33 миллисекунды, в то время как ffplay воспроизводит песню в отдельном задании оболочки. Параметр thread= вызывается, пока пользователь нажимает «Да» или «Нет».
Каждая функция, которая завершается, возвращает что-то, даже если только None. Вызов AskQuestion будет заблокирован до тех пор, пока refresh_play_top не вернется.
@chepner refresh_play_top возвращается через миллисекунду или две, потому что он вызывается в течение 33-миллисекундного (30 кадров в секунду (кадров в секунду)) цикла простоя. thread=None уже является допустимым параметром, поэтому refresh_play_top возвращение None является нарушителем условий сделки. Поэтому я изменил полдюжины команд return, чтобы они возвращали True или False (включая последнюю строку), и теперь все работает.
Используйте подсказки типа, чтобы указать, что аргумент
threadдолжен бытьCallable. Тогда ваша IDE или средство проверки типов, напримерmypy, предупредит вас, если вы назовете его неправильно.