前提・実現したいこと
Pythonでtkinterを使用していたところ、ウィンドウ上のフレームを削除して新たなフレームを貼ろうとしたところ、以下のようなエラーメッセージが表示されました。
発生している問題・エラーメッセージ
Traceback (most recent call last): File "C:\Users\hinat\Desktop\zikken\zikken.py", line 127, in <module> select_project() File "C:\Users\hinat\Desktop\zikken\zikken.py", line 49, in select_project self.frame_app = ttk.Frame(win) File "C:\Users\hinat\AppData\Local\Programs\Python\Python39\lib\tkinter\ttk.py", line 735, in __init__ Widget.__init__(self, master, "ttk::frame", kw) File "C:\Users\hinat\AppData\Local\Programs\Python\Python39\lib\tkinter\ttk.py", line 552, in __init__ tkinter.Widget.__init__(self, master, widgetname, kw=kw) File "C:\Users\hinat\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 2572, in __init__ self.tk.call( _tkinter.TclError: NULL main window
該当のソースコード
Python
1import tkinter as tk 2import tkinter.ttk as ttk 3 4def startup(): 5 st = tk.Tk() 6 st.title('startup') 7 st.geometry('300x100+400+250') 8 9 label_1 = tk.Label(st, text = 'システム名orロゴ') 10 label_1.grid(column=0, row=0, sticky=tk.W) 11 12 launch(st) 13 st.mainloop() 14 15def launch(st): 16 17 st.after(1000, lambda: st.destroy()) 18 19def open_or_new(): 20 global frame 21 frame = ttk.Frame(win) 22 frame.pack(fill=tk.BOTH, pady=20) 23 24 25 btn_open = ttk.Button(frame, text='開く', command=lambda:selected_open(frame, win)) 26 btn_open.place(x=400, y=7) 27 btn_open.pack() 28 29 btn_new = ttk.Button(frame, text='新規', command=lambda:selected_new(frame, win)) 30 btn_new.place(x=400, y=7) 31 btn_new.pack() 32 33 frame.pack(fill=tk.BOTH, pady=20) 34 win.mainloop() 35 36def selected_open(frame, win): 37 global open_new 38 open_new = 'open' 39 frame.destroy() 40 41def selected_new(frame, win): 42 global open_new 43 open_new = 'new' 44 45def select_project(): 46 global frame_app 47 48 self.frame_app = ttk.Frame(win) 49 frame_app.pack(fill=tk.BOTH, pady=20) 50 51 label = ttk.Label(frame,text = "filename:") 52 label.grid(column=0, row=0, sticky=tk.W) 53 label.place(x=10, y=7) 54 55 landString = tk.StringVar() 56 entry = ttk.Entry(frame, width=50, textvariable=landString) 57 entry.grid(column=1, row=0, padx=10) 58 entry.place(x=70, y=10) 59 60 btn_c = ttk.Button(frame, text='選択', command = lambda:openfile(entry)) 61 btn_c.place(x=400, y=7) 62 63 btn_o = ttk.Button(frame, text=' 開く ', command = lambda: open_and_close(win, frame, entry)) 64 btn_o.place(x=400, y=100) 65 66 label.pack() 67 entry.pack() 68 btn_o.pack() 69 btn_c.pack() 70 71 win.mainloop() 72 73def openfile(entry): 74 typ = [('音楽ファイル','*.mp3')] 75 dir = 'C:\User' 76 filename = filedialog.askopenfilename(filetypes = typ, initialdir = dir) 77 entry.insert(tk.END, filename) 78 79def open_and_close(win, frame, entry): 80 global filename 81 filename = entry.get() 82 frame.destroy() 83 win.destroy() 84 85def open_project(project): 86 print('open_project') 87 return 0 88 89def open_new_file(): 90 frame = ttk.Frame(win) 91 frame.pack(fill=tk.BOTH, pady=20) 92 93 label = ttk.Label(frame,text = "filename:") 94 label.grid(column=0, row=0, sticky=tk.W) 95 label.place(x=10, y=7) 96 97 landString = tk.StringVar() 98 entry = ttk.Entry(frame, width=50, textvariable=landString) 99 entry.grid(column=1, row=0, padx=10) 100 entry.place(x=70, y=10) 101 102 btn_c = ttk.Button(frame, text='選択', command = lambda:openfile(entry)) 103 btn_c.place(x=400, y=7) 104 105 btn_o = ttk.Button(frame, text=' 開く ', command = lambda: open_and_close(win, frame, entry)) 106 btn_o.place(x=400, y=100) 107 108 label.pack() 109 entry.pack() 110 btn_o.pack() 111 btn_c.pack() 112 113 win.mainloop() 114 115def calculation(filename): 116 frame = ttk.Frame(win) 117 frame.pack(fill=tk.BOTH, pady=20) 118 119 label = ttk.Label(frame,text = "計算中...") 120 label.grid(column=0, row=0, sticky=tk.W) 121 label.place(x=10, y=7) 122 123 label.pack() 124 125 win.after(1000, lambda: win.destroy()) 126 127 win.mainloop() 128 129def output(filename): 130 frame = ttk.Frame(win) 131 frame.pack(fill=tk.BOTH, pady=20) 132 133 label = ttk.Label(frame,text = "出力画面:"+filename) 134 label.grid(column=0, row=0, sticky=tk.W) 135 label.place(x=10, y=7) 136 137 label.pack() 138 139 win.mainloop() 140 141if __name__ == "__main__": 142 143 startup() 144 145 # rootメインウィンドウの設定 146 global win 147 win = tk.Tk() 148 win.title("title") 149 win.geometry("750x500+400+250") 150 151 open_or_new() 152 153 if open_new == 'open': 154 filename = '' 155 select_project() 156 print(filename) 157 results = open_project(filename) 158 159 else: 160 filename = '' 161 open_new_file() 162 calculation(filename) 163 164 output(filename) 165
試したこと
エラーが発生している関数に引数をつけてみたり、グローバル変数を使用して試行錯誤してみたのですが、どうしてもエラーが出てしまいました。改善方法などがあれば是非教えていただきたいです。
注)作成中のコードな為、エラーが発生している以降の関数は未完成のものです。
補足情報(FW/ツールのバージョンなど)
Pythonのバージョンは3.9.2です。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。