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

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

ただいまの
回答率

90.50%

  • Python 3.x

    6412questions

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

【Python3.6.5】【wxPython】

解決済

回答 1

投稿

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

T_www

score 5

実現したいこと

wxPythonを用いてタブ機能を付け、その中にTextCtrlを実装。

問題

※色々なサイトを参考にしてます。 ※公式ドキュメントも見ました。
タブ機能を実況するのは成功したのですが、TextCtrlがちっちゃく表示される。

コード

import os
import wx

class MainWindow(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(640, 480))
        self.instance = wx.SingleInstanceChecker(self.GetTitle()) # 二重起動の防止
        if self.instance.IsAnotherRunning():
            dialog = wx.MessageDialog(None, '%sはすでに起動中です。' % self.GetTitle(), 'エラー', wx.ICON_ERROR)
            dialog.ShowModal()
            dialog.Destroy()
            wx.Exit()
        notebook = wx.Notebook(self, wx.ID_ANY)

        panel1 = wx.Panel(notebook, wx.ID_ANY)
        panel1.SetBackgroundColour(wx.WHITE)

        panel2 = wx.Panel(notebook, wx.ID_ANY)
        panel2.SetBackgroundColour(wx.WHITE)

        notebook.InsertPage(0, panel1, "エディタ")
        notebook.InsertPage(1, panel2, "設定")
        self.control = wx.TextCtrl(panel1, 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, "名前を付けて保存", os.getcwd(), "", style=wx.FD_SAVE)
        if dlg.ShowModal() == wx.ID_OK:
            self.filename = dlg.GetFilename()
            self.dirname = dlg.GetDirectory()
            with open(os.path.join(self.dirname, self.filename), 'w', encoding='utf-8') as f:
                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ベストアンサー

0

panel1 に Sizerを設置して、TextCtrlの配置を panel1全体になるように設定するとよいかと思います。

以下は、BoxSizer を使った場合の変更例です。

import os
import wx

class MainWindow(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(640, 480))
        self.instance = wx.SingleInstanceChecker(self.GetTitle()) # 二重起動の防止
        if self.instance.IsAnotherRunning():
            dialog = wx.MessageDialog(None, '%sはすでに起動中です。' % self.GetTitle(), 'エラー', wx.ICON_ERROR)
            dialog.ShowModal()
            dialog.Destroy()
            wx.Exit()
        notebook = wx.Notebook(self, wx.ID_ANY)

        panel1 = wx.Panel(notebook, wx.ID_ANY)
        panel1.SetBackgroundColour(wx.WHITE)

        panel2 = wx.Panel(notebook, wx.ID_ANY)
        panel2.SetBackgroundColour(wx.WHITE)

        notebook.InsertPage(0, panel1, "エディタ")
        notebook.InsertPage(1, panel2, "設定")
        self.control = wx.TextCtrl(panel1, style=wx.TE_MULTILINE)

        ### 下の3行を追加 ###
        sizer1 = wx.BoxSizer(wx.VERTICAL)
        sizer1.Add(self.control, 1, wx.EXPAND)
        panel1.SetSizer(sizer1)

        self.CreateStatusBar() # ステータスバーはウィンドウ下部に表示される
        ### 以下省略 ###

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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

  • Python 3.x

    6412questions

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