回答編集履歴

5 よだんーーー

umyu

umyu score 5687

2018/01/19 17:24  投稿

def main():内でlbが定義されているため。[スコープ](http://programming-study.com/technology/python-understand-scopes/)(※1)がそこで閉じています。
※1 厳密には違いますが、スコープは変数が見える範囲と思って頂ければ。
なお、label変数もshow_selectionで参照しているので、そちらも定義する必要があります。
解決方法1)モジュールスコープで変数を定義する。
```Python
lb = None
label = None
def main():
   root = Tk()
   root.title('Scrollbar 1')
```
解決方法2)show_selection関数に引数で渡す。
```Python
def show_selection(lb, label):
   for i in lb.curselection():
       if i == 0:
           label.config(text="A")
       elif i == 1:
           label.config(text="B")
```
```Python
button1 = ttk.Button(frame1, text='OK', command=lambda: show_selection(lb, label))
```
モジュールスコープを汚さないのでお勧めは引数で渡す解決方法2の方です。
■余談
if文でiの値を判断してますが、ListBoxの選択した値を取得したいなら、show_selectionは以下のコードでもOKです。
if文でiの値を判断してますが、ListBoxの選択した値を取得したいなら、show_selectionは以下のコードでもOKです。このように記述する事でListBoxの設定データ"A"と"B"に依存しなくなるため、同じような処理を別のリストボックスとラベルに対して行いたい時にshow_selection関数を再利用できます。
```Python
def show_selection(lb, label):
   for i in lb.curselection():
       value = lb.get(i)
       label.config(text=value)
       break
```
4 show_selection

umyu

umyu score 5687

2018/01/19 17:14  投稿

def main():内でlbが定義されているため。[スコープ](http://programming-study.com/technology/python-understand-scopes/)(※1)がそこで閉じています。
※1 厳密には違いますが、スコープは変数が見える範囲と思って頂ければ。
なお、label変数もshow_selectionで参照しているので、そちらも定義する必要があります。
解決方法1)モジュールスコープで変数を定義する。
```Python
lb = None
label = None
def main():
   root = Tk()
   root.title('Scrollbar 1')
```
解決方法2)show_selection関数に引数で渡す。
```Python
def show_selection(lb, label):
   for i in lb.curselection():
       if i == 0:
           label.config(text="A")
       elif i == 1:
           label.config(text="B")
```
```Python
button1 = ttk.Button(frame1, text='OK', command=lambda: show_selection(lb, label))
```
モジュールスコープを汚さないのでお勧めは引数で渡す解決方法2の方です。
モジュールスコープを汚さないのでお勧めは引数で渡す解決方法2の方です。
■余談
if文でiの値を判断してますが、ListBoxの選択した値を取得したいなら、show_selectionは以下のコードでもOKです。
```Python
def show_selection(lb, label):
   for i in lb.curselection():
       value = lb.get(i)
       label.config(text=value)
       break
```
3 追記

umyu

umyu score 5687

2018/01/19 16:48  投稿

def main():内でlbが定義されているため。[スコープ](http://programming-study.com/technology/python-understand-scopes/)(※1)がそこで閉じています。
※1 厳密には違いますが、スコープは変数が見える範囲と思って頂ければ。
なお、label変数もshow_selectionで参照しているので、そちらも定義する必要があります。
解決方法1)モジュールスコープで定義する。
解決方法1)モジュールスコープで変数を定義する。
```Python
lb = None
label = None
def main():
   root = Tk()
   root.title('Scrollbar 1')
```
解決方法2)show_selectionに引数で渡す。
解決方法2)show_selection関数に引数で渡す。
```Python
def show_selection(lb, label):
   for i in lb.curselection():
       if i == 0:
           label.config(text="A")
       elif i == 1:
           label.config(text="B")
```
```Python
button1 = ttk.Button(frame1, text='OK', command=lambda: show_selection(lb, label))
```
モジュールスコープを汚さないのでお勧めは引数で渡す解決方法2の方です。
2 label変数を追加

umyu

umyu score 5687

2018/01/19 16:47  投稿

def main():内でlbが定義されているため。[スコープ](http://programming-study.com/technology/python-understand-scopes/)(※1)がそこで閉じています。
※1 厳密には違いますが、スコープは変数が見える範囲と思って頂ければ。
なお、label変数もshow_selectionで参照しているので、そちらも定義する必要があります。  
解決方法1)モジュールスコープで定義する。
```Python
lb = None
label = None  
def main():
   root = Tk()
   root.title('Scrollbar 1')
```
解決方法2)show_selectionに引数で渡す。
```Python
def show_selection(lb):
def show_selection(lb, label):
   for i in lb.curselection():
       if i == 0:
           label.config(text="A")
       elif i == 1:
           label.config(text="B")
```
```Python
button1 = ttk.Button(frame1, text='OK', command=lambda: show_selection(lb))
button1 = ttk.Button(frame1, text='OK', command=lambda: show_selection(lb, label))
```
モジュールスコープを汚さないのでお勧めは引数で渡す解決方法2の方です。
1 追記

umyu

umyu score 5687

2018/01/19 16:29  投稿

def main():内でlbが定義されているため。スコープがそこで閉じています。
def main():内でlbが定義されているため。[スコープ](http://programming-study.com/technology/python-understand-scopes/)(※1)がそこで閉じています。
※1 厳密には違いますが、スコープは変数が見える範囲と思って頂ければ。
解決方法1)モジュールスコープで定義する。
```Python
lb = None
def main():
   root = Tk()
   root.title('Scrollbar 1')
```
解決方法2)show_selectionに引数で渡す。
```Python
def show_selection(lb):
   for i in lb.curselection():
       if i == 0:
           label.config(text="A")
       elif i == 1:
           label.config(text="B")
```
```Python
button1 = ttk.Button(frame1, text='OK', command=lambda: show_selection(lb))
```
モジュールスコープを汚さないのでお勧めは引数で渡すパターンの方です。
モジュールスコープを汚さないのでお勧めは引数で渡す解決方法2の方です。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る