如何让 wxPython Ultimate List Control 中的箭头正确滚动?

问题描述 投票:0回答:1

我有一个带有两列的终极列表控件。如果我选择一个项目并使用箭头键,焦点会相应改变。如果我使用箭头键选择当前可见区域上方或下方的项目,则控件不会像我预期的那样向上或向下滚动。相反,它会抛出以下错误:

TypeError: _ScrolledWindowBase.Scroll(): arguments did not match any overloaded call:
  overload 1: argument 2 has unexpected type 'float'
  overload 2: argument 1 has unexpected type 'int'

(当我们在这里时,如果有一种方法可以让列接受整数并按数字排序,我有兴趣了解它。)

我查看了文档,但未能找到可以应用的内容。我对如何调用 _ScrolledWindowBase.Scroll() 没有很好的理解(任何理解?)。我完全迷失了。

这是面板的代码。谢谢!

###called from MainFrame parent
###displays monsters and CRs
###features View button to call MonsterDialog
class MainPanel(wx.Panel, listmix.ColumnSorterMixin):
    def __init__(self, parent):
        super().__init__(parent)
            ###create main and top sizers
            mainSizer = wx.BoxSizer(wx.VERTICAL)
            topSizer = wx.BoxSizer(wx.HORIZONTAL)
    
            ###create list control and add to sizer
            self.listCtrl = ULC.UltimateListCtrl(self, -1, agwStyle = ULC.ULC_REPORT )
            self.listCtrl.InsertColumn(0, "Monster")
            self.listCtrl.InsertColumn(1, "CR", width = 30)
            topSizer.Add(self.listCtrl, 1, wx.ALL | wx.EXPAND, 5)
    
            #self.listCtrl.Bind(wx.EVT_SET_FOCUS, self.OnSetFocus)
    
            ###get monster data, populate list control, create monster dictionary
            self.monsterDict = {}
            index = 0
            self.monsterPath = os.getcwd()+'/monsters'
            self.refSheet = self.monsterPath + "/refSheet.txt"
            f = open(self.refSheet, "r")
            self.itemDataMap = {}
            for line in f.readlines():
                #(display, CR, monster)
                (d, c, m) = line.split(":")
                self.monsterDict[index] = [m.strip(), d]
                self.listCtrl.InsertStringItem(index, d)
                if len(c) == 1:
                    c = '0'+c
                    self.listCtrl.SetStringItem(index, 1, c)
                    self.itemDataMap[(d,c)] = [d,c]
                    self.listCtrl.SetItemData(index, (d,c))
                    index+=1
            f.close()
    
            ###set width of clumns and control
            self.listCtrl.SetColumnWidth(0, -1)
            self.listCtrl.SetColumnWidth(1, 50)
            _s = self.listCtrl
            _size = (sum([_s.GetColumnWidth(i) for i in range(_s.GetColumnCount())]), -1)
            self.listCtrl.SetMaxSize(_size)
            self.listCtrl.SetMinSize(_size)
            self.listCtrl.PostSizeEventToParent()
    
            ###make columns sortable
            listmix.ColumnSorterMixin.__init__(self, 2)
            self.Bind(wx.EVT_LIST_COL_CLICK, self.OnColClick, self.listCtrl)
            
            ###this is an empty widget for space to be replaced later
            empty = wx.TextCtrl(self, -1, size = _size)
            empty.SetMinSize(_size)
            empty.SetMaxSize(_size)
            topSizer.Add(empty, 1, wx.ALL | wx.EXPAND, 5)

            mainSizer.Add(topSizer, 1, wx.ALL | wx.CENTER, 0)

            ###create button to open dialog relevant to selected monster
            viewButton = wx.Button(self, label = 'View')
            viewButton.Bind(wx.EVT_BUTTON, self.onView)
            mainSizer.Add(viewButton, 0, wx.ALL | wx.CENTER, 5)
            self.SetSizer(mainSizer)

            ###window width = size of widgets + 10 per widget + 10 per sizer + 6 for window border
            winWidth = 36+_size[0]*2
            self.Parent.SetSize(-1, -1, winWidth, 250)
            self.Parent.SetMinSize((winWidth, -1))

    def onView(self, event):
        selection = self.listCtrl.GetFocusedItem()
        fileName = self.monsterDict[selection][0]
        filePath = self.monsterPath + '/' + fileName
        dlg = MonsterDialog(fileName, filePath)
        dlg.ShowModal()
        dlg.Destroy()

    def onViewTest(self, event):
        selection = self.listCtrl.GetFocusedItem()
        fileName = self.monsterDict[selection][0]
        filePath = self.monsterPath + '/' + fileName

    #def OnSetFocus(self, event):
    #   pass
    #   #print (self.listCtrl.GetFocusedItem())


    def GetListCtrl(self):
        return self.listCtrl

    def OnColClick(self, event):
        pass
python wxpython
1个回答
0
投票

在 agwStyle 变量中包含 ULC.ULC_HAS_VARIABLE_ROW_HEIGHT 已解决了该问题。该行现在显示为:

self.listCtrl = ULC.UltimateListCtrl(self, -1, agwStyle = ULC.ULC_REPORT | ULC.ULC_HAS_VARIABLE_ROW_HEIGHT )
© www.soinside.com 2019 - 2024. All rights reserved.