2018/03/02

wxPython & XRC で "AttributeError: 'Control' object has no attribute" が発生する場合の対処方法

@wxPython 4.0.1

以下のように XRC から wxDatePickerCtrl 等のコンポーネントを生成すると、Control オブジェクトが返ってきてしまうことがあります。

1
2
3
4
5
6
7
8
9
10
import wx
import wx.xrc as xrc
 
app = wx.App(False)
res = xrc.XmlResource('MainWindow.xrc')
frame = res.LoadFrame(None, "top")
dp = xrc.XRCCTRL(frame, 'datePicker')
dp.GetValue() # ここでエラー "AttributeError: 'Control' object has no attribute 'GetValue'"
frame.Show()
app.MainLoop()
MainWindow.xrc
1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" ?>
<resource>
  <object class="wxFrame" name="top">
    <object class="wxPanel" name="panel">
      <object class="wxBoxSizer" name="sizeer">
        <orient>wxVERTICAL</orient>
        <object class="sizeritem">
          <object class="wxDatePickerCtrl" name="datePicker"/>
        </object>
      </object>
    </object>
  </object>
</resource>

なお、GetValue() をコメントアウトして表示させると問題なく動作しているように見えます。

対象のパッケージが import されているか確認する

この問題、大抵は対象のパッケージが import されていないことが原因です。 DatePickerCtrlwx.adv にあるので、これを import しないと上記のエラーが発生します。

1
2
3
import wx
import wx.adv
import wx.xrc as xrc

wxCalendarCtrl は直らない

ただし、wxCalendarCtrl は以下のように wx.adv を import しても直りません。 wxPython 4.0.1 現在、これはバグのようです。

1
2
3
4
5
6
7
8
9
10
11
import wx
import wx.adv
import wx.xrc as xrc
 
app = wx.App(False)
res = xrc.XmlResource('MainWindow.xrc')
frame = res.LoadFrame(None, "top")
calendar = xrc.XRCCTRL(frame, 'calendar')
calendar.GetDate() # ここでエラー "AttributeError: 'Control' object has no attribute 'GetDate'"
frame.Show()
app.MainLoop()

参考

Calling XRCCTRL on a wxCalendarCtrl returns a generic Control instead of a CalendarCtrl object · Issue #773 · wxWidgets/Phoenix

0 件のコメント: