目录 基本框架 组件 事件处理机制 GUI常用组件 按钮 菜单 菜单常用事件 静态文本和文本框 列表 单选与复选框 布局管理 sizer 使用sizer的步骤 其他GUI库 PyQt Tkinter – 每个sizer有自己的定位策略 开发者只需要选择合适策略的sizer将窗口组件放入,并且指定好需求即可 sizer sizer本身不是一个容器或一个窗口组件。 它只是一个屏幕布局的算法 sizer允许嵌套 wxPython常用的sizer – wx.BoxSizer(在一条线上布局子窗口部件) – wx.FlexGridSizer(行高和列宽由最大的组件决定 ) – wx.GridSizer(所有组件大小一致, 固定一个方向,在 另外一个方向生长) – wx.GridBagSizer 使用sizer的步骤 创建自动调用尺寸的容器,例如panel 创建sizer 创建子窗口(窗体组件) 使用sizer的Add()方法将每个子窗口添加给sizer 调用容器的SetSizer(sizer)方法 具体代码如下所示: import wx class Frame1
= wx.BoxSizer(wx.VERTICAL) sizer.Add(self.progress, 0, wx.EXPAND) self.SetSizer(sizer) btn = wx.Button(panel, label="Start Thread") btn.Bind(wx.EVT_BUTTON, self.onButton) sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(btn, 0, wx.ALL|wx.CENTER, 5) panel.SetSizer(sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(self.progress, 0, wx.EXPAND) self.SetSizer(sizer) = wx.BoxSizer(wx.VERTICAL) sizer.Add(btn, 0, wx.ALL|wx.CENTER, 5) panel.SetSizer(sizer
for the panel content self.sizer = wx.GridBagSizer(1, 1) self.sizer.Add(self.button, ( for the panel content self.sizer = wx.GridBagSizer(2, 2) self.sizer.Add(self.tittle, ( 1, 3)) self.sizer.Add(self.lblt, (3, 1)) self.sizer.Add(self.resultt, (3, 2)) self.sizer.Add (self.lbls, (4, 1)) self.sizer.Add(self.results, (4, 2)) self.SetSizer(self.sizer)class 1, 3)) self.sizer.Add(self.lblt, (3, 1)) self.sizer.Add(self.resultt, (3, 2)) self.sizer.Add
self.MaxSize = self.Size self.MinSize = self.Size panel = wx.Panel(self, -1) sizer = wx.BoxSizer(wx.HORIZONTAL) sizer1 = wx.BoxSizer(wx.VERTICAL) sizer3 = wx.BoxSizer( sizer.Add(sizer1, flag=wx.EXPAND | wx.ALL, border=20) sizer.Add(sizer3, flag=wx.EXPAND = wx.BoxSizer(wx.HORIZONTAL) sizer1 = wx.BoxSizer(wx.VERTICAL) sizer3 = wx.BoxSizer( sizer.Add(sizer1, flag=wx.EXPAND | wx.ALL, border=20) sizer.Add(sizer3, flag=wx.EXPAND
如果Sizer提供的机械系统模型能够匹配我们设计的机器系统,那么将负载参数输入到Sizer软件可以得到负载的转动惯量(具体可以参考:Sizer伺服驱动滚珠丝杠选型示例)。 图4 Sizer中常见机械系统 Sizer软件可以根据“梯形/三角形曲线”输入运行曲线的方式,通过指定运行距离,运行时间和加减速时间,由 Sizer 软件计算出运行速度和加减速度,如图5所示。 图5 Sizer运行曲线规划 对于不规则的运行曲线,Sizer也支持自定义曲线(根据时间间隔和速度),支持从Excel表格直接复制,如图6所示。 Sizer软件的下载地址、软件简介及选型示例如下: 1、Sizer软件的下载链接如下: https://support.industry.siemens.com/cs/document/54992004 /sizer-for-siemens-drives?
分级器(动态分级) wxPython工具包包括用于创建动态布局的sizer。它们为你管理小部件的位置,并在你调整应用程序窗口大小时对其进行调整。 其他GUI工具包将sizer称为布局,PyQt就是这样做的。 拳击手,并将其传递给wx.vertical,这是将小部件添加到sizer的方向。 在本例中,小部件将垂直添加,这意味着它们将依次从上到下逐个添加。 要将小部件添加到sizer,你将使用. add()。 wx.all标志告诉wxpython要在小部件的所有边上添加边框,而wx.expand使小部件在sizer中尽可能地展开。
Sizers 作为wx.Sizer 的子类,Sizer 能够被用来在 frame 或 window 中布置可见元素。 或者 sizer.AddMany(...) 来给出一个wx.Window 对象的列表,sizer 就能够布置它们. ,因为它的父 sizer self.sizer 是按照垂直线来布置元素的。 wx.Sizer 和它的子类有一个可能会让人感到困惑的地方,就是 sizer 和父窗口之间的区别。当你把一个对象添加到 sizer 里面时,不需要指定这个对象的父窗口。 一旦你完成可见元素的设置,并把它们加入到 sizer(或者嵌套的 sizer),下一步就是告诉 frame 或 window 来使用 sizer。
如果Sizer提供的机械系统模型能够匹配我们设计的机器系统,那么将负载参数输入到Sizer软件可以得到负载的转动惯量(具体可以参考:Sizer伺服驱动滚珠丝杠选型示例)。 图4 Sizer中常见机械系统 Sizer软件可以根据“梯形/三角形曲线”输入运行曲线的方式,通过指定运行距离,运行时间和加减速时间,由 Sizer 软件计算出运行速度和加减速度,如图5所示。 图5 Sizer运行曲线规划 对于不规则的运行曲线,Sizer也支持自定义曲线(根据时间间隔和速度),支持从Excel表格直接复制,如图6所示。 Sizer软件的下载地址、软件简介及选型示例如下: 1、Sizer软件的下载链接如下: https://support.industry.siemens.com/cs/document/54992004 /sizer-for-siemens-drives?
), 0, wx.ALL, 5) 42 43 self.main_sizer.Add(btn_sizer, 0, wx.CENTER) 44 45 self.SetSizer 接下来,你可以创建要使用的sizer和小部件。 (label, 0, wx.ALL, 5) 10 11 row_sizer.Add(text_ctrl, 1, wx.ALL | wx.EXPAND, 5) 12 13 self.main_sizer.Add (row_sizer, 0, wx.EXPAND) 14 add_widgets()接受标签的文本和文本控件实例。 通过将sizer彼此嵌套,可以设计复杂的应用程序。
= wx.BoxSizer (wx.HORIZONTAL ) self.sizer2 = wx.BoxSizer(wx.HORIZONTAL) self.sizer2. Add(encoderButton, 1, wx.EXPAND) self.sizer2.Add(decoderButton, 1, wx.EXPAND) self.sizer = wx.BoxSizer(wx.VERTICAL) self.sizer.Add(self.sizer0, 0, wx.EXPAND) self.sizer.Add( self.contents, 1, wx.EXPAND) self.sizer.Add(self.coder, 1, wx.EXPAND) self.sizer.Add( self.sizer2, 0, wx.EXPAND) self.SetSizer(self.sizer) self.SetAutoLayout(1) self.sizer.Fit
title='Hello World') # 创建面板 panel = wx.Panel(self) # 声明一个垂直尺寸的容器 my_sizer 上添加输入框 self.text_ctrl = wx.TextCtrl(panel) # 为该容器添输入框加组件,从左往右,从上到下,边框为5 my_sizer.Add # 为按钮绑定点击事件 close_btn.Bind(wx.EVT_BUTTON, self.on_close) # 为该容器添按钮组件 my_sizer.Add (my_btn, 0, wx.ALL | wx.CENTER, 5) my_sizer.Add(close_btn,0,wx.ALL | wx.CENTER, 5) # 设置主尺寸 panel.SetSizer(my_sizer) self.Show() # 为按钮添加一个事件 def on_press(self,
self.timer = wx.Timer(self) self.Bind(wx.EVT_TIMER, self.onUpdate, self.timer) sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(self.slider, 0, wx.ALL, 5) sizer.Add(self.toggle, 0, wx.ALL, 5) self.SetSizer(sizer) def onScroll(self, event): value = self.slider.GetValue ") self.toggle.Bind(wx.EVT_TOGGLEBUTTON, self.onToggle) self.running = False sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(self.slider, 0, wx.ALL, 5) sizer.Add(self.toggle,
__init__(None, title="动态布局") self.sizer = wx.BoxSizer(wx.VERTICAL) self.btn_add = wx.Button (self, label="添加") self.btn_add.Bind(wx.EVT_BUTTON, self.on_add) self.sizer.Add(self.btn_add wx.Button(self, label="删除") self.btn_delete.Bind(wx.EVT_BUTTON, self.on_delete) self.sizer.Add (self.btn_delete, 0, wx.ALL, 5) self.controls = [] self.SetSizer(self.sizer) def self, event): text_ctrl = wx.TextCtrl(self) self.controls.append(text_ctrl) self.sizer.Add
10)]; } } } } // 实物,苹果类 class Apple{ // 列 col; // 行 row; sizeR / 生成行坐标 this.row = Math.floor(Math.random() * (40 - 1) + 1); // 设置苹果半径 this.sizeR Red"; // 画苹果 context.beginPath(); // 圆心坐标 context.arc(this.col * this.sizeR * 2 + this.sizeR, this.row * this.sizeR * 2 + this.sizeR, this.sizeR, 0, Math.PI * 2, false);
class Solution { public: _int* l[10005*17]; _int* r[10005*17]; int sizel[10005*17]; int sizer ; } } return lena+lenb; } void pushup(int node) { sizer [node]=fun(node,r[node<<1],sizer[node<<1],r[node<<1|1],sizer[node<<1|1],node<<1|1,r[node]); sizel ; for(int i=0;i<len;i++) { int pos2 = upper_bound(r[node<<1],r[node<<1]+sizer _int{num[start]}; sizel[node]=1; r[node]=new _int{num[start]}; sizer
__init__(self, parent) self.sizer = wx.BoxSizer(wx.VERTICAL) self.text = wx.StaticText( __init__(self, parent) self.sizer = wx.BoxSizer(wx.VERTICAL) self.status = wx.StaticText self, -1, "This is the Second Page") self.gauge = wx.Gauge(self, -1, name="Guage") self.sizer.Add (self.status, 0, wx.ALIGN_CENTER | wx.ALL, 5) self.sizer.Add(self.gauge, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 10) self.SetSizer(self.sizer) self.gauge_pos
Sizer实例。 签名如下: def setsizer(self, sizer): 接受一个已实例化的Sizer def getsizer(self): 返回当前的Sizer实例 sizer是可以直接get self.sizer = self.p.sizer` 例如,这将允许在与cerebro调用发生在同一级别的Sizer并将其作为参数传递给系统中的所有策略,从而有效地实现共享Sizer Sizer开发 实际 Sizer 应用 在不考虑复杂的大小算法的情况下,可以使用两个不同的 Sizer 将策略从单向变为双向。只需在 cerebro 执行中更改 Sizer,策略就会改变行为。 bt.Sizer 参考 类 backtrader.Sizer() 这是Sizers的基类。
我还尝试过这样做,并且还将每个文本和输入配对放在一个Sizer中,结果更糟。有什么建议吗? __init__(self, None, wx.ID_ANY, "Tutorial") # create the main sizer self.mainSizer = wx.BoxSizer = wx.StaticText(self.panel, label=text, size=lblSize) txt = wx.TextCtrl(self.panel) sizer = wx.BoxSizer(wx.HORIZONTAL) sizer.Add(lbl, 0, wx.ALL|wx.ALIGN_LEFT, 5) sizer.Add(txt, 0, wx.ALL, 5) self.mainSizer.Add(sizer)# Run the programif __name__ == "__main__": app =
event to a function button.Bind(wx.EVT_BUTTON, self.on_click) # Set the layout sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(text, 0, wx.ALL, 5) sizer.Add(button, 0, wx.ALL, 5) panel.SetSizer(sizer) # Show the frame self.Show() def on_click(self, event
更多的时候,我们使用被称为布局管理器的 wx.Sizer 来实现动态布局。wx.Sizer 有很多种,我记不住,所以只喜欢用 wx.BoxSizer,最简单的一种布局管理器。 , 0) sizer_arrow.Add(sizer_arrow_mid, 0, wx.TOP|wx.BOTTOM, 1) sizer_arrow.Add(btn_down , 0, wx.ALIGN_CENTER|wx.ALL, 0) sizer_right = wx.BoxSizer(wx.VERTICAL) sizer_right.Add sizer_right.Add(tc, 1, wx.ALL, 10) sizer_max = wx.BoxSizer() sizer_max.Add(preview, 1, wx.EXPAND|wx.LEFT|wx.TOP|wx.BOTTOM, 5) sizer_max.Add(sizer_right, 0, wx.EXPAND|wx.ALL, 0)