質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.47%
Tkinter

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2160閲覧

Python (TkInter) コンボボックス選択値をテキストボックスに格納しているつもりが現れてこない

saya24

総合スコア226

Tkinter

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/05/18 01:37

標題のとおりですが、なぜcmbox1_selectedという関数が、ダイアログ上のテキストボックスへ値を格納することができないのでしょうか?
メッセージボックスで選択値の内容がしっかり格納されているのか確認してみると self.v1 の値は表示させてきました。
ちなみに、ひょっとしてself.update()という 画面更新が必要なのかな、と試してみましたが 状況は変わりませんでした。

それと、もう一つ。
現在cmbox1_selectedの関数を、現在引数を2つ受けるようにしていますが それは以下のエラーを受けたためです。

TypeError: cmbox1_selected() takes 1 positional argument but 2 were given

わけも分からず、関数の後ろ括弧内に2つの変数を配置していますが、2つ目の変数には何が入ってくるのでしょうか
ネット上の記事では (event)と定義されたものばかりです。この問題とテキストボックスに値が格納されない問題は関係しているのでしょうか?

Python

1from tkinter import * 2import tkinter.ttk as ttk 3import math 4 5 6 7class Apprication(ttk.Frame): 8 9 def __init__(self, app): 10 super().__init__(app) 11 self.pack() 12 13 btn = ttk.Button(self, text="Sub", command=self.openDialog) 14 btn.grid(row=1, column=0) 15 16 17 18 # 子画面開く 19 def openDialog(self): 20 21 self.dialog = Toplevel(self) 22 self.dialog.title("Sub Menu") 23 24 #フォームサイズを実行端末から導き、ド真中に配置表示 25 lw = math.ceil(ww * 0.408) 26 lh = math.ceil(wh * 0.477) 27 self.dialog.geometry(str(lw)+"x"+str(lh)+"+"+str(int(ww/2-lw/2))+"+"+str(int(wh/2-lh/2)) ) 28 29 self.dialog.configure(bg="#F0FFFF") 30 self.dialog.resizable(0,0) 31 self.dialog.protocol('WM_DELETE_WINDOW', (lambda: 'pass')()) 32 33 # 当該ダイアログのカーソルを変更し、関数側でもカーソルを変更できるように 34 self.dialog['cursor'] = 'hand2' 35 self.this = self.dialog 36 37 # modalに 38 self.dialog.grab_set() 39 40 41 42 # ★★★コンボボックス★★★ 43 db = {1:"AAA",2:"BBB",3:"CCC"} 44 self.v1 = StringVar() 45 cmbox1 = ttk.Combobox(self.dialog, takefocus=1, width=5, justify=CENTER, values=list(db.keys()), state='readonly', textvariable=self.v1) 46 cmbox1.bind('<<ComboboxSelected>>', self.cmbox1_selected) 47 cmbox1.grid(row=0, column=0, padx=(10, 0), pady=(10,0), sticky=W+E) 48 cmbox1.focus_set() 49 50 51 # テキストボックス(ReadOnly) 52 self.txt1 = Entry(self.dialog, state="readonly") 53 self.txt1.grid(row=0, column=1, columnspan=7, sticky=W+E, pady=(10,0)) 54 55 # 閉じるボタン 56 btn3 = Button(self.dialog, text='Quit', command=self.closeDialog, width=10) 57 btn3.grid(row=5, column=10, pady=10, padx=(0,10)) 58 59 60 self.dialog.grid_rowconfigure(1, weight=1) 61 self.dialog.grid_rowconfigure(3, weight=1) 62 self.dialog.grid_columnconfigure(2, weight=1) 63 64 65 66 67 # 子画面閉じる 68 def closeDialog(self): 69 self.dialog.destroy() 70 71 72 # ★★★コンボボックス選択値をテキストボックス表示★★★ 73 def cmbox1_selected(self, event): 74 self.txt1.insert(END, self.v1.get()) 75 76 77 78if __name__ == '__main__': 79 80 #世間でいうrootをappとしています 81 app = Tk() 82 83 #実行端末の画面サイズを取得 84 ww = app.winfo_screenwidth() 85 wh = app.winfo_screenheight() 86 87 app.update_idletasks() 88 89 #フォームサイズを実行端末から導き、ド真中に配置表示 90 lw = math.ceil(ww * 0.208) 91 lh = math.ceil(wh * 0.277) 92 app.geometry(str(lw)+"x"+str(lh)+"+"+str(int(ww/2-lw/2))+"+"+str(int(wh/2-lh/2)) ) 93 94 #タイトルを指定 95 app.title("Main Menu") 96 97 #フォームの最大化、×ボタン操作を無効化 98 app.resizable(0,0) 99 #app.protocol('WM_DELETE_WINDOW', (lambda: 'pass')()) 100 101 # カーソル変更 102 app["cursor"] = "hand2" 103 104 app.configure(bg="#F0FFFF") 105 106 # フレームを作成する 107 frame = Apprication(app) 108 # 格納したTkインスタンスのmainloopで画面を起こす 109 app.mainloop()

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

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

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

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

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

guest

回答1

0

ベストアンサー

なぜcmbox1_selectedという関数が、ダイアログ上のテキストボックスへ値を格納することができないのでしょうか?

単純に Entry Widget の state が ReadOnly だからです。
書き込む前に state を normal に戻し、書き込みが終了したら再度 readonly にすると良いと思います。

Python

1 # ★★★コンボボックス選択値をテキストボックス表示★★★ 2 def cmbox1_selected(self, event): 3 self.txt1.configure(state='normal') 4 self.txt1.insert(END, self.v1.get()) 5 self.txt1.configure(state='readonly')

2つ目の変数には何が入ってくるのでしょうか

第2引数は どのようなイベントが発火したのかを説明するための Event object が入っています。
Event object に格納されている内容は、イベントの内容によって変わりますが、

  • どの Widget でのイベントか
  • イベントのタイプ
  • (イベントがマウスイベントだった場合)マウスのポジション
  • (イベントがキーイベントだった場合)キーコード

などが格納されております。

詳しくは下記のリンク先を確認してください。

http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm

投稿2020/05/18 03:38

magichan

総合スコア15898

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

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

saya24

2020/05/18 03:49

良く分かりました。また初歩的なことですみませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問