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

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

ただいまの
回答率

90.52%

  • Python 3.x

    6341questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 320

T_www

score 5

実現したいこと

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'

コード

import os
import wx

class MainWindow(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(640, 480))
        self.control = wx.TextCtrl(self, style=wx.TE_MULTILINE)
        self.CreateStatusBar() # ステータスバーはウィンドウ下部に表示される

        # メニューを設定
        filemenu = wx.Menu()

        # wx.ID_ABOUTとwx.ID_EXITはwxWidgetによって提供される標準ID
        menuOpen = filemenu.Append(wx.ID_OPEN, "&Open", " ファイルを開く")
        menuSave = filemenu.Append(wx.ID_SAVE, "&Save", " 名前を付けて保存")
        filemenu.AppendSeparator()
        menuAbout = filemenu.Append(wx.ID_ABOUT, "&About", " このプログラムについて") # (訳者注)&の次の文字がショートカットキーになる
        menuExit = filemenu.Append(wx.ID_EXIT, "&Exit", " プログラムを終了")

        # メニューバーを生成
        menuBar = wx.MenuBar()
        menuBar.Append(filemenu, "&File") # メニューバーに「ファイル」メニューを追加
        self.SetMenuBar(menuBar) # フレームコンテンツとしてメニューバーを追加

        # イベントを設定
        self.Bind(wx.EVT_MENU, self.OnOpen, menuOpen)
        self.Bind(wx.EVT_MENU, self.OnSave, menuSave)
        self.Bind(wx.EVT_MENU, self.OnAbout, menuAbout)
        self.Bind(wx.EVT_MENU, self.OnExit, menuExit)

        self.Show(True)

    def OnOpen(self, e):
        #ファイルを開く
        self.dirname = ''
        dlg = wx.FileDialog(self, "開く", self.dirname, "", "*.txt", wx.FD_OPEN)
        if dlg.ShowModal() == wx.ID_OK:
            self.filename = dlg.GetFilename()
            self.dirname = dlg.GetDirectory()
            f = open(os.path.join(self.dirname, self.filename), 'r', encoding='utf-8')
            self.control.SetValue(f.read())
            f.close()
        dlg.Destroy()

    def OnSave(self, e):
        self.dirname = ''
        dlg = wx.FileDialog(self, "名前を付けて保存", self.dirname, "", wx.FD_SAVE)
        if dlg.ShowModal() == wx.ID_OK:
            self.filename = dlg.GetFilename()
            self.dirname = dlg.GetDirectory()
            f = open(os.path.join(self.dirname, self.filename), 'w', encoding='utf-8')
            f.write(self.control.GetValue())
            f.close()
        dlg.Destroy()

    def OnAbout(self, e):
        # OKボタンを持つメッセージダイアログを表示する.wx.OKはwx.Widgetの標準ID
        dlg = wx.MessageDialog(self, "スモールテキストエディタ", "サンプルエディタについて", wx.OK)
        dlg.ShowModal() # 表示
        dlg.Destroy() # イベント終了時にインスタンスを破棄

    def OnExit(self, e):
        self.Close(True) # フレームをクローズ

app = wx.App(False)
frame = MainWindow(None, "サンプルエディタ")
app.MainLoop()
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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を渡しているためです。
よってキーワード引数として明示的に位置を指定してくださいな。
以下のようなコードになります。

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • Python 3.x

    6341questions

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