###前提・実現したいこと
wxPythonを使って、DnDしたときに画像を表示させるGUIを毎日少しずつ作成しています。GUIの基本的な質問になりますが、どうか皆様の力を貸してください。
###発生している問題・エラーメッセージ
現状では以下の2点の問題があります。
1.画像をロードしたときに、画像がズレる
2.DnDしたときに、ステータスバーにアドレスをうまく表示できない
Python
1File "G:\GUI_TEST\GUI_ask.py", line 27, in OnDropFiles 2 DnDFrame.setstatusbarTXT(filepath) 3TypeError: setstatusbarTXT() missing 1 required positional argument: 'msg'
###該当のソースコード
Python
1import wx 2import os 3import sys 4 5GUI_image_X = 240 6GUI_image_Y = 180 7 8######################################################################## 9class MyFileDropTarget(wx.FileDropTarget): 10 11 #---------------------------------------------------------------------- 12 def __init__(self, panel): 13 wx.FileDropTarget.__init__(self) 14 self.panel = panel 15 16 #---------------------------------------------------------------------- 17 def OnDropFiles(self, x, y, filenames): 18 for filepath in filenames: 19 # Get extention 20 extention = "." + str(str(filenames).split(".")[-1:][-1])[:-2] 21 wildcard = [".jpg",".jpeg",".png",".bmp",".mpg",".mpeg",".mp2",".mp4",".avi"] 22 23 if extention in wildcard: 24 # Do something 25 DnDF = DnDFrame() 26 DnDF.setstatusbarTXT(filepath) 27 DnDF.panel.updateImage(filepath) 28 DnDF.panel.updateText(filepath) 29 30 else: 31 # Ignore 32 DnDFrame.updateText("Not supported file.") 33 34 # Return True to accept the data, False to veto it. 35 return True 36 37######################################################################## 38class DnDPanel(wx.Panel): 39 40 #---------------------------------------------------------------------- 41 def __init__(self, parent): 42 wx.Panel.__init__(self, parent=parent) 43 file_drop_target = MyFileDropTarget(self) 44 45 # Image box 46 img = wx.Image(GUI_image_X,GUI_image_Y) 47 self.imageCtrl = wx.StaticBitmap(self, wx.ID_ANY,wx.Bitmap(img)) 48 49 # Text box 50 self.fileTextCtrl = wx.TextCtrl(self,style=wx.TE_MULTILINE|wx.HSCROLL|wx.TE_READONLY) 51 self.SetDropTarget(file_drop_target) 52 53 sizer = wx.BoxSizer(wx.HORIZONTAL) 54 sizer.Add(self.imageCtrl, 1, wx.ALL, 5) 55 sizer.Add(self.fileTextCtrl, 1, wx.EXPAND|wx.ALL, 5) 56 self.SetSizer(sizer) 57 self.Fit() 58 59 #---------------------------------------------------------------------- 60 def updateText(self, text): 61 #Overwtite a text 62 self.fileTextCtrl.SetValue(text) 63 64 #Add a text 65 #self.fileTextCtrl.WriteText(text) 66 67 #---------------------------------------------------------------------- 68 def updateImage(self, fileaddress): 69 self.imageCtrl = wx.StaticBitmap(self, wx.ID_ANY,wx.Bitmap(fileaddress)) 70 71######################################################################## 72class DnDFrame(wx.Frame): 73 74 #---------------------------------------------------------------------- 75 def __init__(self): 76 wx.Frame.__init__(self, parent=None, title="GUI test", style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER) 77 78 self.InitMenu() 79 self.panel = DnDPanel(self) 80 self.Fit() 81 self.Show() 82 83 #---------------------------------------------------------------------- 84 # Initialize 85 def InitMenu(self): 86 # Menubar 87 menubar = wx.MenuBar() 88 fileMenu = wx.Menu() 89 f_item1 = fileMenu.Append(wx.ID_ANY, '&Load file(L)', 'Load image file') 90 menubar.Append(fileMenu, '&File(F)') 91 92 self.SetMenuBar(menubar) 93 94 # Event call definition 95 self.Bind(wx.EVT_MENU, self.OnLoad, f_item1) 96 97 # Frame definition 98 self.Centre() 99 100 # Status bar 101 self.CreateStatusBar() 102 self.setstatusbarTXT("Please drop/load a image file.") 103 self.GetStatusBar().SetBackgroundColour(None) 104 105 self.Show(True) 106 107 #---------------------------------------------------------------------- 108 # Event hander: File loader 109 def OnLoad(self, event): 110 # Call a dialog 111 self.dirname = '' 112 wildcard = "Supported media files (*.jpg,*.jpeg,*.png,*.bmp,*.mpg,*.mpeg,*.mp2,*.mp4,*.avi))|*.jpg;*.jpeg;*.png;*.bmp;*.mpg;*.mpeg;*.mp2;*.mp4;*.avi" 113 dlg = wx.FileDialog(self, "Please select a file.", self.dirname,defaultFile="", wildcard=wildcard,style= wx.FD_OPEN ) 114 115 if dlg.ShowModal() == wx.ID_OK: 116 # Selected 117 self.filename = dlg.GetFilename() 118 self.dirname = dlg.GetDirectory() 119 with open(os.path.join(self.dirname, self.filename), 'r') as f: 120 self.panel.updateText(self.dirname + "\\" + self.filename) 121 self.panel.updateImage(self.dirname + "\\" + self.filename) 122 self.setstatusbarTXT(self.dirname + "\\" + self.filename) 123 124 else: 125 # Cancelled 126 self.panel.updateText("") 127 self.setstatusbarTXT("Please drop/load a image file.") 128 dlg.Destroy() 129 130 #---------------------------------------------------------------------- 131 # Event hander: set status text 132 def setstatusbarTXT(self, msg): 133 self.SetStatusText(msg) 134 135#---------------------------------------------------------------------- 136if __name__ == "__main__": 137 app = wx.App(False) 138 frame = DnDFrame() 139 app.MainLoop() 140
###試したこと
1.画像のズレの件
def updateImage(self, fileaddress)の部分が怪しかったため、sizer = wx.BoxSizer(wx.HORIZONTAL)のような感じのコードを挟みましたが、うまく位置を調整できませんでした。
2.ステータスバーの件 5/11更新
MyFileDropTargetのOnDropFilesの部分で新しいフレームに更新したステータスバーを表示するようにできました。この方法だと古いフレームが残っていてまだ削除できていない段階です。
###補足情報(言語/FW/ツール等のバージョンなど)
Win10(64bit)
Python 3.5.3(64bit)
wxPython 4.0.0a1 (Phoenix)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/05/11 13:10