gpt4 book ai didi

python - 并排放置两个 wx 网格

转载 作者:太空宇宙 更新时间:2023-11-03 19:18:23 25 4
gpt4 key购买 nike

我正在使用 python 2.7 和最新版本的 wxpython。

我需要并排放置 2 个网格,并且能够动态添加行。理想情况下,网格的大小应该动态增长,但暂时“足够大”的大小应该是可以的。

我应该如何更改(并简化)我的代码才能实现这一点?

class MatricesFrame(wx.BoxSizer):        
def __init__(self, parentPanel):
super(MatricesFrame, self).__init__(wx.HORIZONTAL)

self.outputsMatrix = self.addEmptyGrid(parentPanel)
self.inputsMatrix = self.addEmptyGrid(parentPanel)

addRowsButton = wx.Button(parentPanel, -1, " Add Rows")
addRowsButton.Bind(wx.EVT_BUTTON, self.addRows)
self.Add(addRowsButton)

def initResize(self, ev = None):
self.inputsMatrix.SetSize((500, 500))
self.outputsMatrix.SetSize((500, 500))

def addEmptyGrid(self, parentPanel):
panel_ = wx.Panel(parentPanel)
sizer_ = wx.BoxSizer(wx.VERTICAL)
panel_.SetSizer(sizer_)
panel_.SetSize((500, 500))
matrix_ = wx.grid.Grid(panel_)
matrix_.SetRowLabelSize(0)
matrix_.SetColLabelSize(0)
matrix_.CreateGrid(1,1)
sizer_.Add(matrix_)
self.Add(panel_)
return matrix_

def addRows(self, ev=None):
self.inputsMatrix.AppendRows(1)
self.outputsMatrix.AppendRows(1)

class TestFrame(wx.Frame):
def __init__(self, parent):
super(TestFrame, self).__init__(parent, title='test', size=(1280, 950))
panel = wx.Panel(self)
box = wx.BoxSizer(wx.VERTICAL)
self.matricesFrame = MatricesFrame(panel)
box.Add(self.matricesFrame)
panel.SetSizer(box)
self.matricesFrame.initResize()
self.Centre()
self.Show()
self.matricesFrame.initResize()
wx.EVT_IDLE(wx.GetApp(), wx.WakeUpIdle())

def main():
app = wx.App(False)
t= TestFrame(None)
app.MainLoop()

if __name__ == '__main__':
main()

最佳答案

对于初学者来说,如果您将自定义 Sizer 转换为自定义面板,我认为这会使您的代码更容易控制。看看我想出了什么

class MatricesPanel(wx.Panel):        
def __init__(self, parent):
super(MatricesPanel, self).__init__(parent)

sizer = wx.BoxSizer(wx.HORIZONTAL)

self.outputsMatrix = self.addEmptyGrid(sizer)
self.inputsMatrix = self.addEmptyGrid(sizer)

addRowsButton = wx.Button(self, -1, " Add Rows")
addRowsButton.Bind(wx.EVT_BUTTON, self.addRows)
sizer.Add(addRowsButton)

self.SetSizer(sizer)
self.SetAutoLayout(True)
self.Layout()

def initResize(self, ev = None):
self.inputsMatrix.SetSize((500, 500))
self.outputsMatrix.SetSize((500, 500))
self.Layout()

def addEmptyGrid(self, sizer):
matrix_ = wx.grid.Grid(self)
matrix_.SetRowLabelSize(0)
matrix_.SetColLabelSize(0)
matrix_.CreateGrid(1,1)
sizer.Add(matrix_)
return matrix_

def addRows(self, ev=None):
self.inputsMatrix.AppendRows(1)
self.outputsMatrix.AppendRows(1)
self.Layout() #refresh the frame

使用面板而不是 Sizer 可以大大简化“addEmptyGrid”方法,现在您可以尝试使用面板的大小而不是矩阵本身的大小来设置矩阵的大小。此外,如果您想添加滚动条(如果您添加很多行),这还允许您灵活地从 wx.Panel 更改为 wx.lib.scrolledpanel.ScrolledPanel。

然后您可以按如下方式初始化新面板:

class TestFrame(wx.Frame):
def __init__(self, parent):
super(TestFrame, self).__init__(parent, title='test', size=(1280, 950))
self.matricesPanel = MatricesPanel(self)

sizer = wx.BoxSizer()
sizer.Add(self.matricesPanel, flag=wx.EXPAND)
self.SetSizer(sizer)

self.Centre()
self.Show()
self.matricesPanel.initResize()

wx.EVT_IDLE(wx.GetApp(), wx.WakeUpIdle())

最后,据我所知,网格中的列具有固定宽度,因此您的matrix.SetSize((500, 500)) 调用并没有做太多事情。如果您能找到一种方法来设置列的宽度,那么我建议您重写 initResize() 以相对于面板的宽度设置宽度。

关于python - 并排放置两个 wx 网格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10603904/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com