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

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

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

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

Q&A

解決済

1回答

4971閲覧

wxPythonにおけるテキストボックスへのテキストの表示

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

0グッド

0クリップ

投稿2017/05/05 23:35

編集2017/05/05 23:40

###前提・実現したいこと
ドラッグアンドドロップまたはダイアログでファイルを選択した際に、テキストボックスにファイルのアドレスを表示させようとしています。

###発生している問題・エラーメッセージ
ファイルをダイアログから選択した場合にテキストボックスにファイルのアドレスを表示できません。

AttributeError: type object 'DnDPanel' has no attribute 'fileTextCtrl'

###該当のソースコード

Python

1import wx 2import os 3 4######################################################################## 5class MyFileDropTarget(wx.FileDropTarget): 6 """""" 7 8 #---------------------------------------------------------------------- 9 def __init__(self, window): 10 """Constructor""" 11 wx.FileDropTarget.__init__(self) 12 self.window = window 13 14 #---------------------------------------------------------------------- 15 def OnDropFiles(self, x, y, filenames): 16 for filepath in filenames: 17 self.window.updateText(filepath + '\n') 18 19 # Return True to accept the data, False to veto it. 20 return True 21 22 23######################################################################## 24class DnDPanel(wx.Panel): 25 26 #---------------------------------------------------------------------- 27 def __init__(self, parent): 28 wx.Panel.__init__(self, parent=parent) 29 file_drop_target = MyFileDropTarget(self) 30 self.fileTextCtrl = wx.TextCtrl(self,style=wx.TE_MULTILINE|wx.HSCROLL|wx.TE_READONLY) 31 self.fileTextCtrl.SetDropTarget(file_drop_target) 32 33 sizer = wx.BoxSizer(wx.VERTICAL) 34 sizer.Add(self.fileTextCtrl, 1, wx.EXPAND|wx.ALL, 5) 35 self.SetSizer(sizer) 36 37 #---------------------------------------------------------------------- 38 def updateText(self, text): 39 #Overwtite a text 40 self.fileTextCtrl.SetValue(text) 41 #Add a text 42 #self.fileTextCtrl.WriteText(text) 43 44######################################################################## 45class DnDFrame(wx.Frame): 46 47 #---------------------------------------------------------------------- 48 def __init__(self): 49 wx.Frame.__init__(self, parent=None, title="GUI test") 50 51 self.InitMenu() 52 53 panel = DnDPanel(self) 54 self.Show() 55 56 #---------------------------------------------------------------------- 57 def InitMenu(self): 58 # Menubar 59 menubar = wx.MenuBar() 60 fileMenu = wx.Menu() 61 f_item1 = fileMenu.Append(wx.ID_ANY, '&Load file(L)', 'Load image file') 62 fileMenu.AppendSeparator() 63 f_item3 = fileMenu.Append(wx.ID_ANY, '&Quit(Q)', 'Quit application') 64 menubar.Append(fileMenu, '&File(F)') 65 66 helpMenu = wx.Menu() 67 h_item1 = helpMenu.Append(wx.ID_ANY, '&About(A)', 'About this program') 68 menubar.Append(helpMenu, '&Help(H)') 69 70 self.SetMenuBar(menubar) 71 72 self.Bind(wx.EVT_MENU, self.OnLoad, f_item1) 73 self.Bind(wx.EVT_MENU, self.OnQuit, f_item3) 74 self.Bind(wx.EVT_MENU, self.OnAbout, h_item1) 75 76 self.SetSize((300, 250)) 77 self.SetTitle('GUI tester') 78 self.Centre() 79 80 # Status bar 81 self.CreateStatusBar() 82 self.SetStatusText("Please drop/load a image file.") 83 self.GetStatusBar().SetBackgroundColour(None) 84 85 self.Show(True) 86 87 #---------------------------------------------------------------------- 88 def OnLoad(self, event): 89 # Call dialog 90 self.dirname = '' 91 dlg = wx.FileDialog(self, "Please select a file.", self.dirname, "", "*.*", wx.FD_OPEN ) 92 93 # Selected 94 if dlg.ShowModal() == wx.ID_OK: 95 self.filename = dlg.GetFilename() 96 self.dirname = dlg.GetDirectory() 97 with open(os.path.join(self.dirname, self.filename), 'r') as f: 98 self.SetStatusText(self.dirname + "\\" + self.filename) 99 DnDPanel.updateText(wx.Panel,self.dirname + "\\" + self.filename + '\n') 100 101 # Cancelled 102 else: 103 self.SetStatusText("Please drop/load a image file.") 104 dlg.Destroy() 105 106 #---------------------------------------------------------------------- 107 # Event: Quit 108 def OnQuit(self, event): 109 self.Close() 110 111 #---------------------------------------------------------------------- 112 # Event: About 113 def OnAbout(self, event): 114 box=wx.MessageDialog(None,'HOOAH!','About this program',wx.OK) 115 anser=box.ShowModal() 116 117#---------------------------------------------------------------------- 118if __name__ == "__main__": 119 app = wx.App(False) 120 frame = DnDFrame() 121 app.MainLoop() 122

###試したこと
ここ数日間延べ10時間近くgoogleで検索しながらstackoverflowなどの先行事例を調べて調整しましたがうまくいきませんでした。

###補足情報(言語/FW/ツール等のバージョンなど)
Win10(64bit)
Python 3.5.3(64bit)
wxPython 4.0.0a1 (Phoenix)

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

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

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

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

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

guest

回答1

0

ベストアンサー

OnLoadにて、fileTextCtrlを追加したDnDPanelのインスタンス変数に対してではなく、wx.Panelに対してメンバ関数updateTextを呼んでいるようです。

以下のようにfileTextCtrlを追加したインスタンス変数を利用するように修正することで、正常に動作するかと思います(動作は未確認)。

Python

1# (略) 2class DnDFrame(wx.Frame): 3 # (略) 4 def __init__(self): 5 # (略) 6 #panel = DnDPanel(self) 7 self.panel = DnDPanel(self) # Frameのメンバ変数に 8 9 # (略) 10 def OnLoad(self, event): 11 # (略) 12 with open(os.path.join(self.dirname, self.filename), 'r') as f: 13 # (略) 14 # DnDPanel.updateText(wx.Panel,self.dirname + "\\" + self.filename + '\n') 15 self.panel.updateText(self.dirname + "\\" + self.filename + '\n') # メンバ変数のpanelのメンバ関数'updateText'を呼ぶ

投稿2017/05/06 03:17

can110

総合スコア38262

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

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

退会済みユーザー

退会済みユーザー

2017/05/06 09:00

早々のご回答を頂ありがとうございます。 先ほど動作確認をしたところ、完璧に動作しました。 テキスト表示の部分を画像表示にしたり、 別の動作に挿げ替えるだけでもっと面白い動きがさせられそうです。 今後ともよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問