質問編集履歴

1 自己解決に向けて一部コード修正、タイトル修正

退会済みユーザー

退会済みユーザー

2017/05/11 07:30  投稿

###前提・実現したいこと
wxPythonを使って、DnDしたときに画像を表示させるGUIを毎日少しずつ作成しています。GUIの基本的な質問になりますが、どうか皆様の力を貸してください。
###発生している問題・エラーメッセージ
現状では以下の2点の問題があります。
1.画像をロードしたときに、画像がズレる
2.DnDしたときに、ステータスバーにアドレスをうまく表示できない
***理想**
![理想](1e9d2ba258d7ce5d2debddefb4bbdd60.png)
***現実**
![現実](c0d5fd6f92cb6521db348ce0c17c2218.png)
```Python
File "G:\GUI_TEST\GUI_ask.py", line 27, in OnDropFiles
   DnDFrame.setstatusbarTXT(filepath)
TypeError: setstatusbarTXT() missing 1 required positional argument: 'msg'
```
###該当のソースコード
```Python
import wx
import os
import sys
GUI_image_X = 240
GUI_image_Y = 180
########################################################################
class MyFileDropTarget(wx.FileDropTarget):
   #----------------------------------------------------------------------
   def __init__(self, panel):
       wx.FileDropTarget.__init__(self)
       self.panel = panel
   #----------------------------------------------------------------------
   def OnDropFiles(self, x, y, filenames):
       for filepath in filenames:
           # Get extention
           extention = "." + str(str(filenames).split(".")[-1:][-1])[:-2]
           wildcard = [".jpg",".jpeg",".png",".bmp",".mpg",".mpeg",".mp2",".mp4",".avi"]
           if extention in wildcard:
               # Do something
               self.panel.updateImage(filepath)
               self.panel.updateText(filepath)
               DnDFrame.setstatusbarTXT(filepath)
               DnDF = DnDFrame()
               DnDF.setstatusbarTXT(filepath)
               DnDF.panel.updateImage(filepath)
               DnDF.panel.updateText(filepath)
           else:
               # Ignore
               DnDFrame.updateText("Not supported file.")
       # Return True to accept the data, False to veto it.
       return True
########################################################################
class DnDPanel(wx.Panel):
   #----------------------------------------------------------------------
   def __init__(self, parent):
       wx.Panel.__init__(self, parent=parent)
       file_drop_target = MyFileDropTarget(self)
       # Image box
       img = wx.Image(GUI_image_X,GUI_image_Y)
       self.imageCtrl = wx.StaticBitmap(self, wx.ID_ANY,wx.Bitmap(img))
       # Text box
       self.fileTextCtrl = wx.TextCtrl(self,style=wx.TE_MULTILINE|wx.HSCROLL|wx.TE_READONLY)
       self.SetDropTarget(file_drop_target)
       sizer = wx.BoxSizer(wx.HORIZONTAL)
       sizer.Add(self.imageCtrl, 1, wx.ALL, 5)
       sizer.Add(self.fileTextCtrl, 1, wx.EXPAND|wx.ALL, 5)
       self.SetSizer(sizer)
       self.Fit()
   #----------------------------------------------------------------------
   def updateText(self, text):
       #Overwtite a text
       self.fileTextCtrl.SetValue(text)
       #Add a text
       #self.fileTextCtrl.WriteText(text)
   #----------------------------------------------------------------------
   def updateImage(self, fileaddress):
       self.imageCtrl = wx.StaticBitmap(self, wx.ID_ANY,wx.Bitmap(fileaddress))
########################################################################
class DnDFrame(wx.Frame):
   #----------------------------------------------------------------------
   def __init__(self):
       wx.Frame.__init__(self, parent=None, title="GUI test", style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER)
       self.InitMenu()
       self.panel = DnDPanel(self)
       self.Fit()
       self.Show()
   #----------------------------------------------------------------------
   # Initialize
   def InitMenu(self):
       # Menubar
       menubar = wx.MenuBar()
       fileMenu = wx.Menu()
       f_item1 = fileMenu.Append(wx.ID_ANY, '&Load file(L)', 'Load image file')
       menubar.Append(fileMenu, '&File(F)')
       self.SetMenuBar(menubar)
       # Event call definition
       self.Bind(wx.EVT_MENU, self.OnLoad, f_item1)
       # Frame definition
       self.Centre()
       # Status bar
       self.CreateStatusBar()
       self.setstatusbarTXT("Please drop/load a image file.")
       self.GetStatusBar().SetBackgroundColour(None)
       self.Show(True)
   #----------------------------------------------------------------------
   # Event hander: File loader
   def OnLoad(self, event):
       # Call a dialog
       self.dirname = ''
       wildcard = "Supported media files (*.jpg,*.jpeg,*.png,*.bmp,*.mpg,*.mpeg,*.mp2,*.mp4,*.avi))|*.jpg;*.jpeg;*.png;*.bmp;*.mpg;*.mpeg;*.mp2;*.mp4;*.avi"
       dlg = wx.FileDialog(self, "Please select a file.", self.dirname,defaultFile="", wildcard=wildcard,style= wx.FD_OPEN )
       if dlg.ShowModal() == wx.ID_OK:
           # Selected
           self.filename = dlg.GetFilename()
           self.dirname = dlg.GetDirectory()
           with open(os.path.join(self.dirname, self.filename), 'r') as f:
               self.panel.updateText(self.dirname + "\\" + self.filename)
               self.panel.updateImage(self.dirname + "\\" + self.filename)
               self.setstatusbarTXT(self.dirname + "\\" + self.filename)
       else:
           # Cancelled
           self.panel.updateText("")
           self.setstatusbarTXT("Please drop/load a image file.")
       dlg.Destroy()
   #----------------------------------------------------------------------
   # Event hander: set status text
   def setstatusbarTXT(self, msg):
       self.SetStatusText(msg)
#----------------------------------------------------------------------
if __name__ == "__main__":
   app = wx.App(False)
   frame = DnDFrame()
   app.MainLoop()
```
###試したこと
**1.画像のズレの件**
def updateImage(self, fileaddress)の部分が怪しかったため、sizer = wx.BoxSizer(wx.HORIZONTAL)のような感じのコードを挟みましたが、うまく位置を調整できませんでした。
**2.ステータスバーの件**
def setstatusbarTXT(self, msg)の部分が怪しかったため、selfの部分やdef __init__をいじりましたが、こちらもうまく調整できませんでした
**2.ステータスバーの件** 5/11更新
MyFileDropTargetのOnDropFilesの部分で新しいフレームに更新したステータスバーを表示するようにできました。この方法だと古いフレームが残っていてまだ削除できていない段階です
###補足情報(言語/FW/ツール等のバージョンなど)
Win10(64bit) 
Python 3.5.3(64bit) 
wxPython 4.0.0a1 (Phoenix)
  • Python 3.x

    16453 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る