У меня есть 2 кнопки для черчения, которые берут разные данные из одного и того же ресурса. Обработка занимает около 5 секунд. Чтобы иметь возможность нажать вторую кнопку в это время, я использую wx.lib.delayedresult .
До wx.lib.delayedresult , нажатие первой кнопки ---> обработка занимает 5 с (в течение этого времени я не мог нажать вторую кнопку) ---> РЕЗУЛЬТАТ 1. ---> нажатие второй кнопки ---> обработка 5 с ---> РЕЗУЛЬТАТ 2. Таким образом, ВСЕ занимает 10-11 секунд.
После wx.lib.delayedresult , нажатие первой кнопки ---> обработка занимает 5 с (в течение этого времени нажатие второй кнопки) ---> РЕЗУЛЬТАТ 1 ---> 5 с ---> РЕЗУЛЬТАТ 2. Итак, ВСЕ занимает 10-11 секунд.
То, что я хочу, нажмите первую кнопку ---> обработка 5 с (также нажмите вторую кнопку в это время) ---> РЕЗУЛЬТАТ 1 и РЕЗУЛЬТАТ 2. ВСЕ должно занять 5-6 секунд.
Это возможно только с wx.lib.delayedresult ? Или я должен использовать поток, очередь, обработку и т. Д.
Любое предложение будет с благодарностью.
Это небольшой пример wx.lib.delayedresult.
from time import sleep
import wx
from wx.lib.delayedresult import startWorker
class MainWindow(wx.Frame):
def __init__(self, *args, **kwargs):
wx.Frame.__init__(self, *args, **kwargs)
self.panel = wx.Panel(self)
self.startButton = wx.Button(self.panel, label="Long Task")
self.Button1 = wx.Button(self.panel, label="btn1")
self.Button2 = wx.Button(self.panel, label="btn2")
self.startButton.Bind(wx.EVT_BUTTON, self.OnStartButton)
self.Button1.Bind(wx.EVT_BUTTON, self.OnBtn)
self.Button2.Bind(wx.EVT_BUTTON, self.heyBtn)
self.windowSizer = wx.BoxSizer()
self.windowSizer.Add(self.panel, 1, wx.ALL | wx.EXPAND)
self.sizer = wx.BoxSizer(wx.VERTICAL)
self.sizer.Add(self.startButton)
self.sizer.Add(self.Button1)
self.sizer.Add(self.Button2)
self.sizer.Add((10, 10))
self.border = wx.BoxSizer()
self.border.Add(self.sizer, 1, wx.ALL | wx.EXPAND, 5)
self.panel.SetSizerAndFit(self.border)
self.SetSizerAndFit(self.windowSizer)
self.Show()
def OnStartButton(self, e):
self.startButton.Disable()
startWorker(self.LongTaskDone, self.LongTask)
def OnBtn(self, e):
hey(self).Show()
def heyBtn(self, event):
self.Button2.Disable()
startWorker(self.LongTaskDone_2, self.LongTask)
def LongTask_2(self):
print("LT 2")
sleep(5)
def LongTaskDone_2(self, result):
self.Button2.Enable()
print("ended 2")
def LongTask(self):
print("LT 1")
sleep(5)
print("hello")
def LongTaskDone(self, result):
print("ended 1")
self.startButton.Enable()
class hey(wx.Frame):
def __init__(self, *args, **kwds):
wx.Frame.__init__(self, *args, **kwds)
app = wx.App(False)
win = MainWindow(None)
app.MainLoop()
Ниже LongTask btn обрабатывает 5 с, btn1 - 5 с. ВСЕ вместе дает результат в 8-9 секунд. Как я могу получить все результаты за 5 секунд?
from time import sleep
import wx
import wx.lib.agw.aui as aui
from wx.lib.delayedresult import startWorker
import serial
import matplotlib.pyplot as plt
from matplotlib.pyplot import subplot
from matplotlib.figure import Figure
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
from matplotlib.backends.backend_wxagg import NavigationToolbar2WxAgg as NavigationToolbar
import threading
class MainWindow(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__ ( self, parent )
self.panel = wx.Panel(self)
self.startButton = wx.Button(self.panel, label="Long Task")
self.Button1 = wx.Button(self.panel, label="btn1")
self.startButton.Bind(wx.EVT_BUTTON, self.OnStartButton)
self.Button1.Bind(wx.EVT_BUTTON, self.OnBtn)
self.windowSizer = wx.BoxSizer()
self.windowSizer.Add(self.panel, 1, wx.ALL|wx.EXPAND )
self.sizer = wx.BoxSizer(wx.VERTICAL)
self.sizer.Add(self.startButton)
self.sizer.Add(self.Button1)
self.sizer.Add((10, 10))
self.border = wx.BoxSizer()
self.border.Add(self.sizer, 1, wx.ALL|wx.EXPAND , 5)
#in attached file
self.x=[50144.0.... #[1]
self.y=[11.0, ... #[1]
self.z=[111.3, ... #[1]
self.panel.SetSizerAndFit(self.border)
self.SetSizerAndFit(self.windowSizer)
self.panel2 = wx.Panel( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )
self.panel2.SetBackgroundColour( wx.SystemSettings.GetColour( wx.SYS_COLOUR_ACTIVECAPTION ) )
self.border.Add(self.panel2, 1, wx.ALL | wx.EXPAND, 5)
############################################ AUI windows
self._mgr = aui.AuiManager()
self._mgr.SetManagedWindow(self)
self._mgr.AddPane(self.panel, aui.AuiPaneInfo().Name("tb1").Caption("Toolbar").ToolbarPane().Right())
self._mgr.AddPane(self.panel2, aui.AuiPaneInfo().CenterPane().Caption("Sabit"))
self._mgr.SetDockSizeConstraint(0.3, 0.65) #(w,h)
self._mgr.Update()
############################################
def OnStartButton(self, e):
self.startButton.Disable()
##################################### aui-canvas
bSizer1 = wx.BoxSizer( wx.VERTICAL )
self.panel5 = wx.Panel( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )
bSizer14 = wx.BoxSizer( wx.VERTICAL )
self.figure2 = Figure((5,4), 85)
self.axes2 = self.figure2.add_subplot(111)
self.canvas2 = FigureCanvas(self.panel5, -1, self.figure2)
self.toolbar2 = NavigationToolbar(self.canvas2)
self.toolbar2.Realize()
bSizer14.Add(self.canvas2, 0, wx.ALL, 5 )
bSizer14.Add(self.toolbar2, 0, wx.ALL, 5 )
self.panel5.SetSizer( bSizer14 )
self.panel5.Layout()
bSizer14.Fit( self.panel5 )
bSizer1.Add( self.panel5, 1, wx.ALL, 5 )
self._mgr.AddPane(self.panel5, aui.AuiPaneInfo().Bottom().Caption("Start"))
self._mgr.Update()
##################################### aui
startWorker(self.LongTaskDone, self.LongTask)
def OnBtn(self, e):
##################################### aui-canvas
bSizer1 = wx.BoxSizer( wx.VERTICAL )
self.panel50 = wx.Panel( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )
bSizer14 = wx.BoxSizer( wx.VERTICAL )
self.figure20 = Figure((5,4), 85)
self.axes20 = self.figure20.add_subplot(111)
self.canvas20 = FigureCanvas(self.panel50, -1, self.figure20)
bSizer14.Add(self.canvas20, 0, wx.ALL, 5 )
self.panel50.SetSizer( bSizer14 )
self.panel50.Layout()
bSizer14.Fit( self.panel50 )
bSizer1.Add( self.panel50, 0, wx.ALL, 5 )
self._mgr.AddPane(self.panel50, aui.AuiPaneInfo().Bottom().Caption("Btn"))
self._mgr.Update()
##################################### aui-canvas
self.axes20.bar(self.x, self.z)
self.canvas20.draw()
def LongTask(self):
self.axes2.bar(self.x, self.y)
self.canvas2.draw()
def LongTaskDone(self, result):
print("ended 1")
self.startButton.Enable()
def thread():
thread1 = threading.Thread(target = OnStartButton)
thread2 = threading.Thread(target = OnBtn)
thread1.start()
thread2.start()
app = wx.App(False)
win = MainWindow(None)
win.Show(True)
app.MainLoop()
[1]: https://www.mediafire.com/file/yc2a52cyhvsu5hl/x-y-z.txt/file