This application has requested the Runtimeo terminate it in

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
pPilger
User
Beiträge: 45
Registriert: Montag 8. Februar 2010, 17:30

Hallo,

ich habe ein kleines script, das in einem bestimmten intervall immer was tun soll.
Es macht ein Fenster auf. Dort kann man den Intervall starten und stoppen.
Funktioniert in meiner Entwicklungumgebung (ubuntu) prima.
Das script muss aber letztendlich auf einem WinXP laufen.
Dort bekomme ich folgende Fehlermeldung, wenn ich auf Start drücke:
This application has requested the Runtimeo terminate it in an unusual way.
Dann geht nix mehr. Was kann denn das sein.
Auf dem Linux habe ich:
Python 2.6.4 (r264:75706, Dec 7 2009, 18:45:15) [GCC 4.4.1] on linux2
Auf XP:
Python 2.6.4 (r264:75708, Oct 26 2009, 08:23:19) [MSC v.1500 32 bit (Intel)] on win32

Hier mein script:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""

"""

import threading
import time
import Tkinter
import sys
import string
import kinterbasdb
import types
import re
import datetime

def lets_rock( i,  meldung_1, meldung_2, meldung_3  ):
    print "lets_rock " + str( i )
    
    meldung_1.set( "Logging laeuft (%s)" % i )
    meldung_2.set(  "A" )
    meldung_3.set(  "B" )



class engine(threading.Thread):
    """   Simulierte Schrittmotorsteuerung    """
    
    def __init__(self, engine_message_1 = None, engine_message_2 = None, engine_message_3 = None ):
        print "engine_init"
        """
        switch = threading.Event
        engine_message = Rückgabe als Tkinter.StringVar, damit eine
                         Meldung in einem Label angezeigt werden kann.
        """
       
        threading.Thread.__init__(self)
        self.switch = threading.Event()
        self.engine_message_1 = engine_message_1
        self.engine_message_2 = engine_message_2
        self.engine_message_3 = engine_message_3
        self.canceled = False
        #self.interval = int ( db.po_logging_config_2[2] )
        self.interval = 4


    def run(self):
        """ Der Motor wird initialisiert.  Enthaelt die Steuerschleife.  """
       
        i = 0
       
        while True:
            # Hier wird darauf gewartet, dass der switch
            # eingeschaltet wird.
            self.switch.wait()
            if self.canceled:
                break
           
           
            i += 1
            lets_rock( i,  self.engine_message_1,   self.engine_message_2,   self.engine_message_3 )
           
            #if self.engine_message_1:
                #self.engine_message_1.set( "Logging laeuft (%s)" % i)
                #print "Logging laeuft (%s)" % i
            #else:
            print "Logging laeuft (%s)" % i
        
            time.sleep( self.interval )
   
   
    def engine_start(self):
        """ Schaltet den Motor ein """
        self.switch.set()


    def engine_stopp(self):
        """ Stoppt den Motor aus """
        print "stopp"
        self.switch.clear()
   

    def engine_aus(self):
        """ Schaltet den Motor aus """
        self.canceled = True
        print "close"
        self.switch.set()
   

class main_form(Tkinter.Tk):
    """ GUI """
   
    def _center(self, *args):
        """ Zentriert das Fenster """
        xpos = (self.winfo_screenwidth() - self.winfo_width()) / 2
        ypos = ((self.winfo_screenheight() - self.winfo_height()) / 2) / 100 * 90
        self.wm_geometry("+%d+%d" % (xpos,ypos))

   
    def engine_aus(self):
        """ Schaltet die Schleife aus und schliesst das Fenster """
        self.engine.engine_aus()
        self.destroy()


    def __init__(self):
        """ Anzeigen und initialisieren """
       
        # Init
        Tkinter.Tk.__init__(self)
        self.engine_message_1 = Tkinter.StringVar()
        self.engine_message_2 = Tkinter.StringVar()
        self.engine_message_3 = Tkinter.StringVar()
        self.title("Play-Out-Logging")
        
        # Engine initialisieren
        self.engine = engine(self.engine_message_1,  self.engine_message_2,  self.engine_message_3 )
        self.engine.start()
      
        # Fenster und Buttons
        self.config(bd = 10)
        
        # Label
        label_1 = Tkinter.Label(
            self,
            bg ="white", 
            textvariable = self.engine_message_1,
            bd = 2, 
            width = 120
        ).pack()
        
        label_2 = Tkinter.Label(
            self,
            bg ="white", 
            textvariable = self.engine_message_2,
            bd = 2, 
            width = 120
        ).pack()
        
        label_3 = Tkinter.Label(
            self,
            bg ="white", 
            textvariable = self.engine_message_3,
            bd = 2, 
            width = 120
        ).pack()
        
        frame = Tkinter.Frame(self)
        frame.pack()
        
        Tkinter.Button(
            frame,
            text = "Start",
            command = self.engine.engine_start,
            bd = 2
        ).grid(row = 2, column = 0)

        Tkinter.Button(
            frame,
            text = "Stopp",
            command = self.engine.engine_stopp,
            bd = 2
        ).grid(row = 2, column = 1)
       
        # Aus
        Tkinter.Button(
            frame,
            text = "Close",
            command = self.engine_aus,
            bd = 2
        ).grid(row = 2, column = 2)
        
        
        # Warten bis das Fenster zentriert wird und dann anzeigen
        self._center()
        self.wait_visibility()


if __name__ == "__main__":
    print "lets_work"
    fenster = main_form()
    Tkinter.mainloop()
    print "lets_lay_down"
    sys.exit(0)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Man greift halt nicht aus einem Thread direkt auf die GUI zu ;-) Benutze dazu Queues, Events und die after-Methode von Tkinter.
Das Leben ist wie ein Tennisball.
pPilger
User
Beiträge: 45
Registriert: Montag 8. Februar 2010, 17:30

EyDu hat geschrieben:Hallo.

Man greift halt nicht aus einem Thread direkt auf die GUI zu ;-) Benutze dazu Queues, Events und die after-Methode von Tkinter.
Hallo,

das ist mein erster Versuch mit Python und GUI.
Ich habe damit noch keine Erfahrungen. Kannst Du mir einen Deiner Vorschläge etwas genauer erklären, oder ein Beispiel-Schnipselchen vorschlagen.
Soweit ich Dich verstehe geht es um den Aufruf von lets_rock diesem Abschnitt!?
Danke!

Code: Alles auswählen

def run(self):
        """ Der Motor wird initialisiert.  Enthaelt die Steuerschleife.  """
       
        i = 0
       
        while True:
            # Hier wird darauf gewartet, dass der switch
            # eingeschaltet wird.
            self.switch.wait()
            if self.canceled:
                break
           
            # Statt einer Schrittmotor-Aansteuerung wird hier einfach
            # ein Text an die Variable "engine_message" uebergeben.
            # Statt mit einer Tkinter.StringVar könnte man natürlich
            # auch mit print etwas anzeigen lassen.
           
            i += 1
            lets_rock( i,  self.engine_message_1,   self.engine_message_2,   self.engine_message_3 )
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Genau um die Stelle geht es. Suche im Forum einfach mal nach "tkinter threads", dein Problem hatten schon eine ganze Menge anderer Leute.
Das Leben ist wie ein Tennisball.
Antworten