ich habe ein Problem und komme einfach nicht weiter, bzw. hab viel probiert und nichts hilft. Folgendes:
In meinem Programm benutze ich EditorShellNotebook aus wx.py.editor. Dieses Notebook ist in eine wxApp eingebettet und ermöglicht es kleine Prozeduren zu schreiben die mittels einer entwickelten API (C-Types DLL) auf diversen intelligenten elektronischen devices (IED) "abgespielt" werden können. Das Ausführen kann direkt im Mainthread erfolgen, oder halt im Editor, bzw. der Shell des Notebooks.
Bei Letzterem hängt meine GUI, trotz Verlagerung des Prozeduraufrufes in einen eigenen Thread. Erst wenn die Prozedur durchgelaufen ist, besteht wieder die Möglichkeit andere Aktionen über die GUI zu initiieren, leider. Ich versuche jetzt schon seit Längerem diesen Zustand zu ändern, nichts hilft.
Vieleicht kann mir hier jemand erklären, warum trotz eigenem Threads die Oberfläche hängt? Und was wäre eine geeignete Variante Abhilfe zu schaffen?
Nachfolgend der Code:
Code: Alles auswählen
#Threadfunction
def thread_func(self):
#Funktion ausfuehren in der Shell
cmd = "result=" + self.editscript.test_reference + "()"
wx.CallAfter(self.editzone.shell.push, cmd, False)
#Ergebnis auswerten
cmd = "erg=_get_function_result(result)"
wx.CallAfter(self.editzone.shell.push, cmd, False)
#Ergebnis ausgeben
outline = 'print " |--- Prozedureergebnis ---| "'
wx.CallAfter(self.editzone.shell.push, outline, False)
outline = 'print erg'
wx.CallAfter(self.editzone.shell.push, outline, False)
#SERVER delete
wx.CallAfter(self.editzone.shell.push, 'del server', False)
#Aufruffunktion
#Ausführen OK
def OnButton4Button(self, event):
#...
(erfolg, py_code) = self.get_python_code(self.sourcecode_filter())
if erfolg:
#Servername
server_name = self.comboBox1.GetValue()
#Notebook page
self.editzone.SetSelection(1)
#Shell page
self.editzone.shell.setFocus()
#Funktion lesen
self.editzone.shell.Execute(py_code)
#Shell commands
#Server erzeugen
cmd = "server=gl_get_server('" + server_name + "')"
self.editzone.shell.push( cmd, False)
#ScriptThread
#self.script_thread = KThread(target=self.thread_func)
# Thread starten
#self.script_thread.start()
start_new_thread(self.thread_func, ())
#Script function existiert
self.script_function_exists = True
else:
dlg = wx.MessageDialog(self, py_code,'Fehler', wx.OK | wx.ICON_INFORMATION)
try:
dlg.ShowModal()
finally:
dlg.Destroy()
else:
#...