【问题标题】:wxPython wx.ScrolledWindow insert wx.PanelwxPython wx.ScrolledWindow 插入 wx.Panel
【发布时间】:2014-09-21 05:06:41
【问题描述】:

我正在尝试将 wx.Panel 插入到 wx.ScrolledWindow 中。我有一个名为 self.entTitle 的 wx.Panel 对象,它有两个输入字段,分别是 Title 和 Date。我还有一些其他对象要添加到滚动窗口中,但我想先让这个对象工作,然后再继续其他对象。这是我的代码:

main.py

import wx
from EntryScrollPanel import EntryScrollPanel

class MyFrame(wx.Frame):
    def __init__(self, parent, ID, title):
        wx.Frame.__init__(self, parent, ID, title=title, size=(850,725))

        # Creating Panels
        self.main = wx.Panel(self)
        # Create a notebook on the panel
        self.nb = wx.Notebook(self.main, 1)

        # create the page windows as children of the notebook
        entryPg = EntryScrollPanel(self.nb, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, style=wx.VSCROLL)

        # add the pages to the notebook with the label to show on the tab
        self.nb.AddPage(self.userFCode, "FCodes")

        # Create sizers
        self.mainSizer = wx.BoxSizer(wx.VERTICAL)

        # Adding Objects to mainSizer
        self.mainSizer.AddSpacer(10)
        #self.mainSizer.Add(self.mainLogin, 1, wx.ALL|wx.EXPAND)
        self.mainSizer.Add(self.nb, 1, wx.ALL|wx.EXPAND)

        # Set main sizer
        self.main.SetAutoLayout(True)
        self.main.SetSizer(self.mainSizer)
        self.mainSizer.Fit(self.main)
        self.Layout()
        self.Centre(wx.BOTH)
        self.Show()

app = wx.App(False)
frame = MyFrame(None, -1, 'App UI')
app.MainLoop()

EntryScrollPanel.py

import wx
from titlePanel import titlePanel

class EntryScrollPanel(wx.ScrolledWindow):
    def __init__(self, parent, ID, pos, size, style):
        #self.SetScrollRate( 5, 5 )

        self.entryPgBox = wx.BoxSizer(wx.VERTICAL)

        #self.entTitle = titlePanel(self, -1) i've tried this as well with no success
        self.entTitle = titlePanel(wx.Panel, -1)

        self.entryPgBox.AddSpacer(10)
        self.entryPgBox.Add(self.entTitle, 0, wx.EXPAND)
        self.entryPgBox.AddSpacer(10)

        self.SetAutoLayout(True)
        self.SetSizer(self.entryPgBox)
        self.entryPgBox.Fit(self)

titlePanel.py

import wx

class titlePanel(wx.Panel):
    def __init__(self, parent, ID):
        wx.Panel.__init__(self, parent, ID)
        titleSizer = wx.BoxSizer(wx.HORIZONTAL)

        titleLbl = wx.StaticText(self, label="Title: ")
        titleTxt = wx.TextCtrl(self, size=(140,-1))
        dateLbl = wx.StaticText(self, label="Date: ")
        dateCal = wx.DatePickerCtrl(self, wx.DP_DROPDOWN)

        titleSizer.Add(titleLbl,0,wx.EXPAND)
        titleSizer.Add(titleTxt,1,wx.EXPAND)
        titleSizer.Add(dateLbl,0,wx.EXPAND)
        titleSizer.Add(dateCal,0,wx.EXPAND)

这是我得到的错误:

Traceback (most recent call last):
  File "C:/Users/JLP_COM1/PycharmProjects/wxPython/wxPythonHelloWorld.py", line 283, in <module>
    frame = MyFrame(None, -1, 'Small editor')
  File "C:/Users/JLP_COM1/PycharmProjects/wxPython/wxPythonHelloWorld.py", line 71, in __init__
    entryPg = EntryScrollPanel(self.nb, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, style=wx.VSCROLL)
  File "C:\Users\JLP_COM1\PycharmProjects\wxPython\EntryScrollPanel.py", line 17, in __init__
    self.entTitle = titlePanel(self, -1)
  File "C:\Users\JLP_COM1\PycharmProjects\wxPython\titlePanel.py", line 5, in __init__
    wx.Panel.__init__(self, parent, ID)
  File "C:\Python27\lib\site-packages\wx-3.0-msw\wx\_windows.py", line 68, in __init__
    _windows_.Panel_swiginit(self,_windows_.new_Panel(*args, **kwargs))
TypeError: in method 'new_Panel', expected argument 1 of type 'wxWindow *'

如何将 self.entTitle 添加到 EntryScrollPanel?

感谢您的所有帮助!

【问题讨论】:

  • 请添加完整的回溯。回溯引用了您的代码中未包含的方法“new_Panel”。
  • 我添加了完整的回溯。
  • 请参阅编辑。如果这不能解决问题,您应该努力发布最简化的可执行代码,以便我们测试您的错误。否则很难知道问题出在哪里
  • 我做到了,这就是为什么我说看看编辑。我正在显示 main.py,如果我显示更多代码,它将与我的问题无关。用 self 替换 wx.Panel 会产生同样的错误。

标签: python wxpython wxwidgets


【解决方案1】:

面板不是 wxWindow,因此:

self.entTitle = titlePanel(wx.Panel, -1)

不起作用并产生回溯。
上面的代码实例化了一个 wx.Panel 子类(titlePanel)并发送一个 wx.Panel 作为其构造函数的父类:

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

但 Panel 需要一个窗口(例如 Frame)作为父级。

因此你必须这样做:

self.entTitle = titlePanel(self, -1)

作为self,这里TitlePanel的父级是一个wx.ScrolledWindow

另请注意,您没有初始化 ScrolledWindow:

class EntryScrollPanel(wx.ScrolledWindow):
    def __init__(self, parent, ID):
        wx.ScrolledWindow.__init__(self, parent, ID)    <--- addd this

【讨论】:

猜你喜欢
  • 2011-03-29
  • 2010-11-05
  • 1970-01-01
  • 1970-01-01
  • 2017-07-02
  • 2014-02-20
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多