Ваш currenttempLabel
является локальной переменной в Window.init_window
. Как только эта функция завершается, переменная исчезает, и больше нет доступа к ее значению.
Если вы хотите сохранить эти виджеты в переменных, к которым можно будет получить доступ позже, самое простое, что вам нужно сделать, это поместить их в атрибуты объекта:
self.currenttempLabel = Label(self, font = ("Courier",26), text = "No Current Reading" )
self.currenttempLabel.place(x=50, y=50)
Теперь вы можете получить к ним доступ через глобальную переменную app
. (Может быть, лучше передать объект Window
или переместить эти функции верхнего уровня в методы Window
, которые могут обращаться к нему как self
, вместо того, чтобы хранить его как глобальный. Но так как у вас уже есть глобальный в своем текущем дизайне вы можете просто использовать это.)
app.currenttempLabel['text'] = currentTemp
Однако, как только вы исправите это, у вас появится еще одна серьезная проблема:
t3 = threading.Thread(target=getcurrentTH)
Код, который не выполняется в главном потоке, не может касаться каких-либо виджетов tkinter. В зависимости от вашей платформы это может привести к возникновению исключения, зависанию графического интерфейса, падению или, что хуже всего, работе около 90% времени, но иногда что-то не так.
Есть несколько способов обойти эту проблему. Основной из них описан в этой статье в книге Tkinter : создайте queue.Queue
, выполните опрос основного потока q.get_nowait()
и вызовите все найденные там функции, а фоновый поток просто q.put
функции, а не вызывать их напрямую.
Есть библиотека с именем mttkinter
, которая завершает эту технику, но она была для Python 2.3; порт для Python 2.7 выглядит довольно солидно, но для 3.x я знаю только в основном непроверенные и не поддерживаемые вилки, такие как , который я собрал несколько лет назад, потому что ни один из остальных не работал . Поэтому, если вы хотите пойти по этому пути, вам все равно придется понимать, как все работает под одеялом, чтобы вы могли проверить и поддерживать его самостоятельно.