【问题标题】:How to kill previously ran methods called by an event如何杀死事件调用的先前运行的方法
【发布时间】:2013-03-12 17:35:40
【问题描述】:

尊敬的社区成员,

下面是一个简单的 wx.app,只有一个文本控件。编辑此文本控件时,将启动一个大型进程。如果一个人慢慢地编辑控件,编辑感觉很正常。但是,如果人类是一个快速打字者,那么编辑器就会停滞不前。我认为解决方案是杀死函数 self.VeryLargeProcess() 的先前调用。

你是怎么做到的? 有没有更好的方法来做到这一点?

import wx

class MyFrame(wx.Frame):
    def __init__(self):
         wx.Frame.__init__(self, None, wx.ID_ANY, "My Frame")
         main_panel = wx.Panel(self)

        static_box = wx.StaticBox( main_panel, -1, "Text control" )
        static_box.SetFont( wx.Font( 15, wx.ROMAN, wx.NORMAL, wx.NORMAL ) )
        main_sizer = wx.StaticBoxSizer( static_box, wx.VERTICAL )

        text_ctrl = wx.TextCtrl( main_panel, wx.ID_ANY, "Edit me, a large process will start", wx.DefaultPosition, [200,100], wx.TE_MULTILINE )
        main_sizer.Add( text_ctrl, 0, wx.GROW|wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 )

        main_panel.SetSizer( main_sizer )
        main_sizer.SetSizeHints( self )

        self.Bind(wx.EVT_TEXT, self.VeryLargeProcess, text_ctrl)

    def VeryLargeProcess(self, event):

        # kill previous self.VeryLargeProcess()   

        for i in range(0, 3000000):
            a = i

if __name__ == '__main__':
    app = wx.App()
    frame = MyFrame()
    frame.Show()
    app.MainLoop()

【问题讨论】:

    标签: events wxpython wx.textctrl


    【解决方案1】:

    如果进程需要“很长时间”才能运行,那么您需要将该进程放在单独的线程中,否则您的 GUI 的响应速度会变慢或停止。 wxPython wiki 有一个很好的 article 介绍了使用线程的各种方法,我也写了一个 tutorial 来讨论这个主题。

    【讨论】:

    • 再次感谢您为我指明了正确的方向。添加到这些页面,我建议大家阅读:wiki.wxpython.org/LongRunningTasks 也特别了解:self._want_abort in class WorkerThread(Thread)的使用
    • 我先链接到那个页面。这绝对是一个很好的资源!
    猜你喜欢
    • 2015-11-14
    • 2020-03-20
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    相关资源
    最近更新 更多