2013-02-19 132 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事件并正确处理它们。