Измените это:
if __name__ == '__main__':
Thread(target = displayNums()).start()
Thread(target = stam()).start()
на это:
if __name__ == '__main__':
Thread(target = displayNums).start()
Thread(target = stam).start()
Целью потока является сама функция, а не возвращаемое значение из функции. stam()
вызывает функцию и возвращает ее значение, но stam
является самим объектом функции. Когда вы создаете поток, вам нужна сама функция, а не ее возвращаемое значение.
EDIT: Вы вызываете функцию, когда хотите запустить ее прямо сейчас. Вы можете получить доступ к его возвращенному значению, например, x = f()
назначит возвращаемое значение f для x. Существуют другие ситуации, когда вы не хотите запускать функцию прямо сейчас, но вы хотите отслеживать ее, чтобы вы могли вызвать ее позже. Это в случае с потоками. Вы не хотите запускать функцию, вы хотите сообщить конструктору потока, какую функцию запустить во втором потоке. Таким образом, в этом случае вы передаете саму функцию в качестве аргумента. Обычно это означает, что имя функции без скобок.
Python обрабатывает функции как любой другой объект. В Python вы можете назначить функцию переменной, и тогда переменная для всех намерений и целей является самой функцией. Она может быть вызвана так же, как исходная функция (с фигурными скобками), или может быть передана в функцию, или как угодно.
Попробуйте это:
# print is a function (built-in), and I can assign it to a variable
a = print
# Nothing gets printed yet
# the variable 'a' is now the same thing as the print function
a("Hello world")
Это глупый пример, но Есть много реальных ситуаций, где это очень полезно.