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

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

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

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

Q&A

解決済

1回答

3846閲覧

【Python3.6.5】【wxPython】wxPythonのTextCtrlに入力された文字列をファイルに書き込めない

T_www

総合スコア13

Python 3.x

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

0グッド

0クリップ

投稿2018/05/05 10:42

###実現したいこと
wxPythonを用いて簡易テキストエディタを作る
###発生している問題
Qiitaの記事を参考に書いていたのですが、TextCtrlに入力された文字列をファイルに書き込む方法が分からない。(ファイルに出力したい)
###エラーメッセージ
Traceback (most recent call last):
File "C:\Users\ユーザー名\Desktop\データ\Python\python3\notepad\notepad.py", line 47, in OnSave
dlg = wx.FileDialog(self, "名前を付けて保存", self.dirname, "", wx.FD_SAVE)
TypeError: FileDialog(): argument 5 has unexpected type 'int'
###コード

Python

1import os 2import wx 3 4class MainWindow(wx.Frame): 5 def __init__(self, parent, title): 6 wx.Frame.__init__(self, parent, title=title, size=(640, 480)) 7 self.control = wx.TextCtrl(self, style=wx.TE_MULTILINE) 8 self.CreateStatusBar() # ステータスバーはウィンドウ下部に表示される 9 10 # メニューを設定 11 filemenu = wx.Menu() 12 13 # wx.ID_ABOUTとwx.ID_EXITはwxWidgetによって提供される標準ID 14 menuOpen = filemenu.Append(wx.ID_OPEN, "&Open", " ファイルを開く") 15 menuSave = filemenu.Append(wx.ID_SAVE, "&Save", " 名前を付けて保存") 16 filemenu.AppendSeparator() 17 menuAbout = filemenu.Append(wx.ID_ABOUT, "&About", " このプログラムについて") # (訳者注)&の次の文字がショートカットキーになる 18 menuExit = filemenu.Append(wx.ID_EXIT, "&Exit", " プログラムを終了") 19 20 # メニューバーを生成 21 menuBar = wx.MenuBar() 22 menuBar.Append(filemenu, "&File") # メニューバーに「ファイル」メニューを追加 23 self.SetMenuBar(menuBar) # フレームコンテンツとしてメニューバーを追加 24 25 # イベントを設定 26 self.Bind(wx.EVT_MENU, self.OnOpen, menuOpen) 27 self.Bind(wx.EVT_MENU, self.OnSave, menuSave) 28 self.Bind(wx.EVT_MENU, self.OnAbout, menuAbout) 29 self.Bind(wx.EVT_MENU, self.OnExit, menuExit) 30 31 self.Show(True) 32 33 def OnOpen(self, e): 34 #ファイルを開く 35 self.dirname = '' 36 dlg = wx.FileDialog(self, "開く", self.dirname, "", "*.txt", wx.FD_OPEN) 37 if dlg.ShowModal() == wx.ID_OK: 38 self.filename = dlg.GetFilename() 39 self.dirname = dlg.GetDirectory() 40 f = open(os.path.join(self.dirname, self.filename), 'r', encoding='utf-8') 41 self.control.SetValue(f.read()) 42 f.close() 43 dlg.Destroy() 44 45 def OnSave(self, e): 46 self.dirname = '' 47 dlg = wx.FileDialog(self, "名前を付けて保存", self.dirname, "", wx.FD_SAVE) 48 if dlg.ShowModal() == wx.ID_OK: 49 self.filename = dlg.GetFilename() 50 self.dirname = dlg.GetDirectory() 51 f = open(os.path.join(self.dirname, self.filename), 'w', encoding='utf-8') 52 f.write(self.control.GetValue()) 53 f.close() 54 dlg.Destroy() 55 56 def OnAbout(self, e): 57 # OKボタンを持つメッセージダイアログを表示する.wx.OKはwx.Widgetの標準ID 58 dlg = wx.MessageDialog(self, "スモールテキストエディタ", "サンプルエディタについて", wx.OK) 59 dlg.ShowModal() # 表示 60 dlg.Destroy() # イベント終了時にインスタンスを破棄 61 62 def OnExit(self, e): 63 self.Close(True) # フレームをクローズ 64 65app = wx.App(False) 66frame = MainWindow(None, "サンプルエディタ") 67app.MainLoop()

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

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

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

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

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

guest

回答1

0

ベストアンサー

dlg = wx.FileDialog(self, "名前を付けて保存", self.dirname, "", wx.FD_SAVE)
TypeError: FileDialog(): argument 5 has unexpected type 'int'

◇エラーメッセージの見方
1行目がエラーが発生した行で、2行目が原因です。

◇ぐーぐる翻訳
TypeError: FileDialog(): 引数5に予期しない型があります 'int'

こういう時は公式ドキュメントをまず確認します。
公式ドキュメント→wx.FileDialog

エラーの原因は引数wildcardにwx.FD_SAVEを渡しているためです。
よってキーワード引数として明示的に位置を指定してくださいな。
以下のようなコードになります。

Python

1dlg = wx.FileDialog(self, "名前を付けて保存", os.getcwd(), "", style=wx.FD_SAVE)

◇余談
f = open(os.path.join(self.dirname, self.filename), 'w', encoding='utf-8')としていますが、
エラーが発生しても正しく動作するようにwith構文を使ってくださいな。

Python

1with open(os.path.join(self.dirname, self.filename), 'w', encoding='utf-8') as f: 2 f.write(self.control.GetValue())

投稿2018/05/05 11:48

umyu

総合スコア5846

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問