我有一个带有网格的wxPython GUI。在创建网格之前,我无法预测网格的确切大小。我的问题是当用户点击要编辑的单元格时,网格滚动条的显示方式。特别明显的是,网格只有一行,偶尔会发生;如果选择要编辑的单元格,则会弹出滚动条,使您无法看到该行。我不希望用户必须在网格内滚动(在我的GUI中,网格在wx.ScrolledWindow中)。
我需要在网格外面有一些按钮和方向,所以让网格对象“独立”对我来说不是一个好选择。
以下是代码:
class Spacing(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, wx.ID_ANY, "Fix spacing")
self.panel = wx.ScrolledWindow(self)
self.InitUI()
def InitUI(self):
label = wx.StaticText(self.panel,label="hello")#, size=(500, 50))
grid = self.make_table(1, 5)
vbox = wx.BoxSizer(wx.VERTICAL)
vbox.Add(label, flag=wx.ALL, border=10)
vbox.Add(grid, flag=wx.BOTTOM|wx.EXPAND, border=20)
hbox_all= wx.BoxSizer(wx.HORIZONTAL)
hbox_all.AddSpacer(20)
hbox_all.AddSpacer(vbox)
hbox_all.AddSpacer(20)
self.panel.SetSizer(hbox_all)
self.panel.SetScrollbars(20, 20, 50, 50)
hbox_all.Fit(self)
self.Show()
def make_table(self, n_cols, n_rows):
grid = wx.grid.Grid(self.panel, -1)
grid.ClearGrid()
grid.CreateGrid(n_cols, n_rows)
for n in range(n_cols):
for num in range(n_rows):
grid.SetCellValue(n, num, (str(num) + str(n)))
return grid
if __name__ == "__main__":
app = wx.PySimpleApp()
app.frame = Spacing()
app.frame.Show()
app.frame.Center()
app.MainLoop()
我可以想象一些选择。一,如果我可以在网格窗口中添加一些“填充”,用户仍然可以看到他们正在编辑的内容,无论如何。二,如果我可以覆盖网格的滚动窗口性质,那也可以。我没想到 如何做其中任何一个,我愿意接受其他建议。我已经尝试搞乱禁用grid.SetAutoLayout并手动调整网格大小,但这些都没有证明有效。我真的很感激任何建议!
我设计的(非常)hack-y解决方案是确保容器窗口中的另一个窗口小于网格,并将网格设置为wx.EXPAND,这可以防止水平滚动条从来弹出。
也就是说,我替换了这行代码:
label = wx.StaticText(self.panel,label="hello")
用这个:
label = wx.StaticText(self.panel,label="hello", size=(500, 50))
和这一行:
vbox.Add(grid, flag=wx.BOTTOM, border=20)
用这个:
vbox.Add(grid, flag=wx.BOTTOM|wx.EXPAND, border=20)
此选项看起来有点奇怪,但它不会模糊用户输入的内容。显然这不是一个好的解决方案,但我无法弄清楚如何实际解决问题。
更新
如果我使用设定的间距创建网格,则不会重新调整大小:
grid = wx.grid.Grid(self.panel, -1, size = (500, 300))
但是如果我创建网格然后尝试重新调整它的大小,它就不会“坚持”并且我有与以前相同的令人反感的行为。事实上,grid.SetSize看起来似乎并没有在视觉上工作,即使我调用grid.GetSize()它报告的是我指定的大小。
grid.SetSize(wx.Size(500, 300))