【问题标题】:Splitting bottom window in wxpython vertically垂直拆分wxpython中的底部窗口
【发布时间】:2018-03-08 01:20:10
【问题描述】:

我正在尝试使用wx.SplitterWindow 将我的主窗口分成三部分:一个顶部窗口和两个底部窗口(底部窗口是左下和右下)。

编辑

这是我所拥有的和正在经历的:

from __future__ import print_function
from numpy import arange, sin, pi
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
from matplotlib.backends.backend_wx import NavigationToolbar2Wx
from matplotlib.figure import Figure
import wxmplot
import wx
import os

class topPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        #self.SetBackgroundColour("red")

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

    def plotWaves(self,parent):
        self.figureWave = Figure()
        self.axes = self.figureWave.add_subplot(111,aspect='equal')
        self.canvas = FigureCanvas(self, -1, self.figureWave)
        t = [ 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]
        s = [0.0, 1.0, 0.0, 1.0, 0.0, 2.0, 1.0, 2.0, 1.0, 0.0]
        self.axes.plot(t, s)
        self.sizerWave = wx.BoxSizer(wx.HORIZONTAL)
        self.sizerWave.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW)
        self.SetSizer(self.sizerWave)
        self.Fit()

########################################################################

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

    def plotMAW(self,parent):

        self.figureMAW = Figure()
        self.axes = self.figureMAW.add_subplot(111,aspect='equal')
        self.canvas = FigureCanvas(self, -1, self.figureMAW)
        #self.axes.plot(self.waves)
        t = [ 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]
        s = [0.0, 1.0, 0.0, 1.0, 0.0, 2.0, 1.0, 2.0, 1.0, 0.0]
        self.axes.plot(t, s)
        self.sizerMAW = wx.BoxSizer(wx.HORIZONTAL)
        self.sizerMAW.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW)
        self.SetSizer(self.sizerMAW)
        self.Fit()


########################################################################

### SETUP GUI HERE
 class myGUI(wx.Frame):
    def __init__(self):
        self.main = wx.Frame.__init__(self, None, wx.ID_ANY, "myGUI", size=(850,500))

        # DEFINE A SPLIT WINDOW FOR PLOTTING
        self.splitWin = wx.SplitterWindow(self)
        topP = topPanel(self)
        bottomPLeft = bottomLeft(self.splitWin)
        bottomPRight = bottomRight(self.splitWin)

        # SPLIT THE WINDOW
        self.splitWin.SplitVertically(bottomPLeft, bottomPRight)
        self.splitWin.SetMinimumPaneSize(350)
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(topP, 1, wx.EXPAND)
        sizer.Add(self.splitWin, 1, wx.EXPAND)
        self.SetSizer(sizer)

        self.control = p = wx.Panel(self, 1, style=wx.TE_MULTILINE)

        # SETUP CONFIG WINDOW
        self.result = wx.StaticText(p, label="")
        self.result.SetForegroundColour(wx.RED)
        self.lblname = wx.StaticText(self, label="Config File:")
        self.editname = wx.TextCtrl(self, size=(140, -1))

        # Set sizer for the panel content
        self.sizer = wx.GridBagSizer(5, 5)
        self.sizer.Add(self.lblname, (1, 2))
        self.sizer.Add(self.editname, (1, 3))

        # SETUP RUN MENU
        runMenu = wx.Menu()  # create a menu for running DAQ
        runConfig = runMenu.Append(wx.ID_ANY, "&Configure", "Load configuration file")
        menuBar = wx.MenuBar()
        menuBar.Append(runMenu, "&Run")
        self.SetMenuBar(menuBar)  # Adding the MenuBar to the Frame content.
        self.Bind(wx.EVT_MENU, self.onConfigure, runConfig)

        self.Show(1)
        self.aboutme = wx.MessageDialog( self, " A sample editor \n"
                            " in wxPython","About Sample Editor", wx.OK)
        self.doiexit = wx.MessageDialog( self, " Exit - R U Sure? \n",
                        "GOING away ...", wx.YES_NO)
        self.dirname = ''
    def onConfigure(self,e):
    # Load specific configuration file for system being used

        openFileDialog = wx.FileDialog(self, "Open", "", "",
                                   "Python files (*.py)|*.py",
                                   wx.FD_OPEN | wx.FD_FILE_MUST_EXIST)
        if openFileDialog.ShowModal() == wx.ID_OK:
            self.filename=openFileDialog.GetFilename()
            self.dirname=openFileDialog.GetDirectory()
            filehandle=open(os.path.join(self.dirname, self.filename),'r')
            self.configName = self.filename[:-3]
            filehandle.close()
        lP = bottomLeft(self)
        lP.plotWaves(self)
        rP = bottomRight(self)
        rP.plotMAW(self)
        self.editname.AppendText(self.configName)
        openFileDialog.Destroy()

# Run the program
if __name__ == "__main__":
    app = wx.App(False)
    frame = myGUI()
    frame.Show()
    app.MainLoop()

这是我的 GUI 的完整示例,如果您运行配置菜单并加载任何文件(没关系,因为这只是运行 def plotWaves 和 def plotMAW 函数),您将看到绘图超过图形用户界面。如果您注释掉def plotWaves(self,parent):def plotMAW(self,parent): 行,那么这些图就会出现在正确的位置。如果您注释掉定义行,第一张图像显示了结果。如果您不将它们注释掉,第二张图片会显示结果。

