Почему текстовая переменная ткинтер пишет мой файл, - PullRequest
0 голосов
/ 05 апреля 2019

Я делаю небольшой скрипт, который читает файл и показывает на экране то, что вы прочитали; если файл изменен, метка будет изменена.Ну, приложение отлично работает для меня как скрипт, но когда я запускаю его как поток в моей основной программе, оно работает нормально, но метки не пишут их.Вы знаете, что это может быть?Спасибо

import _thread
from tkinter import *
from time import sleep

def AccionRecomendada(name, read):
    fin = False
    while not fin:
        archivo = open(name,"r")
        lineas = archivo.readlines()
        if len(lineas) > 1:
            recomendada = lineas[-2].replace("\n","")
        elif len(lineas) == 1:
            recomendada = lineas[0]
        else:
            recomendada = "Esperando"
        read.set(recomendada)
        sleep(0.1)


def AccionRead(name, read, dato):
    fin = False
    while not fin:
        archivo = open(name,"r")
        lineas = archivo.readlines()
        if len(lineas) > 1:
            estrategia = lineas[:-2]
            for i in range(len(estrategia)):
                estrategia[i] = estrategia[i].replace("\n","")
            temp = estrategia[dato].split(" ")
            if len(temp) >1:
                cadena1 = f"{temp[0].ljust(0)}"
                cadena2 = f"{temp[1].rjust(32)}"
                cadena = cadena1 + cadena2
            elif len(temp[0]) == 0:
                cadena = ""
            else:
                cadena = ""
        else:
            cadena = ""
        read.set(cadena)
        #print(name, cadena)
        sleep(0.1)     

def EstrategiaGUI(name, mesa):
# ----------------------------Creamos GUI para cargar la imagen----------------     
    root = Tk()
# ----------------------------Atributos siempre encima-------------------------
    root.wm_attributes("-topmost", 1)
# --------------------------------Título----------------------------------------
    root.title(mesa)
# -----------------------------Variables----------------------------------------
    readA=StringVar()
    readB=StringVar()
    readC=StringVar()
    readD=StringVar()
    readE=StringVar()
    readF=StringVar()
    readG=StringVar()
    readH=StringVar()


    readA.set(_thread.start_new_thread(AccionRecomendada,(name, readA)))
    readB.set(_thread.start_new_thread(AccionRead,(name, readB, 0)))
    readC.set(_thread.start_new_thread(AccionRead,(name, readC, 1)))
    readD.set(_thread.start_new_thread(AccionRead,(name, readD, 2)))
    readE.set(_thread.start_new_thread(AccionRead,(name, readE, 3)))
    readF.set(_thread.start_new_thread(AccionRead,(name, readF, 4)))
    readG.set(_thread.start_new_thread(AccionRead,(name, readG, 5)))
# ------------------------------- Frames----------------------------------------
# --------------------------------Labels----------------------------------------
    miFrame = Frame(root)
    miFrame.grid(row = 0, column = 0, columnspan = 2)
    miFrame.config(bd = 2)
    miFrame.config(relief = "groove")
# --------------------------------miFrame--------------------------------------
    LabelA=Label(miFrame, textvariable=readA)
    LabelA.grid(row=0,column=0, columnspan = 2)
    LabelA.config(anchor="center",background="#45B39D",justify="center",width="20",height="1",fg="black",
    cursor="hand2",font=("helvetica", "14", "bold"))

    LabelB=Label(miFrame, textvariable=readB)
    LabelB.grid(row=1,column=0, columnspan = 2)
    LabelB.config(anchor="w",background="#F1948A",justify="center",width="20",height="1",fg="black",
    cursor="hand2",font=("helvetica", "14", "bold"))

    LabelC=Label(miFrame, textvariable=readC)
    LabelC.grid(row=2,column=0, columnspan = 2)
    LabelC.config(anchor="w",background="#F1948A",justify="center",width="20",height="1",fg="black",
    cursor="hand2",font=("helvetica", "14", "bold"))

    LabelD=Label(miFrame, textvariable=readD)
    LabelD.grid(row=3,column=0, columnspan = 2)
    LabelD.config(anchor="w",background="#F1948A",justify="center",width="20",height="1",fg="black",
    cursor="hand2",font=("helvetica", "14", "bold"))

    LabelE=Label(miFrame, textvariable=readE)
    LabelE.grid(row=4,column=0, columnspan = 2)
    LabelE.config(anchor="w",background="#F1948A",justify="center",width="20",height="1",fg="black",
    cursor="hand2",font=("helvetica", "14", "bold"))

    LabelF=Label(miFrame, textvariable=readF)
    LabelF.grid(row=5,column=0, columnspan = 2)
    LabelF.config(anchor="w",background="#F1948A",justify="center",width="20",height="1",fg="black",
    cursor="hand2",font=("helvetica", "14", "bold"))

    LabelG=Label(miFrame, textvariable=readG)
    LabelG.grid(row=6,column=0, columnspan = 2)
    LabelG.config(anchor="w",background="#F1948A",justify="center",width="20",height="1",fg="black",
    cursor="hand2",font=("helvetica", "14", "bold"))  
# ---------------------------------Fin GUI ------------------------------------    
    root.mainloop()

1 Ответ

0 голосов
/ 05 апреля 2019

Причиной вашей проблемы может быть то, что вы настраиваете StringVar прямо на нить, которую вы начали.

Согласно этой странице , которая объясняет модуль _thread:

_thread.start_new_thread (функция, args [, kwargs]) ¶

Создать новый поток и вернуть его идентификатор.

Это означает, что вы устанавливаете в строке var возвращаемое значение, которое является идентификатором потока.

Кроме того, tkinter не является потокобезопасным, и поэтому другие потоки, которые изменяют графический интерфейс, могут блокировать основной поток (в котором работает tkinter).

Чтобы исправить вашу проблему, я бы порекомендовал использовать очереди для передачи данных в ваш основной поток и изменения элементов GUI оттуда.

Вам также следует удалить строки «наборов», которые у вас есть, которые запускают новые темы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...