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

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

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

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

Q&A

解決済

1回答

2940閲覧

wxpythonで作成したGUIにドラッグアンドドロップした画像を削除する方法

able

総合スコア7

Python 3.x

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

0グッド

0クリップ

投稿2020/11/30 14:06

前提・実現したいこと

現在、wxpythonで画像をドラッグアンドドロップするGUIを作成しています。
画像をドラッグアンドドロップで貼り付けることには成功したのですが、貼り付けた画像をクリアボタンで削除することがうまくできません。どのようにすれば良いかご教授いただけると幸いです。
よろしくお願い致します。

該当のソースコード

python

1import wx 2 3class FileDropTarget(wx.FileDropTarget):#ドラッグアンドドロップの設定 4 def __init__(self, window): 5 wx.FileDropTarget.__init__(self) 6 self.window = window 7 8 def OnDropFiles(self, x, y, filenames):# ドロップした画像の操作 9 panelsize = self.window.panel_1.GetSize()# ドロップしたパネルのサイズ取得 10 for file in filenames: 11 self.window.text_ctrl_1.SetValue(file) #画像パスをテキストボックスに入力 12 image = wx.Image(file) #画像をimageに格納 13 resizeimge = image.Scale(panelsize[0],panelsize[1],wx.IMAGE_QUALITY_HIGH) #imageに格納した画像をパネルのサイズにScaleで調整 14 item = wx.StaticBitmap(self.window.panel_1, -1, wx.Bitmap(resizeimge))#resizeimgeをwx.Bitmapに変更しwx.StaticBitmapで貼り付 15 self.item = item 16 return True 17 18 19class MyFrame(wx.Frame): 20 def __init__(self, *args, **kwds): 21 kwds["style"] = kwds.get("style", 0) | wx.DEFAULT_FRAME_STYLE 22 wx.Frame.__init__(self, *args, **kwds) 23 self.item = None 24 self.SetSize((500, 500)) 25 self.panel_1 = wx.Panel(self, wx.ID_ANY) 26 self.text_ctrl_1 = wx.TextCtrl(self, wx.ID_ANY, "") 27 self.clearbutton = wx.Button(self, wx.ID_ANY, u"クリア") 28 29 dt = FileDropTarget(self) 30 self.panel_1.SetDropTarget(dt) 31 32 self.__set_properties() 33 self.__bind() 34 self.__do_layout() 35 36 def __set_properties(self): 37 self.SetTitle("frame") 38 self.SetBackgroundColour(wx.Colour(255, 252, 180)) 39 self.panel_1.SetMinSize((400, 400)) 40 self.panel_1.SetBackgroundColour(wx.Colour(192, 192, 192)) 41 self.text_ctrl_1.SetMinSize((111, 23)) 42 43 def __bind(self): 44 self.clearbutton.Bind(wx.EVT_BUTTON, self.OnClearButton) 45 46 def __do_layout(self): 47 sizer_1 = wx.BoxSizer(wx.VERTICAL) 48 sizer_1.Add((20, 20), 0, 0, 0) 49 sizer_1.Add(self.panel_1, 6, wx.EXPAND, 0) 50 sizer_1.Add(self.text_ctrl_1, 0, wx.EXPAND, 0) 51 sizer_1.Add((20, 20), 0, 0, 0) 52 sizer_1.Add(self.clearbutton, 0, wx.ALIGN_CENTER_HORIZONTAL, 0) 53 sizer_1.Add((20, 20), 0, 0, 0) 54 self.SetSizer(sizer_1) 55 self.Layout() 56 57 def OnClearButton(self, event): 58 # x = FileDropTarge(self) 59 if self.text_ctrl_1.GetValue() != "": 60 self.text_ctrl_1.Clear() 61 # x.item.Destroy() 62 63class MyApp(wx.App): 64 def OnInit(self): 65 self.frame = MyFrame(None, wx.ID_ANY, "") 66 self.SetTopWindow(self.frame) 67 self.frame.Show() 68 return True 69 70# end of class MyApp 71 72if __name__ == "__main__": 73 app = MyApp(0) 74 app.MainLoop()

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

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

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

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

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

guest

回答1

0

ベストアンサー

問題点
ドロップターゲットの item 属性に StaticBitmap を保持させてます。
x = FileDropTarge(self) は、別インスタンスなので、
作成済みの StaticBitmap にはアクセスできません。


解決策

StaticBitmap を MainFrame の item 属性にします。

diff

1- self.item = item 2+ self.window.item = item

python

1 def OnClearButton(self, event): 2 ... 3 self.item.Destroy()

他の実装案: 毎回作成~破棄(Destroy)するのではなく、
予め StaticBitmap ウィジェットは作成しておき、
SetBitmap ウィジェットで画像を切り替える。クリアする場合は wx.NullBitmap を渡します。
毎回作成するのは Bitmap オブジェクト迄で良い。

python

1# ウィジェット生成 2item = wx.StaticBitmap(panel) 3 4# 表示画像を変更 5item.SetBitmap(bitmap) 6 7# 表示画像のクリア 8item.SetBitmap(wx.NullBitmap)

投稿2020/12/01 00:01

編集2020/12/01 00:14
teamikl

総合スコア8664

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

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

able

2020/12/01 12:53

teamikl様 いつも丁寧な回答をいただきありがとうございます。 他の実装案もご提示していただいたおかげでより効率的にすることができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問