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

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

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

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

Tkinter

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

Q&A

解決済

1回答

410閲覧

他のファイルのクラスの関数を使いたい

onikudaisuki

総合スコア23

Python 3.x

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

Tkinter

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

0グッド

0クリップ

投稿2022/06/05 10:10

前提

pythonのtkinterで席替えメーカーを作っています。

実現したいこと

sansyo.pyの以下の関数を

python

1def tyusen(self): 2 #辞書をリストにしてリストからキーと値をランダムで抽選 3 key , val = random.choice(list(self.dict_from_csv.items())) 4 print(key,val) 5 #選ばれたキーと値を辞書から削除する 6 del self.dict_from_csv[key] 7 print(self.dict_from_csv)

make.pyの関数の中で使いたいです。---★
sansyo.pyのクラスの関数tyusen(self)をクラスの外で関数tyusenとしなかったのは,そうするとsansyo.pyの変数dict_from_csvがスコープを超えてしまうからです。
また,わざわざ抽選するところを関数tyusen(self)としたのは,席を抽選するときにはウィンドウを出してcsvを変換するところは必要ないからです。
ラズベリーパイのimagerのようなファイルを選択して画面遷移するのを作ってみたかったのですが,sansyo.pyとmake.pyを分けずに,make.pyでファイル参照画面と抽選画面を表示させたほうが良いでしょうか。ご教授お願い致します。

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

tyusen() missing 1 required positional argument: 'self'

該当のソースコード

該当のソースコードはsansyo.pyとmake.pyですが,他のファイルも掲載します。

python

1#main.py 2import tkinter as tk 3import sansyo,make,sys,os 4 5class Application(tk.Frame): 6 def __init__(self, master = None): 7 super().__init__(master) 8 self.master.geometry("600x350") 9 self.master.title("席替えメーカー") 10 #self.master.iconbitmap(default=resource_path('desk.ico')) 11 #self.master.resizable(False,False) 12 self.canvas1 = tk.Canvas(self.master,width=600, height=175, bg="#fafafa") 13 self.canvas1.pack() 14 self.canvas2 = tk.Canvas(self.master,width=600, height=176, bg="#c51949") 15 self.canvas2.pack() 16 self.canvas1.create_window(180,140, window=tk.Label(master=self.canvas1, 17 text="席替えメーカー",anchor=tk.W,bg="#fafafa", fg="#000000",font=('MS Pゴシック', '30')),anchor=tk.W) 18 self.image_names = tk.PhotoImage(master=self.canvas1,file=resource_path("desk.png")) 19 self.canvas1.create_image(300,62,image=self.image_names) 20 self.canvas2.create_window(86,30, window=tk.Label(master=self.canvas2, 21 text="CSVファイル",anchor=tk.W,bg="#c51949", fg="#fafafa",font=('MS Pゴシック', '17')),anchor=tk.W) 22 self.canvas2.create_window(25,80, window=tk.Button(master=self.canvas2, 23 text="CSVファイルを選ぶ",command=self.switch,bg="#fafafa", fg="#c51949",font=('MS Pゴシック', '22'),justify=tk.CENTER),anchor=tk.W) 24 self.canvas2.create_window(425,30, window=tk.Label(master=self.canvas2, 25 text="次へ",bg="#c51949", fg="#fafafa",font=('MS Pゴシック', '17')),anchor=tk.W) 26 self.button = tk.Button(self.canvas2,text=" 次へ進む ", 27 command=self.quit,bg="#fafafa", fg="#c51949",font=('MS Pゴシック', '22'),justify=tk.CENTER,anchor=tk.W,state=tk.DISABLED) 28 self.button.place(x=330,y=55) 29 30 def switch(self): 31 self.button["state"] = tk.NORMAL 32 sansyo.main() 33 34 def quit(self): 35 self.master.destroy() 36 make.sub() 37def main(): 38 root = tk.Tk() 39 app = Application(master=root) 40 app.mainloop() 41 42def resource_path(relative_path): 43 if hasattr(sys, '_MEIPASS'): 44 return os.path.join(sys._MEIPASS, relative_path) 45 return os.path.join(os.path.abspath("."), relative_path) 46 47 48if __name__ == "__main__": 49 main()

python

