name.cla() per button auslösen funktioniert nicht?!?! HILFE!!!

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
spiky
User
Beiträge: 3
Registriert: Sonntag 20. März 2016, 18:32

hallo forumsnutzer,
könntet ihr mir als programmierneuling bei diesem kleinen problem helfen?

es geht um das löschen eines angezeigten plots in einem pyplot in einem gtk window. ich habe dafür das programm versucht, von so vielen unnötigen parametern zu befreien wie möglich, damit ihr das programm leichter überblicken könnt.

der befehl zum löschen eines pyplotgraphen heißt ja soviel ich weiß: name.cla() (CLear Axis)

zum einfachen ausprobieren habe ich den befehl innerhalb der __init__ umgebung direkt ausprobiert und es funktioniert. auch nach den show()-befehl löscht cla() den gezeichneten graphen. wenn ich aber das löschen des graphen erst durch einen button auslösen will, dann funktioniert es komischerweise nicht und es wird auch keine fehlermeldung gezeigt. im folgenden das möglichst verkleinerte program.

der befehl cla() ist an beiden stellen (in der ___init__ umgebung zum ausprobieren, und in der funktion des buttons) auskommentiert. Ihr könnt ihn dann an beiden stellen leicht ausprobieren

könnt ihr mir bei meinem anfängerroblem helfen?
vielen dank
Spiky

code:

Code: Alles auswählen

import pygtk
import gtk
import numpy as np
import pylab as plt
from matplotlib import *
from matplotlib.figure import Figure as MPL_FIG
from matplotlib.backends.backend_gtkagg import FigureCanvasGTKAgg as FigureCanvas
from matplotlib.backends.backend_gtkagg import NavigationToolbar2GTKAgg as NavigationToolbar
from matplotlib.backend_bases import key_press_handler
class lookylooky():
    def delete(self, widget, event=None):
        gtk.main_quit()
        return False
        
    def look_at_file(self,widget):
        print 'hallo flummi'
         #self.timeplot_axes.cla()
        
    def __init__(self):
        window=gtk.Window(gtk.WINDOW_TOPLEVEL)
        window.set_size_request(800,600) #sice in x-richtung und in y-richtung
        window.connect('delete_event', self.delete)
        table=gtk.Table(2,2,True) #schritte nach unten und schritte nach oben
        window.add(table)
        
        button_load=gtk.Button('clean')
        button_load.connect('clicked', self.look_at_file)
        table.attach(button_load, 1,2,1,2) #der butten geht von position 9 bis 10 (x-koordinate) und von position 0 bis 1 (y-koordinate)
        button_load.show()
        self.timeplot_fig = MPL_FIG(figsize=(5,4), dpi=100)
        self.timeplot_axes = self.timeplot_fig.add_subplot(111)
        self.timeplot_channel = np.arange(0.0,3.0,0.01)
        self.timeplot_signal = np.sin(2*np.pi*self.timeplot_channel)
        self.timeplot_axes.plot(self.timeplot_channel,self.timeplot_signal, 'r')
        
        self.timeplot_plot = FigureCanvas(self.timeplot_fig)
        self.timeplot_toolbar = NavigationToolbar(self.timeplot_plot, table)
        
        table.attach(self.timeplot_plot, 0,1,0,1)
        self.timeplot_plot.show()
        
        table.show()
        window.show()
        #self.timeplot_axes.cla()
        
def main():
    gtk.main()
    return 0
horst=lookylooky()
main()
Zuletzt geändert von Anonymous am Sonntag 20. März 2016, 18:46, insgesamt 1-mal geändert.
Grund: Quelltext in Code-Tags gesetzt.
BlackJack

@spiky: Das löscht nur intern die Axis-Daten, man muss sie danach auch noch neu zeichnen indem man auf dem `FigureCanvas`-Objekt `draw()` aufruft. Statt der recht kryptischen Abkürzung `cla()` würde ich die `clear()`-Methode verwenden, dann hat der Leser auch ein Chance den Code zu verstehen ohne `cla()` nachschlagen zu müssen. Und wo wir gerade bei Namen sind: Für die Zeile ``horst=lookylooky()`` sollte man Dich für alle Ewigkeit zum schreiben und *lesen* von Perl-Programmen verdammen. :twisted:

Wirf mal einen Blick in den Style Guide for Python Code.

Die `__init__()` ist üblicherweise die erste Methode in einer Klasse damit man nicht erst weiter unten suchen muss welche Attribute es gibt.

Das so viele Attribute mit dem Präfix `timeplot_*` anfangen, könnte man als Zeichen sehen, dass man das in eine eigene Klasse herausziehen könnte.
spiky
User
Beiträge: 3
Registriert: Sonntag 20. März 2016, 18:32

Hallo BlackJack,

vielen dank, wenn ich die funktion die der button um den ausdruck "self.timeplot_plot.draw()" erweitere, dann funktioniert es tatsächlich. also:

def look_at_file(self,widget):
print 'hallo flummi'
self.timeplot_axes.cla()
self.timeplot_plot.draw()

was ich aber noch nicht verstehe ist, warum dieser zusatz innerhalb der __init__ umgebung nicht benötigt wird?!?! warum muss hier nich auch der .draw()-befehl ausgeführt werden?

grüße
spiky
BlackJack

@spiky: Wie gesagt muss die Zeichnung auch ausgeführt werden und in der `__init__()` passiert das ja noch nicht, sondern erst wenn Du die GUI-Hauptschleife aufrufst und die GUI auch tatsächlich das erste mal angezeigt und damit auch der Plot tatsächlich gezeichnet wird.
spiky
User
Beiträge: 3
Registriert: Sonntag 20. März 2016, 18:32

ok, vielen dank für die schnelle hilfe. das is ja wirklich sehr hilfreich hier!

grüße
spiky
Antworten