Каков наилучший способ запуска асинхронного процесса и уведомления об изменениях, которые будут отображаться в tkinter canvas? - PullRequest
0 голосов
/ 02 декабря 2018

Я хочу запустить программу, которая после загрузки автоматически обновит tkinter canvas.

Я хочу, чтобы другой процесс был независим от основного цикла tkinter

В псевдокоде я хочу, чтобы онведи себя примерно так:

if __name__ == "__main__":
    app = loadTkinterWindowsWithCanvas()
    app.mainloop()
    manager = Manager.Manager()
    dataProcess = Process(target = manager.start())
    dataProcess.start()
    oldX = None
    x = None
    while True:
        time.sleep(1)
        oldX, x = x , manager.x
        if oldX is not x:
            app.updateCanvas(x) 
...
#in Manager Class
    def start(self):
        self.x = 0    
        while True:
            self.x += 1

Я пробовал много примеров из stackoverflow или учебных пособий, с потоками процесса, блокировкой и событием, но я не могу получить поведение, которое я желаю.Моя программа либо не загружается, либо не обновляется.Каков наилучший подход?

Так выглядит мой код прямо сейчас

if __name__ == "__main__":
    lock = mp.RLock()
    app = MainFrame()
    listOfCities = [(0,121),(112,5),(14,201),(45,88),(141,231),(1,8),(22,11),(101,84),(90,231)]
    pop = Population.Population(200,listOfCities)
    manager = EvolutionManager.EvolutionManager(100,pop,lock)
    pro = mp.Process(target = manager.startTraining())
    pro.start()
    app.mainloop()
    lastBest = None
    best = None
    while True:
        print("x")
        time.sleep(0.2)
        lastBest, best = best,manager.population.bestSalesman
        if lastBest is not best:
            app.getCurrentTopFrame().updateFrame(best.dna.getAsListOfTuple())

Поведение таково, что окно запуска второго процесса не загружается, пока процесс не завершится

ОБНОВЛЕНИЕ

Это начало работать.

def genethicAlgorithmPart(event,manager):
    manager.startTraining(event)
def addChangerListiner(manager,app,event):
    thread = t.Thread(target = changeListiner, args = (manager,app,event,))
    thread.start()
def changeListiner(manager,app,event):
    lastBest = None
    best = None
    print("Starting listiner thread")
    while True:
        print("x")
        event.wait()
        lastBest, best = best,manager.population.bestSalesman
        if lastBest is not best:
            app.getCurrentTopFrame().updateFrame(best.dna.getAsListOfTuple())
        event.clear()
if __name__ == "__main__":
#     listOfCities = [(631, 44), (612, 137), (441, 266), (447, 173), (52, 243), (104, 148), (333, 70), (474, 182), (419, 221), (238, 291), (264, 340), (290, 213), (332, 97), (473, 294), (188, 198), (180, 258), (433, 382), (394, 139)]
    listOfCities = rmg.genRandomListOfPoints(15,800,400)
    pop = Population.Population(400,listOfCities)
    manager = EvolutionManager.EvolutionManager(100,pop)
    event = mp.Event()
    pro = t.Thread(target = genethicAlgorithmPart, args = (event, manager,))
    app = MainFrame.MainFrame()
    app.getCurrentTopFrame().updateFrame(manager.population.bestSalesman.dna.getAsListOfTuple())
    app.after(111, addChangerListiner(manager, app, event))
    pro.start()
    app.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...