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

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

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

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

Tkinter

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

解決済

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

onikudaisuki
power-chan

総合スコア22

Python 3.x

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

Tkinter

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

1回答

0評価

0クリップ

180閲覧

投稿2022/06/05 10:10

前提

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

実現したいこと

sansyo.pyの以下の関数を

python

def tyusen(self): #辞書をリストにしてリストからキーと値をランダムで抽選 key , val = random.choice(list(self.dict_from_csv.items())) print(key,val) #選ばれたキーと値を辞書から削除する del self.dict_from_csv[key] 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

#main.py import tkinter as tk import sansyo,make,sys,os class Application(tk.Frame): def __init__(self, master = None): super().__init__(master) self.master.geometry("600x350") self.master.title("席替えメーカー") #self.master.iconbitmap(default=resource_path('desk.ico')) #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.canvas1.create_window(180,140, window=tk.Label(master=self.canvas1, text="席替えメーカー",anchor=tk.W,bg="#fafafa", fg="#000000",font=('MS Pゴシック', '30')),anchor=tk.W) self.image_names = tk.PhotoImage(master=self.canvas1,file=resource_path("desk.png")) self.canvas1.create_image(300,62,image=self.image_names) self.canvas2.create_window(86,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=self.switch,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.button = tk.Button(self.canvas2,text=" 次へ進む ", command=self.quit,bg="#fafafa", fg="#c51949",font=('MS Pゴシック', '22'),justify=tk.CENTER,anchor=tk.W,state=tk.DISABLED) self.button.place(x=330,y=55) def switch(self): self.button["state"] = tk.NORMAL sansyo.main() def quit(self): self.master.destroy() make.sub() def main(): root = tk.Tk() app = Application(master=root) app.mainloop() def resource_path(relative_path): if hasattr(sys, '_MEIPASS'): return os.path.join(sys._MEIPASS, relative_path) return os.path.join(os.path.abspath("."), relative_path) 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,random 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() self.lastname=os.path.splitext(self.filePath) if self.lastname[1] == ".csv": self.text += "ファイルパス:" + self.filePath #csvを辞書型に変換 with open(self.filePath, mode='r',encoding='utf-8') as inp: reader = csv.reader(inp) self.dict_from_csv = {rows[0]:rows[1] for rows in reader} print(self.dict_from_csv) if self.text: #ウィンドウ閉店の確認メッセージを表示 self.res = messagebox.askokcancel("確認","参照画面を閉じていいですか?") if self.res: #rootを削除 self.master.destroy() else: messagebox.showerror("エラー", "拡張子が「csv」ではない、またはパスの指定がありません。") def tyusen(self): #辞書をリストにしてリストからキーと値をランダムで抽選 key , val = random.choice(list(self.dict_from_csv.items())) print(key,val) #選ばれたキーと値を辞書から削除する del self.dict_from_csv[key] print(self.dict_from_csv) def main(): subroot = Toplevel() subroot.attributes("-topmost", True) subapp = Subapplication(master=subroot) subapp.mainloop()

python

#make.py import tkinter as tk import main from sansyo import Subapplication from tkinter import messagebox class Maker(tk.Frame): def __init__(self, master = None): super().__init__(master) self.master.title("席替えメーカー") self.master.geometry("900x525") #self.master.iconbitmap(default=main.resource_path('desk.ico')) #self.master.resizable(False,False) #ウィンドウのXボタンが押されたときに呼ばれるメソッドを設定 self.master.protocol("WM_DELETE_WINDOW", self.delete_window) self.canvas1 = tk.Canvas(self.master,width=1920, height=1080, bg="#fafafa") self.canvas1.pack() #5個のボタンは試しで置いてます。 for i in range(5): self.button = tk.Button(master=self.canvas1, text=i, command=self.click_button) self.button.grid(row=0, column=i) def click_button(self): Subapplication.tyusen()#---★ def delete_window(self): ret = messagebox.askyesno( title = "確認", message = "プログラムを終了しますか?") if ret: #「はい」がクリックされたとき self.master.destroy() def sub(): makeroot = tk.Tk() makeapp = Maker(master=makeroot) makeapp.mainloop() if __name__ == "__main__": sub()

試したこと

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

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

python3.10.4,win11

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Python 3.x

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

Tkinter

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