- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在学习 wxPython,我正在尝试编写一个学生信息管理器。我已经编写 CLI 程序多年,所以我没有太多制作 GUI 的经验。
首先,我为我的 UI 绘制了蓝图。
然后,我尝试在 wxPython 中实现它,但 sizer 真的让我抓狂。我以前从未使用过任何类型的 sizer! (Visual Basic 是我学的第一门语言^__^)
最后,我写了这段代码:
import wx
from wx.lib import sheet
class Sheet(sheet.CSheet):
def __init__(self, parent, row, col):
sheet.CSheet.__init__(self, parent)
self.row = self.col = 0
self.SetNumberRows(row)
self.SetNumberCols(col)
for i in range(row):
self.SetRowSize(i, 20)
class ChartPanel(wx.Panel):
'''This is the panel for the chart, but the still working on it. '''
def __init__(self, parent):
wx.Panel.__init__(self, parent)
class MainPanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
sizer = wx.GridBagSizer(5, 5)
# However, just put the chart into main frame.
chart = ChartPanel(self)
chart.SetBackgroundColour("blue")
Students = Sheet(self, 5, 2)
History = Sheet(self, 2, 2)
button1 = wx.Button(self, label="Button #1")
button2 = wx.Button(self, label="Button #2")
button3 = wx.Button(self, label="Button #3")
sizer.Add(Students, pos=(0, 0), span=(5, 2), flag=wx.EXPAND)
sizer.Add(History, pos=(0, 2), span=(2, 2), flag=wx.EXPAND)
sizer.Add(chart, pos=(2, 2), span=(3, 2), flag=wx.EXPAND)
sizer.Add(button1, pos=(5, 0), span=(1, 1))
sizer.Add(button2, pos=(5, 1), span=(1, 1))
sizer.Add(button3, pos=(5, 2), span=(1, 1))
sizer.AddGrowableCol(5)
sizer.AddGrowableRow(5)
self.SetSizer(sizer)
self.Fit()
class MainFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, title="BoxSizer Example")
panel = MainPanel(self)
self.Show()
if __name__ == "__main__":
app = wx.App(False)
frame = MainFrame()
app.MainLoop()
但是这个程序很丑而且有错误。有人可以教我如何巧妙地使用 sizer,并帮助我修改代码吗?
非常感谢!
最佳答案
首先,我必须删除您的 AddGrowableColumn()
和 AddGrowableRow()
行,因为它们给我错误。我读了documentation对于这些功能,我认为您不想调用它们(但只有您知道您希望 UI 的外观)。
您实际上似乎非常了解 sizer。问题是 MainPanel
不知道 MainFrame
的大小,因此您的 UI 的一部分被截断了。解决这个问题非常简单,您有两个选择。
选项 1
在 MainFrame.__init__()
中,将 panel
放在一个 sizer 中。这将允许 sizer 根据 MainFrame
的大小设置 panel
的大小。现在它们的大小之间没有联系。更改将如下所示:
class MainFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, title="BoxSizer Example")
panel = MainPanel(self)
sizer = wx.BoxSizer(wx.HORIZONTAL)
sizer.Add(panel)
self.SetSizer(sizer) #this allows panel and MainFrame to influence each other's sizes
self.Show()
self.Fit()
选项 2MainFrame
中只有 1 个对象,一个 MainPanel
。那么为什么不将这两个类合二为一呢?只需将 MainPane1
中的所有代码添加到 MainFrame
中,然后删除 MainPanel
。重要的部分是 MainPanel.__init__()
调用 SetSizer()
。如果将该代码移动到 MainFrame.__init__()
中,那么您仍然完全按照我在选项 1 中的建议进行操作,但您少了一节课。看起来像这样:
class MainFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, title="BoxSizer Example")
sizer = wx.GridBagSizer(5, 5)
# However, just put the chart into main frame.
chart = ChartPanel(self)
chart.SetBackgroundColour("blue")
Students = Sheet(self, 5, 2)
History = Sheet(self, 2, 2)
button1 = wx.Button(self, label="Button #1")
button2 = wx.Button(self, label="Button #2")
button3 = wx.Button(self, label="Button #3")
sizer.Add(Students, pos=(0, 0), span=(5, 2), flag=wx.EXPAND)
sizer.Add(History, pos=(0, 2), span=(2, 2), flag=wx.EXPAND)
sizer.Add(chart, pos=(2, 2), span=(3, 2), flag=wx.EXPAND)
sizer.Add(button1, pos=(5, 0), span=(1, 1))
sizer.Add(button2, pos=(5, 1), span=(1, 1))
sizer.Add(button3, pos=(5, 2), span=(1, 1))
#I removed these lines because they gave me errors and I don't understand why you needed them
#sizer.AddGrowableCol(5)
#sizer.AddGrowableRow(5)
self.SetSizer(sizer)
self.Fit()
self.Show()
最后,我不喜欢使用wx.GridBagSizer
。我更喜欢使用嵌套的 wx.BoxSizer
对象。我发现我获得了更多的控制权,它使我能够仅从代码中直观地看到我的 UI 的外观,因为我将 UI 分成更小的 block 。但是,这是个人喜好问题,您应该使用您理解并习惯的任何方法。查看您的蓝图,我看到有两列。所以首先我们需要一个 sizer 来处理这些列。然后,每一列可以分成两行。这些按钮还需要一个 sizer 来固定它们。代码如下所示:
def __init__(self, parent):
wx.Panel.__init__(self, parent)
mainSizer = wx.BoxSizer(wx.HORIZONTAL) #this will make the columns
rightSizer = wx.BoxSizer(wx.VERTICAL) #this will be the rows on the right
# However, just put the chart into main frame.
chart = ChartPanel(self)
chart.SetBackgroundColour("blue")
History = Sheet(self, 2, 2)
rightSizer.Add(History, 1, wx.EXPAND)
rightSizer.Add(chart, 1, wx.EXPAND)
leftSizer = wx.BoxSizer(wx.VERTICAL) #this will be the rows on the left
Students = Sheet(self, 5, 2)
buttonSizer = wx.BoxSizer(wx.HORIZONTAL) #this will organize the buttons
button1 = wx.Button(self, label="Button #1")
button2 = wx.Button(self, label="Button #2")
button3 = wx.Button(self, label="Button #3")
buttonSizer.Add(button1)
buttonSizer.Add(button2)
buttonSizer.Add(button3)
leftSizer.Add(Students, 1, wx.EXPAND)
leftSizer.Add(buttonSizer)
mainSizer.Add(leftSizer, 1, wx.EXPAND)
mainSizer.Add(rightSizer, 1, wx.EXPAND)
self.SetSizer(mainSizer)
self.Fit()
关于python - wxPython:sizers,网格让我发疯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12221251/
您能否建议如何在 Bootstrap 或 IE 兼容的 CSS 网格中,在没有 CSS 网格的情况下进行以下布局。 在大屏幕中 头部,左侧堆叠的 body 和右侧覆盖头部和 body 高度的图像。 [
我想在 Objective-C 中绘制一个 15*15 的网格。格子颜色是蓝色的,就像在诺基亚制作“贪吃蛇”游戏的棋盘一样。 我试过使用 for 循环来创建 subview ,但它似乎不起作用,我查看
我正在尝试将 CSS 网格与 grid-template-columns: repeat(auto-fill, auto) 一起使用,单元格被设置为最大宽度,导致每行一个元素。 p> 是否可以让元素宽
我正在努力在网格的自定义列上添加一个指向网站的简单、简单的链接。我用了 Inchoo blog为列添加自定义渲染器,它可以工作。我认为只需修改渲染并添加标签就足够了。但我的希望破灭了,行不通。 如何做
使用 Gnuplot 我绘制了下图 - 现在,正如您在图像中看到的那样,很难在线条之间识别出其末端的块。所以我想用不同的颜色或样式交替着色网格。 我现在用来给网格着色的代码是 - set style
假设我有一个非常简单的 WPF 网格(6 行 x 6 列),定义如下:
我有一个希望绑定(bind)到 WPF 网格的集合。 我面临的问题是列数是动态的并且取决于集合。这是一个简单的模型: public interface IRows { string Messa
我正在使用 Vaadin 8,我想制作某种混淆矩阵。我想知道是否可以根据单元格位置而不是数据提供者手动填充表格/网格的值。 referenceTable.addColumn(reference ->
我在 http://jsfiddle.net/TsRJy/ 上创建了一个带有 div 框的网格. 问题 我不知道如何使 a:hover 工作。 信息 重写 HTML 代码,因为表格不适合我。 http
银光处女在这里。如何使网格周围的用户控件自动调整大小以适应内部网格宽度?目前,当浏览器窗口更宽时,用户控件的显示尺寸约为 300 或 400 像素。它在数据网格周围呈现垂直和水平滚动条,这很丑陋。我想
这个问题已经有答案了: Equal width columns in CSS Grid (11 个回答) 已关闭 2 年前。 使用 CSS Grid,当您不知道会有多少个子项时,如何将所有子项保留在一
我想使用 CSS Grid 的 grid-template-areas。 但问题是我正在使用的 CMS 添加了大量额外的包装器。有没有办法忽略额外的包装?因为它弄乱了漂亮的网格区域...... 我正在
在我的Grid中,当我单击“操作”按钮(下面的代码中显示的“删除和编辑”按钮)时,我需要弹出一个窗口,而不用警告消息提醒用户; 在下面的代码中,我正在使用HANDLER handler: button
这个问题已经有答案了: Equal width columns in CSS Grid (11 个回答) 已关闭 2 年前。 使用 CSS Grid,当您不知道会有多少个子项时,如何将所有子项保留在一
我需要模拟一个仓库,其中有几辆自动驾驶车辆在给定的布局上移动,并具有简单的优先级规则。根据我的理解,这个问题可以通过离散事件模拟(DES)轻松解决,我会使用 SimPy为了这。 我看到的问题是,我似乎
在 ASP.NET 中,我可以让用户控件在页面上的表格中占据多个单元格: 用户控件1: foo bar 第1页: 并且自动调整列宽以适应最大的用户控件。 这也可以在 WPF
我正在寻找一种方法来实时搜索我的网格+要过滤的复选框。我有一个包含学生的网格(照片和姓名)。我想要的是有一个复选框,可以过滤学生所在的不同类(class)。还有一个搜索栏,我可以在其中输入学生姓名。
我正在使用 jQuery 和 jQuery UI 构建一个 Web 应用程序。我陷入了僵局。我需要的是一个 jQuery 网格,它具有可编辑字段,并以某种方式在这些可编辑单元格之一上合并一个自动完成字
我想知道是否有其他 JavaScript 组件可以提供具有多个分组的网格表示。下面是jqGrid的截图我扩展了允许该功能,但它需要获取所有数据。我希望在扩展分组时加载数据。 另一个修改后的 jqGri
我一直在为我将在此处描述的 CSS 问题而烦恼: 在下面的示例 ( https://codesandbox.io/s/jjq4km89y5 ) 中,您可以看到一个可滚动的内容(紫色背景)和一个被左侧面
我是一名优秀的程序员,十分优秀!