Python потоки tkinter и обновление окна - PullRequest
2 голосов
/ 14 февраля 2020

Я использую python и tkinter для создания инструмента визуализации, который может обновить sh и визуализировать объект обновления. Прямо сейчас объект не может измениться, потому что поток не работает. Любая помощь или общие знания будут оценены. Я относительно новичок в потоках и tkinter.

пример объекта, который я хочу принять

class color1:
    def __init__(self, color):
       self.color = color

    def change_col(self, new_color):
        self.color = new_color

    def pass_col(self):
        return(self)

мой код визуализации

class my_visual(threading.Thread):

    def __init__(self, col1):
        threading.Thread.__init__(self)
        self.start()
        self.col1 = col1

    def viz(self):
        self.root = Tk()
        btn1 = Button(self.root, text = 'Refresh', command = self.refresh)
        btn1.pack()
        frame = Frame(self.root, width = 100, height = 100, bg = self.col1.color)
        frame.pack()
        btn2 = Button(self.root, text = 'Close', command = self.exit)
        btn2.pack()
        self.root.mainloop()

    def refresh(self):
        self.root.quit()
        self.root.destroy()
        self.col1 = self.col1.pass_col()
        self.viz()


    def exit(self):
        self.root.quit()
        self.root.destroy()

Код, который работает

c = color1('RED')
test = my_visual(c)
test.viz()

Код, который не работает

В этой версии refre sh работает, а многопоточность - нет. Когда поток работает, refre sh не поймет, что объект изменился.

c.change_col('BLUE')

Ответы [ 2 ]

2 голосов
/ 14 февраля 2020

Если вы расширяете класс threading.Thread, вам необходимо переопределить метод run() с помощью пользовательских функций. Без метода запуска поток умирает немедленно. Вы можете проверить, жив ли поток с my_visual.is_alive().

1 голос
/ 14 февраля 2020

Проблема в том, что ваш test.viz() является бесконечным l oop из-за self.root.mainloop(), поэтому вы не можете ничего делать, когда вызываете эту функцию. Решение состоит в том, чтобы использовать thread для test.viz(), и ваш поток для класса my_visual больше не нужен.

Я добавил time.sleep за 2 секунды до того, как refre sh сделает это синий, в противном случае цвет синий в начале.

Здесь вы go:

import threading
from tkinter import *
import time

class color1:
    def __init__(self, color):
       self.color = color

    def change_col(self, new_color):
        self.color = new_color

    def pass_col(self):
        return(self)

class my_visual():

    def __init__(self, col1):
        self.col1 = col1

    def viz(self):
        self.root = Tk()
        btn1 = Button(self.root, text = 'Refresh', command = self.refresh)
        btn1.pack()
        frame = Frame(self.root, width = 100, height = 100, bg = self.col1.color)
        frame.pack()
        btn2 = Button(self.root, text = 'Close', command = self.exit)
        btn2.pack()
        self.root.mainloop()

    def refresh(self):
        self.root.quit()
        self.root.destroy()
        self.col1 = self.col1.pass_col()
        print("self.col1", self.col1, self.col1.color)
        self.viz()


    def exit(self):
        self.root.quit()
        self.root.destroy()

c = color1('RED')
test = my_visual(c)
t2 = threading.Thread(target = test.viz)
t2.start()

time.sleep(2)
print('Now you can change to blue when refreshing')
c.change_col('BLUE')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...