2015-12-04 5 views
0

Я заметил, что в строке состояния появляется строка справки, когда я нажимаю на инструменты на панели инструментов. Я не могу найти способ сделать это с помощью текстовых кнопок.wxPython - настройка строки справки для кнопки на панели инструментов

Моя создание панель похожа на

# Make Tool Bar 
toolbar = self.CreateToolBar() 
# Make Tool Bar Items 
# Play 
self.addBasicTool(toolbar, "Play", 
        "This is my help string", 
        stuff.image_play, 
        self.OnPlay) 
# My Button 
btn = wx.Button(toolbar, wx.ID_OPEN, label="TEXT BUTTON ") 
btn.Bind(wx.EVT_BUTTON, self.OnButtonPress) 
toolbar.AddControl(btn) 

addBasicTool просто принимает изображение, масштабирует его до необходимого размера, создает инструмент с AddBasicTool и связывает инструмент для обработчика.

def addBasicTool(self, toolbar, label, desc, imgPath, handler): 
    icon_width=stuff.toolbar_icon_w 
    icon_height=stuff.toolbar_icon_h 
    size = (icon_width, icon_height) 
    img = wx.Image(imgPath, wx.BITMAP_TYPE_ANY).\ 
        Scale(*size).ConvertToBitmap() 
    tool = toolbar.AddSimpleTool(-1, img, label, desc) 
    self.Bind(wx.EVT_MENU, handler, tool) 

Для инструмента вспомогательная строка установлена ​​довольно прямолинейно. Я не могу найти ничего, чтобы сделать то же самое с помощью кнопки.

Эта кнопка может просто оказаться наполнителем, пока я не получу значок для нее, но мне все еще интересно, как можно выполнить вспомогательные строки. Я мог бы иметь обработчик, который устанавливает statusBar, когда мышь над кнопкой, но я чувствую, что это уже сделано где-то. Спасибо за помощь

ответ

1

В основном вам придется поймать мышь, когда она перемещается по вашим кнопкам и соответствующим образом обновляет строку состояния. Это не очень сложно. Вам просто нужно привязать к wx.EVT_MOTION. Вот простой пример:

import wx 

######################################################################## 
class MyPanel(wx.Panel): 
    """""" 

    #---------------------------------------------------------------------- 
    def __init__(self, parent): 
     """Constructor""" 
     wx.Panel.__init__(self, parent) 
     self.frame = parent 

     test_btn = wx.Button(self, label='Test Button') 
     test_btn.Bind(wx.EVT_MOTION, self.updateStatusBar) 

     test_btn_2 = wx.Button(self, label='Test Button') 
     test_btn_2.Bind(wx.EVT_MOTION, self.updateStatusBar) 

     self.buttons = {test_btn: 'Test help string', 
         test_btn_2: 'Another string'} 

     main_sizer = wx.BoxSizer(wx.VERTICAL) 
     main_sizer.Add(test_btn, 0, wx.ALL, 5) 
     main_sizer.Add(test_btn_2, 0, wx.ALL, 5) 
     self.SetSizer(main_sizer) 

    #---------------------------------------------------------------------- 
    def updateStatusBar(self, event): 
     """""" 
     btn = event.GetEventObject() 
     if btn in self.buttons: 
      status = self.buttons[btn] 
      self.frame.sb.SetStatusText(status) 



######################################################################## 
class MyFrame(wx.Frame): 
    """""" 

    #---------------------------------------------------------------------- 
    def __init__(self): 
     """Constructor""" 
     wx.Frame.__init__(self, None, title='Test Help Strings') 
     panel = MyPanel(self) 
     self.sb = self.CreateStatusBar() 
     self.Show() 

if __name__ == '__main__': 
    app = wx.App(False) 
    frame = MyFrame() 
    app.MainLoop() 
+0

Спасибо, это полезно. Я знал, что это может быть реализовано таким образом (я все же должен попробовать это), но я подумал, что что-то вроде этого может быть уже частью wxPython. Теперь я не буду чувствовать, что я просто переписываю код (несмотря на то, что вы передали его мне). Еще раз спасибо – Shatnerz

+0

Я не думаю, что вспомогательная строка встроена в другие стандартные виджеты, так что это, вероятно, путь –