Многопоточность Python - не работает одновременно - PullRequest
0 голосов
/ 12 декабря 2018

я пытаюсь выучить Python.Но у меня есть проблемы с потоками.Сначала я потерпел неудачу в классе «Proces», потому что поставил цикл в неправильном месте, а моя программа вернулась из другого класса.

Но теперь я думаю, что все правильно, и это все еще не работает. Мне нужен графический интерфейс, в котором я хочу, чтобы я мог писать свои условия с помощью текстовых записей, и мне нужен еще один класс "Proces", который будет делать вещи, проверять статус или интернет постоянно и т. Д. Постоянно или через определенный интервал ...

Проблема в том, что мой графический интерфейс tkinter зависает после нажатия чего-либо

, вот мой файл GUI.py:

import tkinter as tk
from Proces import Proces


root = tk.Tk()
frame = tk.Frame(root)
frame.pack()
button = tk.Button(frame, text="QUIT", fg="red",command=quit).pack(side=tk.LEFT)

pr = Proces()
print("\nGUI: proces init...")
pr.start()
print("\nGUI: Start ended")

root.mainloop()

вот файл Proces.py:

import time, threading


class Proces(threading.Thread):
    def loop(self):
        while True:
            time.sleep(2)
            print("\nProces: looping")

    def __init__(self):
        threading.Thread.__init__(self)
        print("\nProces: Starting proces")
        time.sleep(2)

    def run(self):
        self.deamon = True
        print("\nProces: Starting loop")
        self.loop()

* Это вывод: *

Proces: Starting proces
GUI: proces init...
Proces: Starting loop
GUI: Start ended
Proces: looping
Proces: looping
Proces: looping
Proces: looping

* Но графический интерфейс tkinter не реагирует. *

Как мне выполнить такую ​​задачу?Спасибо за вашу помощь, совет и ответ

1 Ответ

0 голосов
/ 12 декабря 2018

Я думаю, у вас нет проблем с запуском потока и т. Д. Однако вы должны иметь возможность контролировать свой поток, то есть ваш поток должен возвращаться в зависимости от некоторых условий.Кажется, у вас есть кнопка, чтобы выйти.Я предполагаю, что вы хотите завершить процесс, нажав кнопку.Чтобы сделать это, когда вы нажимаете кнопку, ваш главный поток должен передать переменную Process, чтобы разорвать ваш цикл while, который в основном является вашим потоком.Вот код, над которым вы можете работать.

import tkinter as tk
import time
import threading


class MainWindow:
    def __init__(self, master):

    self.master = master
    self.quit_button = tk.Button(self.master, text="QUIT", command=lambda:self.quit(), width=20)
    self.quit_button.pack(side=tk.LEFT)
    self.process = None
    print("\nGUI: process init...")
    self.start_task()


    def quit(self):
      self.process.stop_process = True
      print("\nGUI: Start ended")

    def start_task(self):
      self.process = Process()
      self.process.start()


class Process(threading.Thread):
    def loop(self):
        while True:
            if not self.stop_process:
                time.sleep(2)
                print("\nProcess: looping")
            else:
                print("\nProcess: looping ended")
                return

    def __init__(self):
        threading.Thread.__init__(self)
        self.stop_process = False
        print("\nProcess: Starting proces")
        time.sleep(2)

    def run(self):
        self.deamon = True
        print("\nProcess: Starting loop")
        self.loop()


if __name__ == '__main__':
    root = tk.Tk()
    app = MainWindow(master=root)
    root.mainloop()

Итак, вы запускаете yout tkinter, который является вашим основным потоком.Затем инициирование другого класса в вашем основном потоке, который наследует поток.Таким образом, у вас есть две отдельные темы, которые работают.Когда вы нажимаете кнопку «выйти», вы передаете переменную stop_process, которая прерывает цикл и возвращает, что означает окончание вашего потока.Ваш главный поток все еще жив для запуска вашего окна tkinter.

Я надеюсь, что это поможет

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