標題のとおりですが、なぜ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()
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/18 03:49