2018/03/02

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

@wxPython 4.0.1

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



```python
`highlight: 8;
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()
```

```xml
`title: "MainWindow.xrc";
<?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 されていないことが原因です。 `DatePickerCtrl` は `wx.adv` にあるので、これを import しないと上記のエラーが発生します。 ```python `highlight: 2; import wx import wx.adv import wx.xrc as xrc ``` ### wxCalendarCtrl は直らない ただし、`wxCalendarCtrl` は以下のように `wx.adv` を import しても直りません。 wxPython 4.0.1 現在、これはバグのようです。 ```python 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](https://github.com/wxWidgets/Phoenix/issues/773)

0 件のコメント: