【问题标题】:wxPython change mouse cursor to notify a long running operationwxPython 更改鼠标光标以通知长时间运行的操作
【发布时间】:2011-12-16 14:47:46
【问题描述】:

我正在构建一个 Python 程序来搜索远程网站上的内容。 有时操作需要几秒钟,我相信用户不会注意到状态栏消息“搜索操作进行中”。 因此,我想更改鼠标光标以突出显示程序仍在等待结果。

这是我正在使用的方法:

def OnButtonSearchClick( self, event ):
        """
        If there is text in the search text, launch a SearchOperation.
        """
        searched_value = self.m_search_text.GetValue()

        if not searched_value:
            return

        # clean eventual previous results
        self.EnableButtons(False)
        self.CleanSearchResults()

        operations.SearchOperation(self.m_frame, searched_value)

我尝试了两种不同的方法,都在最后一行之前:

  • wx.BeginBusyCursor()
  • self.m_frame.SetCursor(wx.StockCursor(wx.CURSOR_WAIT))

它们都不起作用。

我在 GNU/Linux 下使用 KDE。这在 Gnome 下也不起作用

有什么提示吗?谢谢

【问题讨论】:

  • SetStockCursor 应该可以工作。您是否尝试过任何其他默认光标?也许 CURSOR_WAIT 在您的特定 Linux 风格上不可用。
  • 我正在使用 SetCursor(wx.StockCursor(wx.CURSOR_WAIT)),抱歉​​打错了,我更正了问题。是的,我正在尝试其他游标,但都不起作用。
  • 焦点可能是个问题。您正在为定义事件处理程序的类以外的其他对象设置光标(self.m_frame 是什么?)它可能因平台而异,但您为其设置光标的 wx.Window 通常必须具有焦点,并且鼠标指针必须在它上面才能显示设置的光标。
  • self.m_frame 是 GUI 的 wx 框架。我没有直接为我的类继承 wx.Frame(我正在使用 XRC 并且更喜欢以这种方式工作)。当我尝试这段代码时,鼠标指针(显然)在框架上

标签: python wxpython mouse-cursor


【解决方案1】:

我向 wxPython 的开发者 Robin Dunn 询问了这个问题,看起来这应该可行,但没有。但是,如果您调用面板的 SetCursor(),它确实可以工作,或者我被告知。这是您可以尝试的示例:

import wx

########################################################################
class MyForm(wx.Frame):

    #----------------------------------------------------------------------
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Tutorial")

        # Add a self.panel so it looks the correct on all platforms
        self.panel = wx.Panel(self, wx.ID_ANY)

        btn = wx.Button(self.panel, label="Change Cursor")
        btn.Bind(wx.EVT_BUTTON, self.changeCursor)
        sizer = wx.BoxSizer(wx.HORIZONTAL)
        sizer.Add(btn)
        self.panel.SetSizer(sizer)

    #----------------------------------------------------------------------
    def changeCursor(self, event):
        """"""
        myCursor= wx.StockCursor(wx.CURSOR_WAIT)
        self.panel.SetCursor(myCursor)


#----------------------------------------------------------------------
# Run the program
if __name__ == "__main__":
    app = wx.PySimpleApp()
    frame = MyForm().Show()
    app.MainLoop()

【讨论】:

  • 我确认给出的示例有效。但是在我的程序中,如果我尝试使用面板而不是框架,则只有当光标聚焦在面板上而不是任何 wx 小部件上时,鼠标指针才会更改。因此,它适用于非常小的 GUI 区域。
  • 带有“小区域”,我的意思是大约占整个窗口的 5% :)
  • 我们在谈论什么样的小部件?如果这会出现问题,您可能想要查看使用 wx.BusyInfo 而不是使用鼠标光标。这里有一个例子:blog.pythonlibrary.org/2010/06/26/…
  • 谢谢你的链接,我试试看。为了更好的解释:i42.tinypic.com/5bibk.png 这是我的程序的截图。如果我使用 panel.SetCursor(myCursor),红色区域是光标更改的区域。如果鼠标将焦点放在 GUI 的任何其他区域,则光标不会改变
  • 值得指出的是,wxpython 4 wx.StockCursor 已被弃用,您应该改用 wx.Cursor。如果为面板设置光标,则只针对该面板,如果为self设置光标,则适用于整个应用程序。
猜你喜欢
  • 2010-11-16
  • 2018-12-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-28
  • 2017-10-30
  • 2012-09-22
  • 1970-01-01
  • 2010-09-27
相关资源
最近更新 更多