Ich habe eine App, die Daten von einem SQL-Server abruft. Ich füge einen Fortschrittsbalken ein, um den Fortschritt anzuzeigen.wxpython: schließende Anwendung schließt die Fortschrittsleiste nicht
Das Problem ist jedoch, dass, wenn ich versuche, die Anwendung zu schließen, indem Sie auf das "x" in der oberen rechten Ecke des Anwendungsfensters klicken, wird das Hauptfenster der Anwendung geschlossen, aber der Fortschrittsbalken wird weiter ausgeführt Die Arbeit mit dem SQL-Server ist abgeschlossen.
Ich frage mich, ob es eine Möglichkeit gibt, alles zu beenden, wenn Sie auf "x" klicken. Ein Beispielcode (minus der Teil, der den Datenabruf von SQL-Server der Fall ist) ist unten:
import wx, pyodbc
class App(wx.Frame):
def __init__(self, parent, title):
super(App, self).__init__(parent, title=title, size=(600, 400))
#-----------------------------------------------------------
self.Bind(wx.EVT_CLOSE, self.OnExit) # ADDED
#-----------------------------------------------------------
p = wx.Panel(self)
nb = wx.Notebook(p)
self.Panel1 = PanelMaker(nb, 'Foo')
nb.AddPage(self.Panel1, "Foo")
sizer = wx.BoxSizer()
sizer.Add(nb, 1, wx.EXPAND)
p.SetSizer(sizer)
self.Centre()
#-----------------------------------------------------------
def OnExit(self, evt): #ADDED
self.Destroy()
#self.Close() #I tried self.Close(), but I could not even
#close the application window when using it.
#-----------------------------------------------------------
class ProgressBar(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent, title="In progress...", size=(300, 90), style = wx.FRAME_FLOAT_ON_PARENT)
GridBagSizer = wx.GridBagSizer()
self.gauge = wx.Gauge(self, range = 100, size = (-1, 30), style = wx.GA_HORIZONTAL, name = 'In Progress')
self.gauge.SetValue(0)
txt = wx.StaticText(self, label = 'Hamsters are working very hard to move data', style = wx.ALIGN_CENTER)
GridBagSizer.Add(self.gauge, pos = (0, 0), span = (1, 1), flag = wx.EXPAND|wx.ALL, border = 15)
GridBagSizer.Add(txt, pos = (1, 0), span = (1, 1), flag = wx.ALL, border = 15)
self.SetSizer(GridBagSizer)
self.Layout()
def Update(self, step):
self.gauge.SetValue(step)
if step == 100:
self.Close()
class PanelMaker(wx.Panel):
def __init__(self, parent, tool):
wx.Panel.__init__(self, parent = parent)
Panel1Sizer = wx.GridBagSizer(0, 10)
ProceedButton = wx.Button(self, label = tool, size = (-1, -1))
ProceedButton.Bind(wx.EVT_BUTTON, self.OnProceedButton)
Panel1Sizer.Add(ProceedButton, pos = (7, 0), span = (1, 1), flag = wx.EXPAND|wx.LEFT, border = 12)
Panel1Sizer.Layout()
self.SetSizer(Panel1Sizer)
def OnProceedButton(self, evt):
Progbar = ProgressBar(self.GetParent())
Progbar.Show()
connection = pyodbc.connect(DRIVER = '{SQL Server}',
SERVER = ServerName,
DATABASE = DatabaseName,
Trusted_Connection = True)
cursor = connection.cursor()
for i in range(100):
#retrieve data from the SQL server.......
wx.Yield()
Progbar.Update(i+1)
#Closing SQL connection
cursor.close()
del cursor
connection.close()
ich Änderungen basierend auf Ihren Vorschlag, aber immer noch das gleiche passiert: die wichtigsten app Fenster geschlossen werden kann, aber die Der Fortschrittsbalken wird fortgesetzt, bis der SQL-Prozess abgeschlossen ist. Können Sie meinem Beispielcode etwas mehr Details oder eine umfassendere Bearbeitung geben? Vielen Dank! – Alex
Ich würde das Schließen des Verbindungscodes auch der OnExit-Funktion hinzufügen, bevor die self.Destroy() –