Я хочу запустить программу, которая после загрузки автоматически обновит 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()