Как построить несколько раз из одного и того же ресурса - PullRequest
0 голосов
/ 27 июня 2019

У меня есть 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
...