2013-02-19 75 views
1

我是python新手,所以請耐心等待。 我的python腳本讀取一個文件,然後解析成一個數組。 然後它使用matplotlib庫來繪製條形圖。 由於文件'datadump.txt'中的數據不斷變化,我在腳本中添加了一個無限循環來讀取數據,解析並繪製數據。 一切工作正常。問題是,當我嘗試用鼠標重新調整窗口大小時,畫布或繪圖保持不變,並且不會重新調整爲新的窗口大小。python matplotlib canvas不重新調整尺寸

我怎樣才能得到它,使畫布重新調整到新的窗口大小?

這裏是我的Python腳本:

#! /usr/bin/python2.7 
#! /usr/lib/pymodules/python2.7 

import time 
import matplotlib.pyplot as plt 

# Global variables 
fig = plt.figure() 


def animated_graph(): 
    printonce = True 
    while (True): 
     # Make sure that the file is not currently being access by another program 
     # If it is, then let the user know. 
     try: 
      file = open('datadump.txt', 'r') 
     except IOError: 
      if (printonce == True): 
       print "The file is empty or does not exist." 
       printonce = False 

     # If the file is accessible, then execute the code below 
     with file: 
      file.seek(0) 
      first_char = file.read(1) 
      if first_char: 
       # Extract all data and create a matrix containing string values 
       table = [row.strip().split('\t') for row in file] 
       # Close the file once the data has been extracted 
       file.close() 

       # If the table is not empty, then continue with the execution 
       if table: 
        numrow = len(table) 
        numcol = len(table[0]) 

        #print ("num of rows: " + str(numrow)) 
        #print ("num of cols: " + str(numcol)) 

        tcp = 0 
        udp = 0 
        http = 0 
        dns = 0 
        icmp = 0 

        # Go thru each row and combine the total count of each protocol of for all IPs 
        for r in range(1, numrow): 
         for c in range(1, numcol): 
          if c==1: 
           tcp = tcp + int(table[r][c]) 
          elif c==2: 
           udp = udp + int(table[r][c]) 
          elif c==3: 
           http = http + int(table[r][c]) 
          elif c==4: 
           dns = dns + int(table[r][c]) 
          elif c==5: 
           icmp = icmp + int(table[r][c]) 


        ''' 
        print "tcp: " + str(tcp) 
        print "udp: " + str(udp) 
        print "http: " + str(http) 
        print "dns: " + str(dns) 
        print "icmp: " + str(icmp) 
        ''' 
        gridnumber = range(1,6) 
        labels = ["tcp", "udp", "http", "dns", "icmp"] 
        #plt.bar(gridnumber, [tcp, udp, http, dns, icmp], color="red", width=0.4, label="Total # of connections", align="center") 
        plt.clf() 
        plt.bar(1, tcp, color="red", width=0.4, label="tcp " + str(tcp), align="center") 
        plt.bar(2, udp, color="green", width=0.4, label="udp " + str(udp), align="center") 
        plt.bar(3, http, color="blue", width=0.4, label="http " + str(http), align="center") 
        plt.bar(4, dns, color="brown", width=0.4, label="dns " + str(dns), align="center") 
        plt.bar(5, icmp, color="gold", width=0.4, label="icmp " + str(icmp), align="center") 
        plt.xlim([0,8]) 
        plt.xticks(gridnumber, labels) 
        plt.xlabel("Protocols") 
        plt.ylabel("Total # of packets") 
        plt.title("Number of packets in a time window of 5secs") 
        plt.legend() 
        fig.canvas.draw() 
        #time.sleep(1) 

def main(): 
    length = 0 
    print "\nOpening file 'datadump.txt' " 
    printonce = True 
    while (True): 
     try: 
      length = len(open("datadump.txt").readlines()) 
      break 
     except IOError: 
      if (printonce == True): 
       print "The file is empty or does not exist." 
       printonce = False 

    #print "%d lines in your choosen file" % length 
    win = fig.canvas.manager.window 
    win.after(1, animated_graph) 
    plt.figure(fig.number) 
    plt.show() 

main() 
+0

請問您是否可以將此示例剪切爲包含_just_導致問題的代碼(大部分代碼看起來像是數據驅動代碼)並使其可以由其他人運行(我們沒有數據文件 - >我們無法測試任何東西)?你正在使用哪個後端,是否有某種原因試圖複製它的事件循環的工作? – tacaswell 2013-02-20 03:49:51

回答

1

你需要讓GUI事件循環喘口氣,並呼籲time.sleep()完全不是那麼回事做到這一點,但它幾乎做的事情。

在我的代碼中,我通過調用plt.waitforbuttonpress(.1)解決了這個問題,其中.1是等待的超時時間(以秒爲單位),然後允許調用返回並繼續運行其他任何您正在進行的操作。

我懷疑這可以讓gui抓住resize事件並正確處理它們。