Pango Error bei Gtk Projekt

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
Jinzo48
User
Beiträge: 1
Registriert: Donnerstag 11. August 2016, 16:51

Donnerstag 11. August 2016, 17:34

Moin moin,

Ich bin noch ein Neuling in Sachen Python und gtk, also wenn ihr mir helfen könnt versucht es so einfach wie möglich zu erklären.

Ich habe mir eine Visualisierung eines Sport- Steuergeräts auf dem Raspberry Pi geschrieben...

Eigentlich läuft alles super, doch nach wenigen Minuten ist die CPU des Pi am Anschlag und ich bekomme in der Console folgende Fehlermeldung:

Pango:ERROR:/usr/src/packages/BUILD/pango1.0-1.32.5/./pango/pango-layout.c:3939:pango_layout_check_lines: assertion failed: (end <= (layout->text + layout->length))

Ich kann damit nichts anfangen. Vielleicht hat hier jemand ne Idee wo das Programm an die Wand läuft.

Hier der Code:

Code: Alles auswählen

import pygtk
import gtk
import time
import threading
import serial
import array
import gc
#**********************************************************************************

gc.enable()
gtk.threads_init()

class Gui:

        
    def __init__(self):
#**********************************************************************************

        global start_window
        start_window = gtk.Window()
        wait = gtk.Image()
        wait.set_from_file("laden.jpg")
        start_window.add(wait)
        wait.show()
        start_window.show()


#**********************************************************************************


        # Create a window.
        global window
        window = gtk.Window()
        window.set_title("Archery Electronic")
        window.connect("destroy", gtk.main_quit)
#**********************************************************************************
        # Create a Fixed Container
        global fixed
   	fixed = gtk.Fixed()
   	window.add(fixed)
   	fixed.show()


        global label
        global leer
        global rot
        global gelb
        global gruen
        global ab
        global ab_rot
        global ab_gelb
        global ab_gruen
        global cd
        global cd_rot
        global cd_gelb
        global cd_gruen

        label = gtk.Label()
        label.set_markup('<span size="70000"> </span>')
        fixed.put(label,272,856)
        
        
        

class UART_Auswertung(threading.Thread):
    

#*************************************************************************************
    def run(self):
        leer = gtk.Image()
        leer.set_from_file("leer.jpg")
        fixed.put(leer,0,0)

        rot = gtk.Image()
        rot.set_from_file("rot.jpg")
        fixed.put(rot,0,0)

        gelb = gtk.Image()
        gelb.set_from_file("gelb.jpg")
        fixed.put(gelb,0,0)

        gruen = gtk.Image()
        gruen.set_from_file("gruen.jpg")
        fixed.put(gruen,0,0)
        


        ab = gtk.Image()
        ab.set_from_file("ab.jpg")
        fixed.put(ab,0,0)

        ab_rot = gtk.Image()
        ab_rot.set_from_file("ab_rot.jpg")
        fixed.put(ab_rot,0,0)

        ab_gelb = gtk.Image()
        ab_gelb.set_from_file("ab_gelb.jpg")
        fixed.put(ab_gelb,0,0)

        ab_gruen = gtk.Image()
        ab_gruen.set_from_file("ab_gruen.jpg")
        fixed.put(ab_gruen,0,0)
        


        cd = gtk.Image()
        cd.set_from_file("cd.jpg")
        fixed.put(cd,0,0)

        cd_rot = gtk.Image()
        cd_rot.set_from_file("cd_rot.jpg")
        fixed.put(cd_rot,0,0)

        cd_gelb = gtk.Image()
        cd_gelb.set_from_file("cd_gelb.jpg")
        fixed.put(cd_gelb,0,0)

        cd_gruen = gtk.Image()
        cd_gruen.set_from_file("cd_gruen.jpg")
        fixed.put(cd_gruen,0,0)
        
       
        
        

        
        start_window.destroy()
        leer.show()
        window.show()

        global zeit_buffer
        zeit_buffer = 0


