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

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

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

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

Q&A

解決済

1回答

7326閲覧

wxPythonにおいて、ステータスバーと画像を更新したい

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

0グッド

0クリップ

投稿2017/05/10 14:14

編集2017/05/10 22:30

###前提・実現したいこと
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)

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

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

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

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

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

guest

回答1

0

ベストアンサー

とりあえず、ステータスバーの件は

Python

1 if extention in wildcard: 2 # Do something 3 DnDF = DnDFrame() 4 DnDF.setstatusbarTXT(filepath) 5 DnDF.panel.updateImage(filepath) 6 DnDF.panel.updateText(filepath)

の部分を

Python

1 if extention in wildcard: 2 # Do something 3 self.panel.updateImage(filepath) 4 self.panel.updateText(filepath) 5 self.panel.GetTopLevelParent().setstatusbarTXT(filepath)

でいけると思います。

簡単に説明すると、GetTopLevelParent() にてトップレベルのFrameを得ることができるので、setstatusbarTXT()を呼ぶことができます。

今回の場合は Panel の親が Frame なので、単純に self.panel.GetParent().setstatusbarTXT(filepath) でも問題ありません。

次に画像のズレの件ですが、こちらは現象が再現できていないので、とりあえず問題のありそうな場所の指摘だけ。

Python

1 def updateImage(self, fileaddress): 2 self.imageCtrl = wx.StaticBitmap(self, wx.ID_ANY,wx.Bitmap(fileaddress))

の部分ですが、このように記述すると、Widget(StaticBitmap)自体を置き換えてしまいますので、Widgetのサイズ情報や位置情報が引き継がれる保障はありません。

Python

1 def updateImage(self, fileaddress): 2 self.imageCtrl.SetBitmap(wx.Bitmap(fileaddress))

のようにWidgetは現状のまま、表示する写真のみをアップデートするべきかと思います。

投稿2017/05/11 04:08

magichan

総合スコア15898

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

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

退会済みユーザー

退会済みユーザー

2017/05/11 13:10

丁寧な解説を頂きありがとうございます。 何が問題で上手く動かなかったのか、どうすれば動くのか、どの関数が良いのかまでがセットになっていましたので、大変分かりやすい説明でした。 教えて頂いた方法で正しくGUIが動くことが確認できました。 今後ともよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問