【问题标题】:wxPython layout of gui panelsgui面板的wxPython布局
【发布时间】:2018-07-03 22:19:12
【问题描述】:

我正在尝试使用以下布局创建一个 gui:

顶部面板将包含三个数字,三个中间面板将包含文本框,底部面板将包含一些按钮

这是我目前所拥有的:

import wx
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
from matplotlib.figure import Figure
from mpl_toolkits.mplot3d import Axes3D
import gui_functions as gf

class MainWindow(wx.Frame):
    def __init__(self, parent, id, title = "Test GUI"):
        wx.Frame.__init__(self, parent, wx.ID_ANY, title = "MyTitle", size=(1200,1000))

        self.graphicsPanel = wx.Panel(self,-1,style=wx.CLIP_CHILDREN)
        self.textPanel = wx.Panel(self)
        self.buttonsPanel = wx.Panel(self)

        self.graphicsPanel.figure = Figure()
        self.graphicsPanel.canvas = FigureCanvas(self.graphicsPanel, -1, self.graphicsPanel.figure)

        self.axeshandleA = self.graphicsPanel.figure.add_subplot(131, projection='3d',facecolor='#f3f3f3')
        self.axeshandleB = self.graphicsPanel.figure.add_subplot(132, projection='3d',facecolor='#f3f3f3')
        self.axeshandleC = self.graphicsPanel.figure.add_subplot(133, projection='3d',facecolor='#f3f3f3')






if __name__ == '__main__':
    app = wx.App(False)
    app.frame = MainWindow(None, wx.ID_ANY)
    app.frame.Show()

    app.MainLoop()

我假设我需要从三个面板开始,我必须以某种方式垂直对齐。

我正在考虑在中间面板中然后我需要添加三个额外的面板并将它们水平对齐

我的大脑正在思考如何在 HTML 和 CSS 中构建 div 框。

我的第一个问题是我不知道如何让面板 a) 填充父级和 b) 垂直对齐。

其次,我正在使用 Spyder。为什么每次调用 gui 后我都必须启动一个新控制台?如果我不这样做,那么我会收到错误

必须先创建 wx.App 对象!

我真的很感激任何帮助,因为我被困住了!非常感谢

我正在运行 wxPython 4.0.0rc1.dev3617+346e3b7 和 Python 3.5.4

【问题讨论】:

  • 使用wxglade
  • 我已经接近尾声了,我只需要弄清楚如何设置按钮的间距和大小,所以我在buttonsPanel 左侧有一个,中间一个,右侧一个。我有点明白了,但是按钮很大!当我弄清楚时,我会发布我的答案
  • wxformbuilder 非常适合快速构建 UI github.com/wxFormBuilder/wxFormBuilder

标签: python wxpython


【解决方案1】:

经过大量的工作和胡思乱想,我现在有了这个 GUI:

按钮仍然比我想要的宽,但我不知道如何使它们变窄。

我使用的代码是

import wx
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
from matplotlib.figure import Figure
from mpl_toolkits.mplot3d import Axes3D

