ошибка питона; зависает график;Tkinter

  1. Я пытаюсь построить два графика на холсте Tkinter.
  2. Проблема в том, что после нескольких графиков данных график зависает. Это занимает огромные ресурсы окна, тогда мне приходится принудительно его убивать.
  3. Поскольку я должен постоянно строить график, как в CRO / DSO, поэтому мне нужно идти построчно, а не использовать какую-либо библиотеку. Не нашел ни одной библиотеки, где график печатается непрерывно.
  4. Я использую python 2.7 в 64-битном окне 8.
  5. Но в итоге мне приходится переносить код на плату Raspberry pi.

code: from Tkinter import * import Tkinter import time from random import randint import math

    #global vars
    hor_pixel = 5                      #starting point of horizontal pixel
    old_ver_pixel_1 = 0                #last pixel value of graph 1
    old_ver_pixel_2 = 0                #last pixel value of graph 2
    new_ver_pixel_1 = 0                #new pixel value of graph 1
    new_ver_pixel_2 = 0                #new pixel value of graph 2
    y0_1 = 0                           # y cordinate of graph 1 & 2
    y1_1 = 0
    y0_2 = 0
    y1_2 = 0

    def pixel(C):
        global hor_pixel
        global old_ver_pixel_1
        global old_ver_pixel_2    
        global new_ver_pixel_1
        global new_ver_pixel_2
        global y0_1
        global y1_1
        global y0_2
        global y1_2    

        if(new_ver_pixel_1 == old_ver_pixel_1):
            new_ver_pixel_1 = new_ver_pixel_1 + 1
        if(new_ver_pixel_2 == old_ver_pixel_2):
            new_ver_pixel_2 = new_ver_pixel_2 + 1            

        if(new_ver_pixel_1 > old_ver_pixel_1):
            y0_1 = old_ver_pixel_1
            y1_1 = new_ver_pixel_1
        else:
            y0_2 = old_ver_pixel_2
            y1_2 = new_ver_pixel_2        

        coord = hor_pixel, y0_1, hor_pixel, y1_1
        coord2 = hor_pixel, y0_2, hor_pixel, y1_2        
        hor_pixel = hor_pixel + 1

        if(hor_pixel > 400):
            hor_pixel = 5;

        old_ver_pixel_1 = new_ver_pixel_1
        old_ver_pixel_2 = new_ver_pixel_2

        C.create_line(hor_pixel , 0 , hor_pixel , 500, fill = 'black')
        C.create_line(coord, fill = 'red')
        C.create_line(coord2, fill = 'yellow')
        C.pack()
        #print(new_ver_pixel_1 , new_ver_pixel_2)



    def graph():
        global new_ver_pixel_1
        global new_ver_pixel_2

        screen = Tkinter.Tk()
        screen.title("Analog Channel")
        screen.geometry("800x800")
        C = Tkinter.Canvas(screen , bg = "black" , height = 800, width = 800)
        C.pack()

        while True:
            var = 0
            var = var + 1
            new_ver_pixel_1 = randint(0,200) + 200;
            new_ver_pixel_2 = randint(0,200) + 400;
            #print(new_ver_pixel_1 , new_ver_pixel_2)
            #pixel(C)
            screen.after(100,pixel(C))
            screen.update_idletasks()

        screen.mainloop()


    graph()

person vindhyachal    schedule 14.07.2015    source источник


Ответы (1)


Это утверждение не делает того, что вы думаете:

screen.after(100,pixel(C))

Вы думаете, что он запускается pixel(C) каждые 100 мс, но на самом деле он запускается pixel(C) немедленно, а затем планирует выполнение None через 100 мс. Вероятно, поэтому он потребляет весь ваш процессор и в конечном итоге зависает.

Одно исправление - изменить его на screen.after(100, pixel, C). Однако пользовательский бесконечный цикл — это неправильный способ запуска функции каждые 100 мс с помощью Tkinter.

Вместо этого вам нужно удалить свой бесконечный цикл и использовать существующий бесконечный цикл (mainloop()). Переместите тело цикла while в функцию, и эта функция поместит другой вызов в очередь событий, используя after. Он выполнит работу, а затем запланирует повторный запуск через 100 мс, навсегда. Вы можете установить глобальный флажок, если хотите иметь возможность приостановить или отменить перерисовку.

Это выглядит примерно так:

def updateGraph(canvas):
    <do the work up updating the graph>
    canvas.after(100, updateGraph, canvas)
person Bryan Oakley    schedule 17.07.2015
comment
@SDilmac: я не знаю, в чем смысл вашего комментария. Да, можно сделать и так, но так, как я написал, тоже работает. - person Bryan Oakley; 25.07.2015
comment
Обновить с аргументом(ами) canvas.after(100, updateGraph, canvas) только функция, не допускается с аргументами - person dsgdfg; 25.07.2015
comment
@SDilmac: вы не правы. after абсолютно принимает дополнительные аргументы. - person Bryan Oakley; 25.07.2015