前提・実現したいこと
Python学習のためPythonとTkinterを使ってナンバープレース(数独)というパズルを解くシステムを作っています。
For文で9×9マスのgame_frameを作り、そこに数値を表示したいのですが、どうしても表示してくれません。
発生している問題・エラーメッセージ
表示してくれない・・・
以下のソースコードの”frame_list[i]~”辺りが、完全に勘違いしている気がします。
Python
1 2def gom(): 3 global frame_list 4 global numpla_list 5 for i in range(81): 6 frame_list[i] = Label(game_frame, text = numpla_list[i][0], bg = 'LightGray') 7 print(numpla_list[i][0]) 8
該当のソースコード
Python
1from tkinter import * 2 3#### Call関数定義 #### 4def fim1(): 5 print("新規(N)") 6 7def fim2(): #暫定的にとりあえずサンプルを入れる 8 global numpla_list 9 for i in range(81): 10 numpla_list[i][0] = sample_list[i] 11 12def fim3(): 13 print("保存(S)") 14 15def gom(): 16 global frame_list 17 global numpla_list 18 for i in range(81): 19 frame_list[i] = Label(game_frame, text = numpla_list[i][0], bg = 'LightGray') 20 print(numpla_list[i][0]) 21 22 23def hem(): 24 print("ヘルプ") 25 26if __name__ == '__main__': 27 28 root = Tk() 29 30 menubar = Menu(root) 31 #### File menu #### 32 filemenu = Menu(menubar,tearoff=0) 33 filemenu.add_command(label='新規(N)', command = fim1) 34 filemenu.add_command(label='開く(O)', command = fim2) 35 filemenu.add_command(label='保存(S)', command = fim3) 36 filemenu.add_separator() 37 filemenu.add_command(label='終了(X)', command = quit) 38 39 #### Go Menu #### 40 gomenu = Menu(menubar,tearoff=0) 41 gomenu.add_command(label='実行(U)', command = gom) 42 43 #### Help Menu #### 44 helpmenu = Menu(menubar, tearoff=0) 45 helpmenu.add_command(label="ヘルプ(H)", command = hem) 46 47 #### メインメニュー #### 48 menubar.add_cascade(label="ファイル(F)", menu = filemenu) 49 menubar.add_cascade(label="実行(U)", menu = gomenu) 50 menubar.add_cascade(label="ヘルプ(H)", menu = helpmenu) 51 52 53 root.config(menu=menubar) 54 55 root.title("ナンバープレース") 56 root.minsize(300,300) 57 root.rowconfigure(0,weight=1) 58 root.columnconfigure(0,weight=1) 59 root.grid() 60 61 ###フレームオブジェクト作成### 62 root_frame = Frame(root, relief='groove', borderwidth=5, bg='LightGray') 63 status_frame = Frame(root_frame, height=50, relief='sunken', borderwidth=3, bg='LightGray') 64 game_frame = Frame(root_frame, relief='sunken', borderwidth=3, bg='LightGray') 65 root_frame.pack() 66 status_frame.pack(pady=5, padx=5, fill='x') 67 game_frame.pack(pady=5, padx=5) 68 69 #### サンプル問題(初級) #### 70 sample_list = [ 71 0,0,0,8,0,1,9,5,0, 72 0,0,0,7,9,0,8,0,0, 73 0,0,3,5,2,0,7,0,4, 74 7,6,0,4,0,0,0,9,1, 75 3,4,0,9,0,8,5,2,0, 76 9,5,2,1,3,7,4,8,0, 77 0,7,0,0,0,4,0,0,8, 78 2,3,4,6,8,0,1,7,0, 79 1,0,0,0,0,9,0,0,0 80] 81 82 #### 配列を作り初期設定する #### 83 numpla_list =[] 84 85 for i in range(81): 86 numpla_list.append([0,1,2,3,4,5,6,7,8,9]) 87 88 #### マス目を作る #### 89 # 左クリックした際のイベント関数を定義。これは下でフレームにクリックイベントを定義しているけども、 90 # それよりも先に書かないとダメ 91 def left_click(event): 92 event.widget.configure(relief='sunken', bd=3) 93 except_num = event.widget.num 94 print(except_num) 95 96 97 i = 0 98 frame_list = [] 99 for x in range(9): 100 for y in range(9): 101 # タテヨコ40pxの小さいフレームを量産。reliefをraisedにして出っ張り感を再現する 102 frame = Frame(game_frame, width=40, height=40, bd=3, relief='raised', bg='LightGray') 103 # bindメソッドを使うと、そのオブジェクトにイベントを定義できる。 104 # 第一引数に<1>を指定すると左クリックした際のイベントとなる 105 # 第二引数には呼び出される関数(left_click関数)を記述する 106 frame.bind("<1>", left_click) 107 # frameにnumアトリビュートを定義する 108 frame.num = i 109 # 作成したフレームをフレームのリストに格納する。これでインデックス番号でアクセスすることで 110 # 各フレームを操作できる 111 frame_list.append(frame) 112 # gridを使ってフレームを配置する。packと違いgridを使うと、タテヨコ均等に9列x9列に配置できる 113 # rowでヨコ、columnでタテを指定している 114 frame.grid(row=x, column=y) 115 i += 1 116 117root.mainloop() 118 119
試したこと
Tkinterのリファレンスマニュアルやググったりして調べていますが、基本的知識が不足しすぎで解決策を見出せません。
かれこれ8時間くらい調べていますが、光明が見えません。
補足情報(FW/ツールのバージョンなど)
OS:Windows10
Python:Anaconda3
IDE:VS code
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/03 17:29
2020/05/03 22:06 編集
2020/05/03 22:14