3

フレームのサイズがいつ変更されたかを知りたいので、サイズを保存して、次にアプリケーションを起動したときにそれを記憶できるようにします。これが私のon_resize方法です:

def on_resize(self, event):
    logic.config_set('main_frame_size',
                     (event.Size.width, event.Size.height))

    event.Skip()

そして、次のようにバインドされています。

self.Bind(wx.EVT_SIZE, self.on_resize)

問題はパフォーマンスです。安全のために、私のロジック モジュールは設定が変更されるたびに構成ファイルを保存します。また、サイズ変更イベントが発生するたびに構成ファイルを書き込むのは、パフォーマンスに負担がかかりすぎます。

ユーザーがフレームのサイズ変更を完了したときに監視するための最良/最も簡単な方法は何ですか?


アップデート

私のconfig_set機能:

def config_set(key, value):
    """Set a value to the config file."""
    vprint(2, 'Setting config value: "{}": "{}"'.format(key, value))

    config[key] = value

    # Save the config file.
    with open(config_file_path, 'w') as f:
        pickle.dump(config, f)
4

4 に答える 4

6

EVT_IDLEイベントキューが空のときにトリガーされるものを処理できます。

wx.IdleEvent:このクラスは、アプリケーションがアイドル状態になったときに生成および送信されるEVT_IDLEイベントに使用されます。つまり、イベントキューが空になると、アイドルイベントがすべてのウィンドウに送信され(デフォルト)、それらのいずれもRequestMoreを呼び出さない限り、システムイベントキューに通常のイベントが発生するまでアイドルイベントは発生しません。その後、再び空になります。

ウィンドウのサイズ変更または移動のプロセスでは、サイズ変更/移動が完了するまでウィンドウが空にならないように(そしてアイドルイベントをトリガーしないように)、イベントキューを詰まらせておく必要があります。

ダーティフラグを設定し、ハンドラーEVT_SIZEでチェックします。EVT_IDLEフラグが設定されている場合は、新しいサイズを保存してフラグをリセットします。

import wx

class Frame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self,None)
        self.resized = False # the dirty flag
        self.Bind(wx.EVT_SIZE,self.OnSize)
        self.Bind(wx.EVT_IDLE,self.OnIdle)

    def OnSize(self,event):
        self.resized = True # set dirty

    def OnIdle(self,event):
        if self.resized: 
            # take action if the dirty flag is set
            print "New size:", self.GetSize()
            self.resized = False # reset the flag

app = wx.PySimpleApp()
frame = Frame().Show()
app.MainLoop()

EVT_SIZE最小化されたウィンドウを復元するときにもトリガーされる場合があります(ウィンドウサイズは同じままです)。不要な保存を削減したい場合は、構成に保存する前に、サイズが実際に異なるかどうかを確認することをお勧めします(最後に保存されたサイズを含む変数で追跡できます)。

EVT_MOVEウィンドウの位置を追跡するために追加することをお勧めします。

于 2012-11-21T04:05:37.613 に答える
2

Microsoft Word の自動保存のように、タイマーを開始して、変更を頻繁にチェックすることができます。または、EVT_SIZING または EVT_SIZE が発生したときに何らかのフラグを設定し、EVT_LEAVE_WINDOW にバインドすることもできます。これは、サイズ変更が完了したときにほぼ確実にウィンドウを離れるからです。したがって、そのイベントが発生すると、設定されたフラグを確認し、設定されている場合はフラグを保存してリセットします。

于 2012-11-20T20:23:20.390 に答える
1

サイズ変更のたびにウィンドウのジオメトリを保存するべきではありません。通常は、フレームが閉じているときにのみ保存する必要があります。さらなる安全性が必要な場合 (しかし、正直なところ、Pythonでどうやってクラッシュすることができますか?)、フレームを閉じるときに呼び出す同じ関数をEVT_TIMERハンドラーから呼び出すこともできます。しかし、ウィンドウのジオメトリはほとんど重要なリソースではないため、これを行う必要が実際にあるとは思いません。

于 2012-11-20T23:56:50.270 に答える
1

Windows では、構成をレジストリに保存できます。これにより、ウィンドウのサイズが変更されたときにパフォーマンスが低下することはありません。

レジストリがない他のOSでは、ファイルを使用する必要があると思います。しかし、これでもパフォーマンスの低下が見られることに驚いています。

あなたが見ているパフォーマンスの低下は、これが原因であると確信していますか? (おそらく、再描画コードが遅いですか?)

最新の OS は、邪魔にならずにこのような小さなファイルの書き込みを処理すると思います。おそらくそれはPythonの問題ですか?

上記の質問を最初に検討することをお勧めします。ただし、実際の質問に答えるには:

これを行う方法は、ウィンドウ サイズを変数に保存し、アプリケーションの終了時にのみファイルに書き込むことです。


投稿したばかりのコードを見てください。私は Python の専門家ではありませんが、更新のたびにファイルを再度開いているようです。もしそうなら、それが遅いのも不思議ではありません!

  1. ファイルは常に開いたままにしてください。

  2. アプリの終了時にのみファイルを書き込みます。

wxWidget の wxConfig クラスも参照してください。

于 2012-11-20T18:46:58.790 に答える