#*************************************************************************************
        ser = serial.Serial(
              
        port='/dev/ttyAMA0',
        baudrate = 4800,
        parity=serial.PARITY_NONE,
        stopbits=serial.STOPBITS_ONE,
        bytesize=serial.EIGHTBITS,
        timeout=1
        )
        
        buffer = []
        while True:
            x = ser.read(3) 
            buffer.extend(list(x))
            data = buffer[:]
            del buffer[:]
        
            if data != [] :
                INT1 = ord(data[1])
                BIN1 = "{0:08b}".format(INT1)

                INT2 = ord(data[2])
                BIN2 = "{0:08b}".format(INT2)

                einer = INT1 & 15
                zehner = (INT1 & 240) >> 4
                hunderter = INT2 & 15

                zeit = (100*hunderter)+(10*zehner)+einer

                rotte = "aus"

                if BIN2[1] == "1" :
                        rotte = "AB"
                if BIN2[0] == "1" :
                        rotte = "CD"
                        
                
                
                ampel = "aus"

                if ((INT2 & 48) >> 4) == 3:
                        ampel = "ROT"
                if ((INT2 & 48) >> 4) == 2:
                        ampel = "GELB"
                if ((INT2 & 48) >> 4) == 1:
                        ampel = "GRUEN"

                label.hide()
                leer.hide()
                rot.hide()
                gelb.hide()
                gruen.hide()
                ab.hide()
                ab_rot.hide()
                ab_gelb.hide()
                ab_gruen.hide()
                cd.hide()
                cd_rot.hide()
                cd_gelb.hide()
                cd_gruen.hide()
                    


                if zeit_buffer != zeit:
                    
                    if rotte == "aus":

                        if ampel == "aus":
                            leer.show()

                        if ampel == "ROT":
                            rot.show()

                        if ampel == "GELB":
                            gelb.show()

                        if ampel == "GRUEN":
                            gruen.show()
                            

                    if rotte == "AB":

                        if ampel == "aus":
                            ab.show()
                            
                        if ampel == "ROT":
                            ab_rot.show()

                        if ampel == "GELB":
                            ab_gelb.show()
                            
                        if ampel == "GRUEN":
                            ab_gruen.show()


                            
                    if rotte == "CD":

                        if ampel == "aus":
                            cd.show()
                            
                        if ampel == "ROT":
                            cd_rot.show()
                            
                        if ampel == "GELB":
                            cd_gelb.show()
                            
                        if ampel == "GRUEN":
                            cd_gruen.show()

                    
                    

                    
                    if len(str(zeit)) == 3:
                        fixed.put(label,272,856)

                    if len(str(zeit)) == 2:
                        fixed.put(label,300,856)

                    if len(str(zeit)) == 1:
                        fixed.put(label,325,856)

                    
                    
                    
                    TEXT = "<span size=\"70000\">"+str(zeit)+"</span>"
                    label.set_markup(TEXT)
                    label.show()

                    
                    
#___________________________________________________________________
                if zeit_buffer == zeit:
                    
                    if rotte == "aus":

                        if ampel == "aus":
                            leer.show()

                        if ampel == "ROT":
                            rot.show()

                    if rotte == "AB":

                        if ampel == "aus":
                            ab.show()
                            
                        if ampel == "ROT":
                            ab_rot.show()

                    if rotte == "CD":

                        if ampel == "aus":
                            cd.show()
                            
                        if ampel == "ROT":
                            cd_rot.show()
                   
                zeit_buffer = zeit
                
#*************************************************************************************                        
            if data == []:
                print "Keine Daten vorhanden"
        

#*************************************************************************************
 
if __name__ == "__main__":
    
    Gui()
    fs = UART_Auswertung()
    fs.start()
    gtk.main()
Zuletzt geändert von Anonymous am Donnerstag 11. August 2016, 17:39, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

Donnerstag 11. August 2016, 18:05

Ich vermute das Problem beim Threading: Man darf auch bei Gtk wie bei vielen anderen GUI-Rahmenwerken nicht einfach aus anderen Threads ausser dem in dem die Hauptschleife läuft, zugreifen. Das muss man entweder über `threads_enter()`/`threads_leave()` (heissen glaube ich so) absichern, oder man muss den eigentlichen Aufruf zum Beispiel mit `add_idle()` (ebenfalls aus dem Kopf) in diesen Thread verlegen.

Dein gesamter Quelltext ist allerdings eine Katastrophe. Zwei Klassen die keine sind, sondern nur übermässig kompliziert geschriebene Funktionen. Unmengen an globalen Variablen, womit das dann noch nicht einmal richtige Funktionen sind. Programmlogik und GUI vermischt. Viele Code-Wiederholungen die sich nur minimal unterscheiden. Und dadurch eine `run()`-Methode die deutlich zu lang ist. Absolutes Positionieren von GUI-Elementen ist auch keine gute Idee.
Antworten