Как продеть нитку с помощью tkinter в python3, используя очередь? - PullRequest
0 голосов
/ 01 февраля 2019

Я пытаюсь вписать определения в tkinter, используя очередь, в частности, в python3

У меня был похожий код в python2, который отлично работает, используя подобный метод без очереди, но в python3 из того, что я прочитал, tkinter не делаетне допускаю многопоточность с графическим интерфейсом.Я нашел несколько примеров, которые используют процесс очереди.Они обрисовывают в общих чертах, я предполагаю создать объект Queue, новый поток с доступом к этой очереди и проверить ввод в основном потоке

#!/usr/bin/python3

from tkinter import *
import time
import threading
import queue
import subprocess

def temp_sensor(queue_list):
    warning = 0
    while True:
        var = "cat /sys/class/thermal/thermal_zone*/temp"
        temp_control = subprocess.check_output([var], shell=True)
        temp_length = len(temp_control)
        temp_control = temp_control[35:]
        temp_control = temp_control[:-4]
        temp_control = int(temp_control)
        degree_sign= u'\N{DEGREE SIGN}'
        displayed_temp = "Tempature: " + str(temp_control) + degree_sign + "C"

        if temp_control > 79:
            warning = warning + 1
            if warning == 3:
                print ("Warning Core Tempature HOT!")
                warning = 0

        if temp_control > 90:
                time.sleep(3)
                print ("Warning EXTREMLY to HOT!!!")

        queue_list.put(displayed_temp)            
        time.sleep(1)

class Gui(object):
    def __init__(self, queue_list):
        self.queue_list = queue_list
        self.root = Tk()
        self.root.geometry("485x100+750+475")
        main_tempature_status = StringVar(self.root)

        Ts = Entry(self.root, textvariable=main_tempature_status)
        Ts.pack()
        Ts.place(x=331, y=70, width=160, height=25)
        Ts.config(state=DISABLED, disabledforeground="Black")

        self.root.after(1000, self.read_queue)

    def read_queue(self):
        try:
            temp = self.queue.get_nowait()
            self.main_tempature_status.set(temp)
        except queue_list.Empty:
            pass

        self.root.after(1000, self.read_queue)

if __name__ == "__main__":
    queue_list = queue.Queue()

    gui = Gui(queue_list)
    t1 = threading.Thread(target=temp_sensor, args=(queue_list,))
    t1.start()

    gui.root.mainloop()

Мой желаемый результат - выполнить некоторые из этих определений, чтобы сделатьразличные задачи и отображать их переменные в записи tkinter с помощью python3.когда я запускаю свой код, он выдает мне переменную из очереди, но не публикует в GUI.пожалуйста, прости мой менее чем питонический код.

1 Ответ

0 голосов
/ 01 февраля 2019

Измените свой Gui класс на этот:

class Gui(object):
    def __init__(self, queue_list):
        self.queue_list = queue_list
        self.root = Tk()
        self.root.geometry("485x100+750+475")
        self.main_tempature_status = StringVar(self.root)

        self.Ts = Entry(self.root, textvariable=self.main_tempature_status)
        self.Ts.pack()
        self.Ts.place(x=331, y=70, width=160, height=25)
        self.Ts.config(state=DISABLED, disabledforeground="Black")

        self.root.after(1000, self.read_queue)

    def read_queue(self):
        try:
            temp = self.queue_list.get_nowait()
            self.Ts.config(state=NORMAL)
            self.main_tempature_status.set(temp)
            self.Ts.config(state=DISABLED)
        except queue.Empty:
            pass

        self.root.after(1000, self.read_queue)

Пояснение :

  1. переменная main_temperature_status используется в функции read_queue какпеременная класса, но не определена как переменная класса.
  2. Невозможно отобразить изменение значения виджета Entry, если оно всегда отключено, поэтому его можно включить до изменения значения в read_queue.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...