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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2333閲覧

wxPythonでPanelの再描写が出来ない

s_koya

総合スコア25

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/03/29 08:05

wxPythonでGUI作成の練習をしていたのですが、Panelの再描写が上手く行きません。
Panelの中に背景色と同色のPanelを重ね、疑似的な正方形の枠を描写し、それを一定の範囲内ならマウス操作で自由に動かせるようにしたいのですが、枠の描写が安定せず移動した際に一定の形を保ってくれません。
最小化して再度描写すると正しい形に戻ってくれるので、リフレッシュ処理を追加すれば良いと考えたのですが、Panelに対してUpdate()関数を実行しても効果はありませんでした。
何か解決方法があればご教授いただければと思います。よろしくお願い致します。

Python

1import wx 2 3class MainFrame(wx.Frame): 4 def __init__(self): 5 app_size = (320, 240) 6 wx.Frame.__init__(self, None, -1, 'Title', size=app_size) 7 8 preview_size = int(app_size[0] / 2), int(app_size[1] / 2) 9 preview_panel = wx.Panel(self, size=preview_size) 10 preview_panel.SetBackgroundColour('gray') 11 12 valid_size = (preview_size[0] / 2, preview_size[1] / 2) 13 valid_view_panel = wx.Panel( 14 preview_panel, 15 size=valid_size, 16 pos=(0,0), 17 ) 18 valid_view_panel.SetBackgroundColour('cadet blue') 19 20 view_border_panel = wx.Panel( 21 preview_panel, 22 size=(valid_size[0] - 10, valid_size[1] - 10), 23 pos=(5, 5), 24 ) 25 view_border_panel.SetBackgroundColour('cornflower blue') 26 WindowDragger(valid_view_panel, view_border_panel, preview_size) 27 28 29class WindowDragger(wx.Frame): 30 def __init__(self, window, border, preview_size): 31 self.window = window 32 self.border = border 33 self.preview_size = preview_size 34 self.isDragStarted = False 35 self.max_size = self.window.GetSize()[-2:] 36 self.min_size = (30, 30) 37 38 self.window.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) 39 self.window.Bind(wx.EVT_LEFT_UP, self.OnLeftUp) 40 self.window.Bind(wx.EVT_MOTION, self.on_mouse_move) 41 42 43 def OnLeftDown(self, evt): 44 self.isDragStarted = True 45 self.window.CaptureMouse() 46 self.prev_mouse_pos = evt.GetPosition() 47 evt.Skip() 48 49 50 def OnLeftUp(self, evt): 51 self.isDragStarted = False 52 if self.window.HasCapture(): 53 self.window.ReleaseMouse() 54 evt.Skip() 55 56 57 def on_mouse_move(self, evt): 58 if evt.Dragging() and evt.LeftIsDown() and self.isDragStarted: 59 mouse_pos = evt.GetPosition() 60 wnd_pos = self.window.GetPosition() 61 move_pos = wnd_pos - (self.prev_mouse_pos - mouse_pos) 62 win_size = self.window.GetSize()[-2:] 63 dwg_rng = [move_pos[i] + win_size[i] for i in range(2)] 64 vld_rng = self.preview_size 65 66 if dwg_rng[0] > vld_rng[0]: 67 move_pos[0] = vld_rng[0] - win_size[0] 68 elif move_pos[0] < 0: 69 move_pos[0] = 0 70 71 if dwg_rng[1] > vld_rng[1]: 72 move_pos[1] = vld_rng[1] - win_size[1] 73 elif move_pos[1] < 0: 74 move_pos[1] = 0 75 76 self.window.SetPosition(move_pos) 77 self.border.SetPosition((move_pos[0] + 5, move_pos[1] + 5)) 78 79 self.window.Update() 80 self.border.Update() 81 evt.Skip() 82 83 84 85if __name__ == '__main__': 86 app = wx.PySimpleApp() 87 MainFrame().Show() 88 app.MainLoop()

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

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

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

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

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

guest

回答1

0

ベストアンサー

親ウィジェットの Refresh で再描画できます

self.window.Parent.Refresh()

class WindowDragger(wx.Frame):

wx.Frame を継承してますが、親クラスのコンストラクタは呼ばれていない為、
不要な継承になってます。

投稿2022/03/30 04:23

teamikl

総合スコア8664

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

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

s_koya

2022/03/31 07:58

回答ありがとうございます。 親ウィジェットをRefreshすることで目的としていた動作になりました。 また継承の件もご指摘ありがとうございます。サンプルコードから引っ張ってきたものを消し忘れていたようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問