好的,我有一些多进程代码,我尝试监视程序中某些数组的值。我做了一些研究,但仍未找到任何解决方案,这是我的代码
from tkinter import *
from tkinter.ttk import *
import multiprocessing as mp
from multiprocessing.sharedctypes import Array
import time
class Form:
def __init__(self, timer):
window = Tk()
window.wm_title('Multiprocess Monitor')
tvar = StringVar()
tvar.set(timer)
ArrayStat = Label(window, textvariable = tvar)
window.loop()
def Countdown(timer):
while True:
for i,v in enumerate(timer):
timer[i] = v-1
time.sleep(1)
if __name__ == '__main__':
timer = Array('i',[-1,-1,-1,-1])
Ptimer = mp.Process(target = Countdown, args=(timer,))
Ptimer.daemon = True
Ptimer.start()
app = Form(timer)
Ptimer.join()
打印sharedctypes数组的常规方法是print(timer [:])。但如果在tvar =>中使用这种方式tvar.set(timer [:]),我的GUI没有更新标签中的文本。如果我使用tvar.set(计时器),标签将显示<& SychronizedArray bla bla bla .....>有没有可能的解决方案?感谢
答案 0 :(得分:1)
from tkinter import *
from tkinter.ttk import *
import multiprocessing as mp
from multiprocessing.sharedctypes import Array
import time
class Form(Tk):
def __init__(self):
Tk.__init__(self)
self.title('Multiprocess Monitor')
self.ArrayStat = Label(self, text="test")
self.ArrayStat.pack()
self.after(10, self.update_label)
def update_label(self):
self.ArrayStat.configure(text=timer[:])
self.after(10, self.update_label)
def Countdown(timer):
while True:
for i,v in enumerate(timer):
timer[i] = v-1
time.sleep(1)
if __name__ == '__main__':
app = Form()
timer = Array('i',[-1,-1,-1,-1])
Ptimer = mp.Process(target = Countdown, args=(timer,))
Ptimer.daemon = True
Ptimer.start()
app.mainloop()
Ptimer.join()
您发布的代码甚至不会运行,未声明的变量等。
你还没有打包/网格/放置你的标签,所以什么都不会出现。
因为tkinter窗口不能被序列化以便在进程之间传递,所以不能直接调用标签的更新,但是after
循环可以继续检查在两个进程之间共享的timer变量的值。
在构造函数中调用mainloop
也是不好的做法,所以我把它移到了if __name__ == '__main__'
块中。