2011-12-14 2 views
0

정보가있는 테이블 (행 및 열 필드 포함)을 표시하는 wxListCtrl이 있습니다. 일반적으로 행은 마우스 버튼으로 클릭 할 때만 강조 표시됩니다. 그러나 그것을 클릭하지 않고 하이라이트를하고 싶습니다. 즉 마우스를 다른 행으로 이동하면 마우스를 클릭하지 않고 행이 강조 표시됩니다. 이것이 가능한가?MouseOver의 wx.ListCtrl에서 ListItem 강조 표시

######################################################################## 

수입 WX

수입 SYS,이 없다 "쉽게"상자 밖으로 이루어집니다

class MyForm(wx.Frame): 

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

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

    self.list_ctrl = wx.ListCtrl(panel, size=(-1,100), 
        style=wx.LC_REPORT 
        |wx.BORDER_SUNKEN 
        ) 
    self.list_ctrl.InsertColumn(0, 'Subject') 
    self.list_ctrl.InsertColumn(1, 'Due') 
    self.list_ctrl.InsertColumn(2, 'Location', width=125) 
    self.list_ctrl.Bind(wx.EVT_ENTER_WINDOW, self.onMouseOver) 
    self.list_ctrl.Bind(wx.EVT_LEAVE_WINDOW, self.onMouseLeave) 

    btn = wx.Button(panel, label="Add Line") 
    btn.Bind(wx.EVT_BUTTON, self.add_line) 

    sizer = wx.BoxSizer(wx.VERTICAL) 
    sizer.Add(self.list_ctrl, 0, wx.ALL|wx.EXPAND, 5) 
    sizer.Add(btn, 0, wx.ALL|wx.CENTER, 5) 
    panel.SetSizer(sizer) 


    bmp = wx.Image("icon.bmp", wx.BITMAP_TYPE_BMP).ConvertToBitmap() 
    il = wx.ImageList(16,16) 
    il.Add(bmp) 
    self.list_ctrl.AssignImageList(il,wx.IMAGE_LIST_SMALL)  
    line = "Line %s" % self.index 


    self.list_ctrl.InsertStringItem(self.index, line,-1) 
    self.list_ctrl.SetStringItem(self.index, 1, "01/19/2010") 
    self.list_ctrl.SetStringItem(self.index, 2, "USA") 
    self.index += 1  

    self.list_ctrl.InsertStringItem(self.index, line,-1) 
    self.list_ctrl.SetStringItem(self.index, 1, "01/19/2010") 
    self.list_ctrl.SetStringItem(self.index, 2, "USA") 
    #self.list_ctrl.SetItemBackgroundColour(self.index,wx.LIGHT_GREY) 
    self.index += 1 

    self.list_ctrl.InsertStringItem(self.index, line,-1) 
    self.list_ctrl.SetStringItem(self.index, 1, "01/19/2010") 
    self.list_ctrl.SetStringItem(self.index, 2, "USA") 

    self.index += 1    


#---------------------------------------------------------------------- 
def add_line(self, event): 
    if self.index > 0: 
     image = 1 
    else: 
     image = -1  
    line = "Line %s" % self.index 
    self.list_ctrl.InsertStringItem(self.index, line,image) 
    self.list_ctrl.SetStringItem(self.index, 1, "01/19/2010") 
    self.list_ctrl.SetStringItem(self.index, 2, "USA") 
    self.index += 1 

def onMouseOver(self, event): 
    print "mouse over" 
    for item in range(self.list_ctrl.GetItemCount()): 
     self.list_ctrl.SetItemBackgroundColour(item,wx.NullColor) 
    x = event.GetX() 
    y = event.GetY() 
    item, flags = self.list_ctrl.HitTest((x, y)) 
    self.list_ctrl.SetItemBackgroundColour(item,wx.RED) 
    #self.list_ctrl.RefreshItems(0,2) 
    event.Skip() 

def onMouseLeave(self, event): 
    print "mouse leave" 
    for item in range(self.list_ctrl.GetItemCount()): 
     self.list_ctrl.SetItemBackgroundColour(item,wx.NullColor) 
    #self.list_ctrl.RefreshItems(0,2) 
    event.Skip() 
'''   
def onMouseOver(self, event): #USED to display tooltip on items that cannot be selected 

    x = event.GetX() 
    y = event.GetY() 
    item, flags = self.list_ctrl.HitTest((x, y)) 
    color = self.list_ctrl.GetItemBackgroundColour(item) 
    if color == wx.NullColor: 

     self.list_ctrl.SetItemBackgroundColour(item,wx.RED) 
    elif color == wx.RED: 
     item = item - 1 
     color = self.list_ctrl.GetItemBackgroundColour(item) 
     self.list_ctrl.SetItemBackgroundColour(item,wx.Nu) 

'''  
#---------------------------------------------------------------------- 
# Run the program 
if __name__ == "__main__": 
    app = wx.App(False) 
    frame = MyForm() 
    frame.Show() 
    app.MainLoop()  
+0

다른 사람에게 도움이되기를 바랍니다. 마우스를 놓으면 빨간색에서 기본값으로 변경됩니다. – jellyDean

답변

0

glob에,하지만 당신은 땜질의 비트와 함께 그것을 할 수 있어야합니다.

