ジェネレーターの実現
ジェネレーター Team を再定義して、for 文とともに利用できるようにします。
class Team: def __iter__(self): m = self.teams() for e in "ABCDEFGH": yield e, m[e]
各グループ e と、それに属するチーム m[e] から成る、タプルを与えます。
def teams(self): return [ "A": ("GER", "ECU", "POL", "CRC",), # Group A "B": ("ENG", "SWE", "PAR", "TRI",), # Group B "C": ("ARG", "NED", "CIV", "SCG",), # Group C "D": ("POR", "MEX", "ANG", "IRN",), # Group D "E": ("ITA", "GHA", "CZE", "USA",), # Group E "F": ("BRA", "AUS", "CRO", "JPN",), # Group F "G": ("SUI", "FRA", "KOR", "TOG",), # Group G "H": ("ESP", "UKR", "TUN", "KSA",), # Group H ]
各グループ(A〜H)をキーに、それに属する4つのチームを値に持つ辞書を、リターン値とします。
ジェネレーターの生成
class ExWindow(Window): def init(self): ... for group, teams in Team(): item = TabItem( Header=group, ) self.tabControl.Items.Add(item) panel = WrapPanel() item.Content = panel for e in teams: brush = ImageBrush( ImageSource=BitmapImage(Uri("image/%s.gif"%e, UriKind.Relative)) ) panel.Children.Add(Rectangle( Width=50, Height=50, Fill=brush, ))
各 TabItem には、パネル WrapPanel を配置するとともに、その中に図形 Rectangle を配置するとともに、その内部をブラシ(画像)で塗ります。
ItemsControl | Panel | |
---|---|---|
プロパティー | .Items | .Children |
コントロール | TabControl | WrapPanel |
このとき、WrapPanel は(WrapPanel と同様に)複数のデータ項目を扱いますが、Panel の一種なので、プロパティー .Children を介して、各要素を「追加」します。
《付録》GroupControl.py
# -*- coding: utf-8 -*- #=============================================================================== # Copyright (C) 2000-2008, 小泉ひよ子とタマゴ倶楽部 # # History: WPF examples # 2008/01/25, IronPython 1.1.1 (download) # 2008/08/22, IronPython 1.1.2 (download) # 2008/03/16, ver.2.0, WPF # 2008/00/00, ver.2.1, IronPython 1.1.2 #=============================================================================== from _ant import * from System import * from System.Windows import * from System.Windows.Controls import * from System.Windows.Media import * from System.Windows.Media.Imaging import * from System.Windows.Shapes import * ## -------------------- class Team: def __iter__(self): m = self.teams() for e in "ABCDEFGH": yield e, m[e] def teams(self): return { "A": ("GER", "ECU", "POL", "CRC",), # Group A "B": ("ENG", "SWE", "PAR", "TRI",), # Group B "C": ("ARG", "NED", "CIV", "SCG",), # Group C "D": ("POR", "MEX", "ANG", "IRN",), # Group D "E": ("ITA", "GHA", "CZE", "USA",), # Group E "F": ("BRA", "AUS", "CRO", "JPN",), # Group F "G": ("SUI", "FRA", "KOR", "TOG",), # Group G "H": ("ESP", "UKR", "TUN", "KSA",), # Group H } ## -------------------- class ExWindow(Window): def __init__(self, Content=None, **args): self.InitializeComponent(Content) self.init() def InitializeComponent(self, Content): self.Content = LoadXaml(Content) def init(self): target = "tabControl", self._Controls(target) for group, teams in Team(): item = TabItem( Header=group, ) self.tabControl.Items.Add(item) panel = WrapPanel() item.Content = panel for e in teams: brush = ImageBrush( ImageSource=BitmapImage(Uri("image/%s.gif"%e, UriKind.Relative)) ) panel.Children.Add(Rectangle( Width=50, Height=50, Fill=brush, )) self.tabControl.SelectionChanged += self.selectionChanged def _Controls(self, target): controls = xaml_controls(self) for e in target: setattr(self, e, controls[e]) def selectionChanged(self, sender, e): s = sender.SelectedItem print s.Header ## -------------------- if __name__ == "__main__": xaml = __file__.replace(".py",".xaml") win = ExWindow( Title=xaml, Width=260, Height=120, Content=xaml, ) Application().Run(win) ## --------------------
《付録》GroupControl.xaml
<!-- # Copyright (C) 2000-2008, (^.^) piyo-piyo Tamago-Club # # History: WPF examples # 2008/01/25, IronPython 1.1.1 (download) # 2008/08/22, IronPython 1.1.2 (download) # 2008/03/16, ver.2.0, WPF # 2008/00/00, ver.2.1, IronPython 1.1.2
-
- >