1#sansyo.py 2import os 3from tkinter import * 4from tkinter import ttk 5from tkinter import messagebox 6from tkinter import filedialog 7import csv,random 8 9 10class Subapplication(ttk.Frame): 11 def __init__(self, master = None): 12 super().__init__(master) 13 self.master.title("CSVファイルを選ぶ") 14 self.master.resizable(False,False) 15 # Frame2の作成 16 self.frame2 = ttk.Frame(self.master, padding=5) 17 self.frame2.grid(row=2, column=1, sticky=E) 18 19 # 「ファイル参照」ラベルの作成 20 self.IFileLabel = ttk.Label(self.frame2, text="ファイル参照>>", padding=(5, 2)) 21 self.IFileLabel.pack(side=LEFT) 22 23 # 「ファイル参照」エントリーの作成 24 self.entry2 = StringVar() 25 self.IFileEntry = ttk.Entry(self.frame2, textvariable=self.entry2, width=30) 26 self.IFileEntry.pack(side=LEFT) 27 28 # 「ファイル参照」ボタンの作成 29 self.IFileButton = ttk.Button(self.frame2, text="参照", command=self.filedialog_clicked) 30 self.IFileButton.pack(side=LEFT) 31 32 # Frame3の作成 33 self.frame3 = ttk.Frame(self.master, padding=0) 34 self.frame3.grid(row=3,column=1,sticky=E) 35 36 # 適用ボタンの設置 37 self.button1 = ttk.Button(self.frame3, text="適用", command=self.conductMain) 38 self.button1.pack(side=LEFT,padx=5) 39 40 # ファイル指定の関数 41 def filedialog_clicked(self): 42 self.fTyp = [("", "*")] 43 self.iFile = os.path.abspath(os.path.dirname(__file__)) 44 self.iFilePath = filedialog.askopenfilename(filetype = self.fTyp, initialdir = self.iFile) 45 self.entry2.set(self.iFilePath) 46 47 # 適用ボタン押下時の実行関数 48 def conductMain(self): 49 self.text = "" 50 self.filePath = self.entry2.get() 51 self.lastname=os.path.splitext(self.filePath) 52 if self.lastname[1] == ".csv": 53 self.text += "ファイルパス:" + self.filePath 54 #csvを辞書型に変換 55 with open(self.filePath, mode='r',encoding='utf-8') as inp: 56 reader = csv.reader(inp) 57 self.dict_from_csv = {rows[0]:rows[1] for rows in reader} 58 print(self.dict_from_csv) 59 if self.text: 60 #ウィンドウ閉店の確認メッセージを表示 61 self.res = messagebox.askokcancel("確認","参照画面を閉じていいですか?") 62 if self.res: 63 #rootを削除 64 self.master.destroy() 65 else: 66 messagebox.showerror("エラー", "拡張子が「csv」ではない、またはパスの指定がありません。") 67 68 def tyusen(self): 69 #辞書をリストにしてリストからキーと値をランダムで抽選 70 key , val = random.choice(list(self.dict_from_csv.items())) 71 print(key,val) 72 #選ばれたキーと値を辞書から削除する 73 del self.dict_from_csv[key] 74 print(self.dict_from_csv) 75 76def main(): 77 subroot = Toplevel() 78 subroot.attributes("-topmost", True) 79 subapp = Subapplication(master=subroot) 80 subapp.mainloop()

python

1#make.py 2import tkinter as tk 3import main 4from sansyo import Subapplication 5from tkinter import messagebox 6class Maker(tk.Frame): 7 def __init__(self, master = None): 8 super().__init__(master) 9 self.master.title("席替えメーカー") 10 self.master.geometry("900x525") 11 #self.master.iconbitmap(default=main.resource_path('desk.ico')) 12 #self.master.resizable(False,False) 13 #ウィンドウのXボタンが押されたときに呼ばれるメソッドを設定 14 self.master.protocol("WM_DELETE_WINDOW", self.delete_window) 15 self.canvas1 = tk.Canvas(self.master,width=1920, height=1080, bg="#fafafa") 16 self.canvas1.pack() 17 #5個のボタンは試しで置いてます。 18 for i in range(5): 19 self.button = tk.Button(master=self.canvas1, text=i, command=self.click_button) 20 self.button.grid(row=0, column=i) 21 22 def click_button(self): 23 Subapplication.tyusen()#---★ 24 25 26 def delete_window(self): 27 ret = messagebox.askyesno( 28 title = "確認", 29 message = "プログラムを終了しますか?") 30 if ret: 31 #「はい」がクリックされたとき 32 self.master.destroy() 33 34 35def sub(): 36 makeroot = tk.Tk() 37 makeapp = Maker(master=makeroot) 38 makeapp.mainloop() 39 40if __name__ == "__main__": 41 sub() 42

試したこと

https://www.haya-programming.com/entry/2018/10/05/233418
上記よりsansyo.pyのクラスがインスタンス化されてないのが問題だとわかったのですが,sansyo.pyのクラスをmake.pyのクラスの中の関数の中でインスタンス化することになるのでそれはおかしいと思って悩んでいます。

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

python3.10.4,win11

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

dict_from_csvをグローバル変数としました。

投稿2022/06/07 07:58

onikudaisuki

総合スコア23

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問