【问题讨论】:

    标签: python user-interface wxpython splitter


    【解决方案1】:

    您没有定义 2 个面板来构成显示器的底部。
    这是你要找的吗:

    import wx
    from matplotlib.figure import Figure
    from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
    class topPanel(wx.Panel):
        def __init__(self, parent):
            """Constructor"""
            wx.Panel.__init__(self, parent=parent)
            Text=wx.StaticText(self, -1, ("Top Panel"))
    
    class bottomRight(wx.Panel):
        def __init__(self, parent):
            """Constructor"""
            wx.Panel.__init__(self, parent=parent)
            Text=wx.StaticText(self, -1, ("Bottom Right"))
    
    class bottomLeft(wx.Panel):
        # PANEL FOR PLOTTING DATA AS IT COMES IN
        #----------------------------------------------------------------------
        def __init__(self, parent):
            """Constructor"""
            wx.Panel.__init__(self, parent=parent)
            Text = wx.StaticText(self,-1,"Bottom Left")
            self.figure = Figure()
            self.axes = self.figure.add_subplot(111,aspect='equal')
            self.canvas = FigureCanvas(self, -1, self.figure)
            t = [ 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]
            s = [0.0, 1.0, 0.0, 1.0, 0.0, 2.0, 1.0, 2.0, 1.0, 0.0]
            self.axes.plot(t, s)
            self.sizer = wx.BoxSizer(wx.HORIZONTAL)
            self.sizer.Add(Text, 0,0,0,0)
            self.sizer.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW)
            self.SetSizer(self.sizer)
            self.Fit()
    
    class myGUI(wx.Frame):
        def __init__(self):
            self.main = wx.Frame.__init__(self, None, wx.ID_ANY, "myGUI", size=(750,500))
            # DEFINE A SPLIT WINDOW
            self.splitWin = wx.SplitterWindow(self)
            topP = topPanel(self)
            bottomPLeft = bottomLeft(self.splitWin)
            bottomPRight = bottomRight(self.splitWin)
            # SPLIT THE WINDOW
            self.splitWin.SplitVertically(bottomPLeft, bottomPRight)
            self.splitWin.SetMinimumPaneSize(350)
            sizer = wx.BoxSizer(wx.VERTICAL)
            sizer.Add(topP, 1, wx.EXPAND)
            sizer.Add(self.splitWin, 1, wx.EXPAND)
            self.SetSizer(sizer)
    
    # Run the program
    if __name__ == "__main__":
        app = wx.App(False)
        frame = myGUI()
        frame.Show()
        app.MainLoop()
    

    【讨论】:

    • 这与我想要做的非常接近。唯一的问题是,如果我绘制一个函数,然后在我的 GUI 代码中的其他地方运行该函数,那么该绘图会消耗整个 GUI,并且不会显示其他任何内容。
    • 我怀疑这与设置拆分窗口无关,没有代码,无法回答
    • 我用我的所有代码和显示我遇到的问题的结果更新了我的初始评论。
    • 您正在将您原来的问题转变为一个完全不同的问题。我建议您将其发布为一个新问题。显然,垂直拆分窗口已解决。请记住,SO 适用于有类似问题的其他人,因此问题及其答案不应偏离主题。
    【解决方案2】:

    可以这样吗?

    import wx
    
    
    class MainGUI(wx.Frame):
        def __init__(self):
            wx.Frame.__init__(self, parent=None, size=(750,500))
            self.Centre()
    
            topPanel = TopPanel(self)
            hLeftPanel = LeftPanel(self)
            hRightPanel = RightPanel(self)
    
            hBoxSizer = wx.BoxSizer(wx.HORIZONTAL)
            hBoxSizer.Add(hLeftPanel, 1, wx.EXPAND)
            hBoxSizer.Add(hRightPanel, 1, wx.EXPAND)        
    
            vBoxSizer = wx.BoxSizer(wx.VERTICAL)
            vBoxSizer.Add(topPanel, 1, wx.EXPAND)
            vBoxSizer.Add(hBoxSizer, 1, wx.EXPAND)
    
            self.SetSizer(vBoxSizer)
    
    
    class TopPanel(wx.Panel):
        def __init__(self, parent):
            wx.Panel.__init__(self, parent)
            self.SetBackgroundColour("red")
    
    
    class LeftPanel(wx.Panel):
        def __init__(self, parent):
            wx.Panel.__init__(self, parent)
            self.SetBackgroundColour("blue")
    
    
    class RightPanel(wx.Panel):
        def __init__(self, parent):
            wx.Panel.__init__(self, parent)
            self.SetBackgroundColour("green")
    
    
    # Run the program
    if __name__ == "__main__":
        app = wx.App(False)
        frame = MainGUI()
        frame.Show()
        app.MainLoop()
    

    希望对我有所帮助!

    【讨论】:

    • 感谢您的帮助!这看起来好多了。但是,如果我将绘图(从底部面板)添加到 LeftPanel 和 RightPanel 类,它们不会随 MainGUI 类的尺寸缩放。这是绘图问题还是尺寸问题?再次感谢您!
    • 我为我的第一条评论找到了一种解决方法,但现在我在调用 LeftPanel 和 Right Panel 类的函数时遇到了问题。我试过:`lP = LeftPanel(self,) lP().plotWaves1(self,self.configName)` 并得到错误:`TypeError: 'LeftPanel' object is not callable`
    • LeftPanel 不是一种方法。 lP = LeftPanel(self) lP.plotWaves1(self.configName)
    • 我更新了我的第一条评论,以完全显示我遇到的问题。我使用您写的内容来帮助拆分屏幕,但现在我的编辑帖子中描述了另一个问题。
    猜你喜欢
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 2013-12-26
    • 1970-01-01
    相关资源
    最近更新 更多