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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

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

解決済

tkinterをクラスで表現したい

onikudaisuki
power-chan

総合スコア22

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

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

2回答

0評価

1クリップ

347閲覧

投稿2022/05/31 16:42

前提

tkinterによる席替えのソフトをクラスで表現したいです。

実現したいこと

main.pyの「csvファイルを選ぶボタン」を押したら,sansyo.pyのクラスがインスタンス化されて参照画面を出したいです。
疑問点なのはどこに以下のコードを書けばいいかということです。また,ほかにも改善点があれば教えてください。

python

def sub(): subroot = Tk() subapp = Subapplication(master=subroot) subapp.mainloop()

発生している問題・エラーメッセージ

main.pyとsansyo.pyが同時にインスタンス化されていて,またmain.pyのウィジェットが一部消えています。

python

_tkinter.TclError: can't invoke "button" command: application has been destroyed

該当のソースコード

python

#main.py from cProfile import label import tkinter as tk from tkinter import LEFT, Tk from regex import W import sansyo class Application(tk.Frame): def __init__(self, master = None): super().__init__(master) self.master.geometry("600x350") self.master.title("席替えメーカー") self.master.resizable(False,False) self.canvas1 = tk.Canvas(self.master,width=600, height=175, bg="#fafafa") self.canvas1.pack() self.canvas2 = tk.Canvas(self.master,width=600, height=176, bg="#c51949") self.canvas2.pack() self.canvas2.create_window(85,30, window=tk.Label(master=self.canvas2, text="CSVファイル",anchor=tk.W,bg="#c51949", fg="#fafafa",font=('MS Pゴシック', '17')),anchor=tk.W) self.canvas2.create_window(25,80, window=tk.Button(master=self.canvas2, text="CSVファイルを選ぶ",command=sub(),bg="#fafafa", fg="#c51949",font=('MS Pゴシック', '22'),justify=tk.CENTER),anchor=tk.W) self.canvas2.create_window(425,30, window=tk.Label(master=self.canvas2, text="次へ",bg="#c51949", fg="#fafafa",font=('MS Pゴシック', '17')),anchor=tk.W) self.canvas2.create_window(330,80, window=tk.Button(master=self.canvas2, text=" 次へ進む ",bg="#fafafa", fg="#c51949",font=('MS Pゴシック', '22'),justify=tk.CENTER),anchor=tk.W) def main(): root = tk.Tk() app = Application(master=root) app.mainloop() def sub(): subroot = Tk() subapp = sansyo.Subapplication(master=subroot) subapp.mainloop() if __name__ == "__main__": main()

python

#sansyo.py import os from tkinter import * from tkinter import ttk from tkinter import messagebox from tkinter import filedialog import csv class Subapplication(ttk.Frame): def __init__(self, master = None): super().__init__(master) self.master.title("CSVファイルを選ぶ") self.master.resizable(False,False) # Frame2の作成 self.frame2 = ttk.Frame(self.master, padding=5) self.frame2.grid(row=2, column=1, sticky=E) # 「ファイル参照」ラベルの作成 self.IFileLabel = ttk.Label(self.frame2, text="ファイル参照>>", padding=(5, 2)) self.IFileLabel.pack(side=LEFT) # 「ファイル参照」エントリーの作成 self.entry2 = StringVar() self.IFileEntry = ttk.Entry(self.frame2, textvariable=self.entry2, width=30) self.IFileEntry.pack(side=LEFT) # 「ファイル参照」ボタンの作成 self.IFileButton = ttk.Button(self.frame2, text="参照", command=self.filedialog_clicked) self.IFileButton.pack(side=LEFT) # Frame3の作成 self.frame3 = ttk.Frame(self.master, padding=0) self.frame3.grid(row=3,column=1,sticky=E) # 実行ボタンの設置 self.button1 = ttk.Button(self.frame3, text="適用", command=self.conductMain) self.button1.pack(side=LEFT,padx=5) # ファイル指定の関数 def filedialog_clicked(self): self.fTyp = [("", "*")] self.iFile = os.path.abspath(os.path.dirname(__file__)) self.iFilePath = filedialog.askopenfilename(filetype = self.fTyp, initialdir = self.iFile) self.entry2.set(self.iFilePath) # 実行ボタン押下時の実行関数 def conductMain(self): self.text = "" self.filePath = self.entry2.get() if self.filePath: self.text += "ファイルパス:" + self.filePath #csvを辞書型に変換 with open(self.filePath, mode='r',encoding='utf-8') as inp: reader = csv.reader(inp) dict_from_csv = {rows[0]:rows[1] for rows in reader} print(dict_from_csv) if self.text: #ウィンドウ閉店の確認メッセージを表示 self.res = messagebox.askokcancel("確認","ウィンドウを閉じていいですか?") if self.res: #rootを削除 self.master.destroy() else: messagebox.showerror("error", "パスの指定がありません。") def sub(): subroot = Tk() subapp = Subapplication(master=subroot) subapp.mainloop() if __name__ == "__main__": sub()

試したこと

main.pyのクラスの中に

python

#省略 self.canvas2.create_window(330,80, window=tk.Button(master=self.canvas2, text=" 次へ進む ",bg="#fafafa", fg="#c51949",font=('MS Pゴシック', '22'),justify=tk.CENTER),anchor=tk.W) def sub(self): self.subroot = Tk() self.subapp = sansyo.Subapplication(master=self.subroot) self.subapp.mainloop()

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

python3.9.7,win11

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

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