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

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

新規登録して質問してみよう
ただいま回答率
85.35%
ダイアログ

ユーザーにウィンドウやボックス等の形で個別で表示されるフォームであり、ユーザーに判断を促す目的で表示される。ユーザーが見逃す事のないよう、操作中のフォーム上にポップアップして表示される。

パス

パス(path)はファイルシステムの場所(階層)を明示したものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1421閲覧

python wxCheckListBoxでフォルダ選択ボタンの動作設定

hiro04kon

総合スコア46

ダイアログ

ユーザーにウィンドウやボックス等の形で個別で表示されるフォームであり、ユーザーに判断を促す目的で表示される。ユーザーが見逃す事のないよう、操作中のフォーム上にポップアップして表示される。

パス

パス(path)はファイルシステムの場所(階層)を明示したものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/05/15 09:40

編集2021/05/15 09:44

前提・実現したいこと

初心者です。python3で、wxFormBuilderを使いGUIを作りました。
イメージ説明
ボタンでフォルダの選択を選択した後、そのパスをGUI上で変更したいのです。
wxFormBuilderにて、「folder1.py」と「Folder1folder1Frame1.py」を作り、
ネット上の記事を参考に、後者に更新の記述をしましたが、動作しませんでした。

エラーコード

python

1AttributeError: 'NoneType' object has no attribute '_root'

以下がsorceです。
「folder1.py」

python

1 2# -*- coding: utf-8 -*- 3 4import wx 5import wx.xrc 6 7########################################################################### 8## Class folder1Frame1 9########################################################################### 10 11class folder1Frame1 ( wx.Frame ): 12 13 def __init__( self, parent ): 14 wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size( 412,152 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL ) 15 16 self.SetSizeHints( wx.DefaultSize, wx.DefaultSize ) 17 18 bSizer1 = wx.BoxSizer( wx.VERTICAL ) 19 20 self.folder1_pass = wx.StaticText( self, wx.ID_ANY, u"folder1_path", wx.DefaultPosition, wx.DefaultSize, 0 ) 21 self.folder1_pass.Wrap( -1 ) 22 23 bSizer1.Add( self.folder1_pass, 0, wx.ALL, 5 ) 24 25 self.folder1_select_button = wx.Button( self, wx.ID_ANY, u"フォルダを選択", wx.DefaultPosition, wx.DefaultSize, 0 ) 26 bSizer1.Add( self.folder1_select_button, 0, wx.ALL, 5 ) 27 28 29 self.SetSizer( bSizer1 ) 30 self.Layout() 31 32 self.Centre( wx.BOTH ) 33 34 # Connect Events 35 self.folder1_select_button.Bind( wx.EVT_BUTTON, self.folder1_select_buttonOnButtonClick ) 36 37 def __del__( self ): 38 pass 39 40 41 # Virtual event handlers, overide them in your derived class 42 def folder1_select_buttonOnButtonClick( self, event ): 43 event.Skip() 44

「Folder1folder1Frame1.py」

python

1"""Subclass of folder1Frame1, which is generated by wxFormBuilder.""" 2 3import wx 4import folder1 5import tkinter 6from tkinter import messagebox 7from tkinter import filedialog 8from tkinter import ttk 9from folder1 import folder1Frame1 10 11# Implementing folder1Frame1 12class Folder1folder1Frame1( folder1.folder1Frame1 ): 13 def __init__( self, parent ): 14 folder1.folder1Frame1.__init__( self, parent ) 15 16 # Handlers for folder1Frame1 events. 17 def folder1_select_buttonOnButtonClick( self, event ): 18 # TODO: Implement folder1_select_buttonOnButtonClick 19       ####ここを追加1##### 20 path = "folder1_path" 21 path = filedialog.askdirectory(initialdir = path ) 22       ####ここまで#### 23 pass 24 25if __name__ == '__main__': 26 app = wx.App(False) 27 frame = folder1Frame1(None) 28 frame.Show(True) 29 app.MainLoop() 30 31####ここを追加2#### 32def ask_folder(): 33 #フォルダを選択の動作 34 path = filedialog.askdirectory() 35 folder1_path.set(path) 36 37# パラメータ 38folder1_path = tkinter.StringVar() 39 40# ウィジェット(フォルダ名) 41folder_box = ttk.Entry(folder1Frame1, textvariable=folder1_path)