mouseover 및 mouseout 이벤트 수신기를 wxListCtrl 개체에 추가 한 다음 mouseover 이벤트가 발생할 때마다 어떤 항목이 검색되는지 테스트해야합니다. 목록 항목의 좌표를 캐시 할 수는 있지만 목록 및 창 크기를 조정하면이 경로를 탐색 할 때 문제가 발생할 수 있습니다.

import wx 

class MyListCtrl(wx.ListCtrl): 
    def __init__(self, parent, id): 
     wx.ListCtrl.__init__(self, parent, id) 
     self.Bind(wx.EVT_ENTER_WINDOW, self.onMouseOver) 
     self.Bind(wx.EVT_LEAVE_WINDOW, self.onMouseLeave) 

    def onMouseOver(self, event): 
     #Loop through all items and set bgcolor to default, then: 
     item = self.HitTest(event.GetPosition()) 
     self.SetItemBackgroundColour(item, 'Green') 
     self.RefreshItems() 
     event.Skip() 

    def onMouseLeave(self, event): 
     #Loop through all items and set bgcolor to default, then: 
     self.RefreshItems() 
     event.Skip() 
+2

답변 해 주셔서 감사합니다. 네가 한 말을 구현했다. MouseEnter 및 MouseLeave는 마우스가 창을 오가며 이동하는 경우에만 유효합니다. 나는 항상 창문에서 메신저를 변경하는 동안 색상이 필요합니다. 커서가 파일 위에있을 때 윈도우 7과 같지만 선택하지 않았습니다. 위의 코드를 살펴보고 onMouseOver 함수를 주석 처리하십시오. – jellyDean

2

나는 배경색을 잡아 시도 할 것이다 :

일부 코드

당신은 (아마도 작동하지 않습니다 당신은 적절한 wx.Frame에 MyListCtrl를 추가해야 할 것, 테스트하지) 시작하기 당신이 ListCtrl을 만들고 변수에 퍼팅 많은 ListItems 하나 :

self.defaultItemColor = someListItem.GetBackgroundColour() 

그런 다음 다시 색상을 변경하는 것을 사용한다. 항목의 setter를 호출 한 후에 ListCtrl의 SetItem (listItem) 메서드를 호출해야하는 경우가 있습니다. 어떤 이유로 배경을 NullColour로 설정하면 ListCtrl이 작동하지 않습니다. 내 응용 프로그램 중 하나에 대해 어둡게 모드를 만들 때 다시 발견했습니다. 사실 여기에 대해 쓴 : http://www.blog.pythonlibrary.org/2011/11/05/wxpython-creating-a-dark-mode/

+0

예 좋습니다. 내가 끝낸 것은 항목 색인과 그 색의 사전을 만드는 것이 었습니다. 한 번 내가 완성 된 아픈 게시물 – jellyDean

0

내가이 늦은 응답이 있음을 알고 있지만 나를 위해 다음과 같은 작품을 사용 : self.listCtrl.Bind (wx.EVT_MOTION, self.onMouseOver) 및 초기 self.previous_item 설정 ~ -1

마우스로 행을 강조 표시하고 동시에 툴팁을 변경하는 데 사용하고 있습니다.

def onMouseOver(self, event): 
    x = event.GetX() 
    y = event.GetY() 
    self.item, flags = self.listCtrl.HitTest((x, y)) 
    if self.item < 0: 
     self.listCtrl.SetToolTipString("Colour codes Red - Loaded, Yellow - In Progress, Green - Finished, Blue - Invoiced, White - User defined") 
     return 
    if self.item != self.previous_item: 
     self.old_item = self.previous_item 
     self.previous_item = self.item 
    else: 
     return 
    bg_colour = self.listCtrl.GetItemBackgroundColour(self.item) 
    if bg_colour == wx.BLACK or bg_colour == wx.NullColour: 
     self.listCtrl.SetItemBackgroundColour(self.item,"#3246A8") 
     self.listCtrl.SetItemBackgroundColour(self.old_item,wx.BLACK) 
    elif bg_colour == "#3246A8": 
     self.listCtrl.SetItemBackgroundColour(self.item,wx.BLACK) 
    self.currentItem = self.item 
    rowid = self.listCtrl.GetItem(self.currentItem,13) 
    stat_test = rowid.GetText() 
    rowid = self.listCtrl.GetItem(self.currentItem,1) 
    file_test = rowid.GetText() 
    rowid = self.listCtrl.GetItem(self.currentItem,4) 
    running_test = rowid.GetText() 

    if stat_test == "0": 
     self.listCtrl.SetToolTipString("File currently playing\nRunning time "+running_test) 
    elif stat_test == "1": 
     self.listCtrl.SetToolTipString("In Progress\nRunning time "+running_test) 
    elif stat_test == "2": 
     self.listCtrl.SetToolTipString("Finished\nRunning time "+running_test) 
    elif stat_test == "3": 
     self.listCtrl.SetToolTipString("Invoiced\nRunning time "+running_test) 
    if file_test == self.file_playing and stat_test == "1": 
     self.listCtrl.SetToolTipString("File currently playing & In Progress\nRunning time "+running_test) 
    if file_test == self.file_playing and stat_test == "2": 
     self.listCtrl.SetToolTipString("File currently playing but Finished\nRunning time "+running_test) 
    if file_test == self.file_playing and stat_test == "3": 
     self.listCtrl.SetToolTipString("File currently playing but Invoiced\nRunning time "+running_test) 

가 나는 마우스가 끝나면 나의 가장 큰 문제는 빨간색으로 기본에서 색상을 변경하지 않는