Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Q&A

解決済

1回答

2064閲覧

tkinter サブウィンドウに配置したcomboboxの初期値が設定出来ない

yoshi_gabbalove

総合スコア5

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

1グッド

0クリップ

投稿2023/10/11 13:21

実現したいこと

サブウィンドウに配置したcomboboxの初期値を設定したいです。

前提

業務効率化のためpythonでデスクトップアプリを作成しています。
サブウィンドウにcomboboxを配置し、初期値を設定したのですが、空欄のままになります。
メインウィンドウでは問題なく初期値が設定されます。

該当のソースコード

python

1from tkinter import * 2from tkinter import ttk 3 4def sub_window(): 5 sub_win = Toplevel() 6 sub_win.geometry('100x100') 7 sub_frame = Frame(sub_win, width = 100, height = 100) 8 sub_frame.grid(row=0,column=0) 9 10 sub_cbx_list = ['1','2','3','4','5'] 11 sub_cbx_variable = StringVar() 12 sub_cbx = ttk.Combobox(sub_frame,values=sub_cbx_list,width=3,state="readonly",textvariable=sub_cbx_variable,justify=CENTER) 13 sub_cbx.grid(row=0,column=0) 14 sub_cbx.current(2) 15 16root = Tk() 17 18root.geometry('200x200') 19 20main_frame = Frame(root, width = 200, height = 200) 21main_frame.grid(row=0,column=0) 22 23sub_win_button = Button(main_frame,text = "サブウィンドウ",command = sub_window) 24sub_win_button.grid(row=0,column=0) 25 26cbx_list = ['1','2','3','4','5'] 27cbx_variable = StringVar() 28cbx = ttk.Combobox(root,values=cbx_list,width=3,state="readonly",textvariable=cbx_variable,justify=CENTER) 29cbx.grid(row=1,column=0) 30cbx.current(2) 31 32root.mainloop() 33 34

試したこと

調べてみたのですが、同様の現象、解決策を記載しているページを見つけられませんでした。
原因、解決方法をご教授ください。

melian👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2023/10/11 13:48 編集

サブウィンドウで使用している sub_cbx_variable を global scope に置くとよいかと。 global sub_cbx_variable # global 宣言を追加 sub_cbx_variable = StringVar()
yoshi_gabbalove

2023/10/11 14:01

出来ました!ありがとうございます! ちなみに、なぜglobal宣言をする必要があるのでしょうか? (スコープの概念はある程度理解しています。) よければ教えていただけないでしょうか? また、ベストアンサーにしたいので回答欄に入力お願いします。
melian

2023/10/11 14:39

ありがとうございます、回答欄に入力しました。
guest

回答1

0

ベストアンサー

※ コメントから転記

サブウィンドウで使用している sub_cbx_variable を global scope に置くとよいかと。

python

1global sub_cbx_variable # global 宣言を追加 2sub_cbx_variable = StringVar()

ちなみに、なぜglobal宣言をする必要があるのでしょうか?

コールバック関数(sub_window())内で定義(確保)されている sub_cbx_variable(ウィジェット変数)を、アプリケーション・ループ(root.mainloop())から参照できる様にしなければならないのですが、ローカル変数のままでは参照できないので global 宣言を付けます。global 宣言以外にも、sub_window() の引数に StringVar() を渡しても構いません。

python

1from tkinter import * 2from tkinter import ttk 3 4def sub_window(sub_cbx_variable): 5 sub_win = Toplevel() 6 sub_win.geometry('100x100') 7 sub_frame = Frame(sub_win, width = 100, height = 100) 8 sub_frame.grid(row=0,column=0) 9 10 sub_cbx_list = ['1','2','3','4','5'] 11 sub_cbx = ttk.Combobox(sub_frame,values=sub_cbx_list,width=3,state="readonly",textvariable=sub_cbx_variable,justify=CENTER) 12 sub_cbx.grid(row=0,column=0) 13 sub_cbx.current(2) 14 15root = Tk() 16 17root.geometry('200x200') 18 19main_frame = Frame(root, width = 200, height = 200) 20main_frame.grid(row=0,column=0) 21 22sub_cbx_variable = StringVar() 23sub_win_button = Button(main_frame,text = "サブウィンドウ",command = lambda: sub_window(sub_cbx_variable)) 24sub_win_button.grid(row=0,column=0) 25 26cbx_list = ['1','2','3','4','5'] 27cbx_variable = StringVar() 28cbx = ttk.Combobox(root,values=cbx_list,width=3,state="readonly",textvariable=cbx_variable,justify=CENTER) 29cbx.grid(row=1,column=0) 30cbx.current(2) 31 32root.mainloop()

投稿2023/10/11 14:38

melian

総合スコア21283

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yoshi_gabbalove

2023/10/12 12:44

ご回答いただきありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問