また、ボタンを押してもフォルダ選択ダイアログも出ません。
勉強不足なのは重々承知で、お知恵を貸してください。

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

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

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

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

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

guest

回答2

0

エラーに行番号は出てませんか?

問題点: wxPython と tkinter を同時に使おうとしてるので、
wxPython を使う場合は、wxPython の提供するファイル選択ダイアログ (wx.FileDialog) を使う必要があります。

_root は tkinter 関連のコードだと思いますが、
双方のGUIライブラリを混在させて使うのは、様々な問題があるのでお勧めしません。
tkinter 関連のコードは、可能なら wxPython に移植した方が良いです。

また、app.MainLoop() の後に追加されたコードは、
ウィンドウが閉じられるまで実行されないことに注意してください。
MainLoop は GUI が表示されている間、描画やイベント処理等を行うループです。

投稿2021/05/15 10:11

teamikl

総合スコア8760

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

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

hiro04kon

2021/05/15 11:53

早速のアドバイスありがとうございます。 なるほど、2つのGUI関連のものを使おうとしているので、うまく動かいないことも 考えられますね。 >app.MainLoop() の後に追加されたコードは、ウィンドウが閉じられるまで実行されない なるほどです。そうなんですね。よく考えたらそうでした…。 ご指摘ありがとうございます。 もう一度コードを書き直します。
guest

0

自己解決

「folder1.py」の“def folder1_select_buttonOnButtonClick( self, event ):“に以下を記述で動作しました。

python

1 2folder = wx.DirDialog(self, style=wx.DD_CHANGE_DIR,message="保存先フォルダ") 3if folder.ShowModal() == wx.ID_OK: 4 folder_path = folder.GetPath() 5folder.Destroy() 6self.folder1_pass.SetLabel(folder_path) 7event.Skip() 8 9 10if __name__ == '__main__': 11 app = wx.App(False) 12 frame = folder1Frame1(None) 13 frame.Show(True) 14 app.MainLoop()

ただし、「Folder1folder1Frame1.py」のボタンイベントに同様のものを書き加えても、
ボタンを押しても何も動作しませんでした。エラーも出ません。謎でした。

python3

1 2def folder1_select_buttonOnButtonClick( self, event ): 3 folder = wx.DirDialog(self, style=wx.DD_CHANGE_DIR,message="保存先フォルダ") 4 if folder.ShowModal() == wx.ID_OK: 5 folder_path = folder.GetPath() 6 folder.Destroy() 7 self.folder1_pass.SetLabel(folder_path) 8 pass 9 10if __name__ == '__main__': 11 app = wx.App(False) 12 frame = folder1Frame1(None) 13 frame.Show(True) 14 app.MainLoop() 15

投稿2021/05/17 01:35

hiro04kon

総合スコア46

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

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

teamikl

2021/05/17 02:08

サブクラスでメソッドをオーバーライドした(はず)が、 サブクラス側のメソッドが認識されてない、ということですよね。 こちらの回答に掲載のコードでは、コードのインデントが正しくなく クラス内に書いたはずが、クラス外に書かれてて、メソッドになってない可能性があります。 質問のコードを編集する形で記載して見て下さい。
hiro04kon

2021/05/17 11:11

回答ありがとうございます。 インデントは、見てくれのために、1段あげていました。 解決したので報告を。 サブクラスの 「frame = folder1Frame1(None)」のミスでした。 本当は、「frame = Folder1folder1Frame1(None)」でした。 単純なミスでした。ご助言ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問