2017-06-03 23 views
1

好的,我有一些多进程代码,我尝试在我的程序中监视某个数组的值。我做了一些研究,但还没有找到任何解决办法,这里是我的代码从SharedCtypes数组中设置Tkinter标签文本

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阵列正常的方式打印(定时器[:])。但是如果在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循环可以继续检查在两个进程之间共享的计时器变量的值。 也是其不良做法,在构造函数内调用mainloop,所以我已将它移出if __name__ == '__main__'块。

+0

哇,谢谢你的回答,解释和纠正。在我的问题发布贴我从我的真实代码的一部分复制粘贴,并把它放在这里,我忘记了一些细节..我不知道'配置'和'后',我应该谷歌什么关键字两种语法? –

+0

您可以传递给configure的参数取决于正在使用的窗口小部件,但通常当您创建窗口小部件时(除了父窗口小部件),您传递的任何参数都可以传递到'configure'函数以在创建窗口小部件后进行更改。为后,见这里:http://effbot.org/tkinterbook/widget.htm#Tkinter.Widget.after-method –

+0

好的,谢谢你的信息 –