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

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

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

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

ウィンドウ

コンピューター用語において、ウィンドウとはユーザとプログラムのやり取りを可能にするGUIの枠組みのことをいいます。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

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

解決済

tkinterでウィンドウに自作関数を用いて新たなフレームを貼りつける方法が知りたいです

hinata1211
hinata1211

総合スコア0

Tkinter

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

ウィンドウ

コンピューター用語において、ウィンドウとはユーザとプログラムのやり取りを可能にするGUIの枠組みのことをいいます。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

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

2回答

0評価

0クリップ

715閲覧

投稿2021/04/10 14:58

前提・実現したいこと

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

import tkinter as tk import tkinter.ttk as ttk def startup(): st = tk.Tk() st.title('startup') st.geometry('300x100+400+250') label_1 = tk.Label(st, text = 'システム名orロゴ') label_1.grid(column=0, row=0, sticky=tk.W) launch(st) st.mainloop() def launch(st): st.after(1000, lambda: st.destroy()) def open_or_new(): global frame frame = ttk.Frame(win) frame.pack(fill=tk.BOTH, pady=20) btn_open = ttk.Button(frame, text='開く', command=lambda:selected_open(frame, win)) btn_open.place(x=400, y=7) btn_open.pack() btn_new = ttk.Button(frame, text='新規', command=lambda:selected_new(frame, win)) btn_new.place(x=400, y=7) btn_new.pack() frame.pack(fill=tk.BOTH, pady=20) win.mainloop() def selected_open(frame, win): global open_new open_new = 'open' frame.destroy() def selected_new(frame, win): global open_new open_new = 'new' def select_project(): global frame_app self.frame_app = ttk.Frame(win) frame_app.pack(fill=tk.BOTH, pady=20) label = ttk.Label(frame,text = "filename:") label.grid(column=0, row=0, sticky=tk.W) label.place(x=10, y=7) landString = tk.StringVar() entry = ttk.Entry(frame, width=50, textvariable=landString) entry.grid(column=1, row=0, padx=10) entry.place(x=70, y=10) btn_c = ttk.Button(frame, text='選択', command = lambda:openfile(entry)) btn_c.place(x=400, y=7) btn_o = ttk.Button(frame, text=' 開く ', command = lambda: open_and_close(win, frame, entry)) btn_o.place(x=400, y=100) label.pack() entry.pack() btn_o.pack() btn_c.pack() win.mainloop() def openfile(entry): typ = [('音楽ファイル','*.mp3')] dir = 'C:\\User' filename = filedialog.askopenfilename(filetypes = typ, initialdir = dir) entry.insert(tk.END, filename) def open_and_close(win, frame, entry): global filename filename = entry.get() frame.destroy() win.destroy() def open_project(project): print('open_project') return 0 def open_new_file(): frame = ttk.Frame(win) frame.pack(fill=tk.BOTH, pady=20) label = ttk.Label(frame,text = "filename:") label.grid(column=0, row=0, sticky=tk.W) label.place(x=10, y=7) landString = tk.StringVar() entry = ttk.Entry(frame, width=50, textvariable=landString) entry.grid(column=1, row=0, padx=10) entry.place(x=70, y=10) btn_c = ttk.Button(frame, text='選択', command = lambda:openfile(entry)) btn_c.place(x=400, y=7) btn_o = ttk.Button(frame, text=' 開く ', command = lambda: open_and_close(win, frame, entry)) btn_o.place(x=400, y=100) label.pack() entry.pack() btn_o.pack() btn_c.pack() win.mainloop() def calculation(filename): frame = ttk.Frame(win) frame.pack(fill=tk.BOTH, pady=20) label = ttk.Label(frame,text = "計算中...") label.grid(column=0, row=0, sticky=tk.W) label.place(x=10, y=7) label.pack() win.after(1000, lambda: win.destroy()) win.mainloop() def output(filename): frame = ttk.Frame(win) frame.pack(fill=tk.BOTH, pady=20) label = ttk.Label(frame,text = "出力画面:"+filename) label.grid(column=0, row=0, sticky=tk.W) label.place(x=10, y=7) label.pack() win.mainloop() if __name__ == "__main__": startup() # rootメインウィンドウの設定 global win win = tk.Tk() win.title("title") win.geometry("750x500+400+250") open_or_new() if open_new == 'open': filename = '' select_project() print(filename) results = open_project(filename) else: filename = '' open_new_file() calculation(filename) output(filename)

試したこと

エラーが発生している関数に引数をつけてみたり、グローバル変数を使用して試行錯誤してみたのですが、どうしてもエラーが出てしまいました。改善方法などがあれば是非教えていただきたいです。
注)作成中のコードな為、エラーが発生している以降の関数は未完成のものです。

補足情報(FW/ツールのバージョンなど)

Pythonのバージョンは3.9.2です。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Tkinter

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

ウィンドウ

コンピューター用語において、ウィンドウとはユーザとプログラムのやり取りを可能にするGUIの枠組みのことをいいます。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

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