Выполнение бесконечного цикла без прерывания дальнейшего кода

Рейтинг: 0Ответов: 1Опубликовано: 05.07.2023
import tkinter as tk
from tkinter import messagebox
import pyowm.commons.exceptions
from pyowm import OWM
from pyowm.utils.config import get_default_config
import psutil

config_dict = get_default_config()
config_dict['language'] = 'ru'
owm = OWM('3e8f1734c31354d3ae9df9282e1ba7fa')

root = tk.Tk()
root.title('Lenovo Live')
root.resizable(width=False, height=False)

# Создали canvas под размер окна
canvas = tk.Canvas(root, width=350, height=200, borderwidth=0)
# Заранее заготовили изображение
image = tk.PhotoImage(file='bg.png')
canvas.grid(column=0, row=0)


def build():
    # Очищаем на случай, если на холсте уже что то есть
    canvas.delete('all')
    canvas.create_image((-250, 0), anchor=tk.NW, image=image)  # Фон

    mgr = owm.weather_manager()
    try:
        observation = mgr.weather_at_place('Saint Petersburg, RU')
        w = observation.weather
        wind = w.wind()['speed']
        temperature = w.temperature('celsius')['temp']
        temperature_reformat = round(temperature, 1)

        # Добавление текста
        canvas.create_text(170, 20, font='Intro 15', fill='white',
                           text=f'Температура: {temperature_reformat} °С')
        canvas.create_text(170, 50, font='Intro 11', fill='white',
                           text=f'    Погода: {str.capitalize(w.detailed_status)}')
        canvas.create_text(180, 80, font='Intro 13', fill='white', text=f'Ветер: {wind} м/с')
        canvas.create_text(180, 110, font='Intro 12', fill='white',
                           text=f'Заряд батареи: {psutil.sensors_battery().percent}%')
        # canvas.create_text(180, 140, font='Intro 12', fill='white', text=f'Источник питания: {power}')
        # except на случай, если нет Интернета
    except pyowm.commons.exceptions.InvalidSSLCertificateError:
        tk.messagebox.showerror(title='Ошибка', message='Отсутствует подключение к Интернету, \n'
                                                       '        данные о погоде недоступны!')
        canvas.create_text(170, 20, font='Intro 15', fill='white',
                           text='Температура: ??? °С')
        canvas.create_text(170, 50, font='Intro 11', fill='white',
                           text='    Погода: ???')
        canvas.create_text(180, 80, font='Intro 13', fill='white', text='Ветер: ??? м/с')
        canvas.create_text(180, 110, font='Intro 12', fill='white',
                           text=f'Заряд батареи: {psutil.sensors_battery().percent}%')


build()
root.mainloop()

Мне нужно, чтобы программа постоянно смотрела, подключен ли АС источник питания, независимо от потока общего кода. Бесконечный цикл while True обрывает всю дальнейшую писанину, и программа не запускается (л-логика)

Ответы

▲ 0Принят

Самый простой вариант, это вызывать функцию внутри цикла

def check():
   pass

while True:
  check() #вызываем в начале, а не в конце тк могут быть continue
  ... #other code

но в графической оболочке лучше использовать таймеры

#tk
import tkinter
def check():
  pass

t=tkinter.Tk()
t.after(1000,check)#милисекунды, функция ; можно несколько
... #code
t.mainloop()

так же можно исспользовать модули multiprocessing theading

import multiprocessing
def td():
    while:
      pass
m=multiprocessing.Process(target=td)
m.start()
...
#обмен переменными
pout,pin=multiprocessing.Pipe()
pout.send('data')
var=pin.recv()

or

import threading
def td():
    while:
      pass
t=threading.Thread(target=td)
t.start()

в первых двух случаях глобальные переменные будут изменятся и в нутри вызываемых функциях, в послдених возникнет проблема обмена переменными