class MainWindow(wx.Frame):
    def __init__(self, parent, id, title = "Test GUI"):
        wx.Frame.__init__(self, parent, wx.ID_ANY, title = "MyTitle", size=(1200,1000))

        self.graphicsPanel = wx.Panel(self,-1,style=wx.CLIP_CHILDREN)
        self.graphicsPanel.SetBackgroundColour('#3aafbb')
        self.textPanel = wx.Panel(self)
        self.textPanel.SetBackgroundColour('#ffaf33')
        self.buttonsPanel = wx.Panel(self)
        self.buttonsPanel.SetBackgroundColour('#489e3e')

        self.graphicsPanel.figure = Figure()
        self.graphicsPanel.canvas = FigureCanvas(self.graphicsPanel, 1, self.graphicsPanel.figure)

        main_sizer = wx.BoxSizer(wx.VERTICAL)

        main_sizer.Add(self.graphicsPanel, 3, wx.EXPAND, border = 20)
        main_sizer.Add(self.textPanel, 6, wx.EXPAND, border = 20)
        main_sizer.Add(self.buttonsPanel, 1, wx.EXPAND, border = 20)

        self.SetSizer(main_sizer)
        self.Maximize(True)

        self.axeshandleA = self.graphicsPanel.figure.add_subplot(131, projection='3d',facecolor='#f3f3f3')
        self.axeshandleB = self.graphicsPanel.figure.add_subplot(132, projection='3d',facecolor='#f3f3f3')
        self.axeshandleC = self.graphicsPanel.figure.add_subplot(133, projection='3d',facecolor='#f3f3f3')

        self.graphicsPanel_sizer = wx.BoxSizer()
        self.graphicsPanel_sizer.Add(self.graphicsPanel.canvas, 1, wx.EXPAND|wx.LEFT|wx.RIGHT|wx.TOP|wx.BOTTOM, border=10)
        self.graphicsPanel.SetSizerAndFit(self.graphicsPanel_sizer)


        self.textPanelR = wx.Panel(self.textPanel)
        self.textPanelR.SetBackgroundColour('#f2c4f5')
        self.textPanelA = wx.Panel(self.textPanel)
        self.textPanelA.SetBackgroundColour('#86478a')
        self.textPanelC = wx.Panel(self.textPanel)
        self.textPanelC.SetBackgroundColour('#e11fee')

        self.textPanel_sizer = wx.BoxSizer(wx.HORIZONTAL)
        self.textPanel_sizer.Add(self.textPanelR, 1, wx.EXPAND|wx.LEFT|wx.RIGHT|wx.TOP|wx.BOTTOM, border=20)
        self.textPanel_sizer.Add(self.textPanelA, 1, wx.EXPAND|wx.LEFT|wx.RIGHT|wx.TOP|wx.BOTTOM, border=20)
        self.textPanel_sizer.Add(self.textPanelC, 1, wx.EXPAND|wx.LEFT|wx.RIGHT|wx.TOP|wx.BOTTOM, border=20)
        self.textPanel.SetSizerAndFit(self.textPanel_sizer)


        self.backBtn = wx.Button(self.buttonsPanel,label='<<BACK',style=wx.BU_EXACTFIT, size=(50,30))
        self.backBtn.Bind(wx.EVT_BUTTON, self.backBtnClicked)

        self.exitBtn = wx.Button(self.buttonsPanel,label='EXIT',style=wx.BU_EXACTFIT, size=(50,30))
        self.exitBtn.Bind(wx.EVT_BUTTON, self.exitBtnClicked)

        self.nextBtn = wx.Button(self.buttonsPanel,label='NEXT>>',style=wx.BU_EXACTFIT, size=(50,30))
        self.nextBtn.Bind(wx.EVT_BUTTON, self.nextBtnClicked)

        self.buttonsPanel_sizer = wx.BoxSizer(wx.HORIZONTAL)
        self.buttonsPanel_sizer.Add(self.backBtn, 1, wx.CENTER|wx.LEFT|wx.RIGHT, border=20)
        self.buttonsPanel_sizer.Add(self.exitBtn, 1, wx.CENTER|wx.LEFT|wx.RIGHT, border=20)
        self.buttonsPanel_sizer.Add(self.nextBtn, 1, wx.CENTER|wx.LEFT|wx.RIGHT, border=20)
        self.buttonsPanel.SetSizer(self.buttonsPanel_sizer)







    def backBtnClicked(self, event):
        print("Back Button")

    def nextBtnClicked(self, event):
        print("Next Button")

    def exitBtnClicked(self, event):
        print("Exit Button")









if __name__ == '__main__':
    app = wx.App(False)
    app.frame = MainWindow(None, wx.ID_ANY)
    app.frame.Show()

    app.MainLoop()

我怀疑它是否尽可能高效,但它似乎主要做我想做的事。我们将不胜感激地收到任何进一步的建议或建议。

【讨论】:

  • 将按钮添加到buttonsPanel_sizer时,不要使用比例=1,使用0,它们不会拉伸。此外,为buttonsPanel_sizer 中的按钮添加一个wx.ALIGN_CENTER_HORIZONTAL 标志。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-10
  • 2020-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-14
  • 1970-01-01
相关资源
最近更新 更多