1

ウィンドウを動的に wx.CLOSE_BOX スタイルにすることができる wx.Dialog ウィンドウを作成したいと思いますが、一時的に無効にして、使用できない間は無効に見えるようにすることができます。コントロールのメッセージ ハンドラー内で wx.EVT_CLOSE イベントに注意し、現在の状態に応じてスキップ、無視、または拒否する必要があることはわかっていますが、タイトル バーの小さな X が視覚的に反映されるようにしたいと思います。状態も。

私は現在、CLOSE_BOXをオフにしたいときにこれを行っています:

    style = self.GetWindowStyle()
    self.SetWindowStyle(style & (~wx.CLOSE_BOX))

オンに戻したいときにこれを行います。

    style = self.GetWindowStyle()
    self.SetWindowStyle(style | wx.CLOSE_BOX)

スタイル整数 DO の更新が行われているように見えますが、実際のダイアログ ウィンドウの X ボタンの無効化は行われていないようです。私がやろうとしていることを簡単に行う方法を知っている人はいますか? ダイアログ ボックスで動的に行おうとしている変更のスクリーン キャプチャを次に示します。

ここに画像の説明を入力

4

2 に答える 2

2

あなたの質問は、あなたがしようとしていることについて少し漠然としていますが、アプリケーションが何らかのタスクを実行している間、人々がダイアログを閉じないようにしたいと思っていると思います.

wx.CLOSE_BOXは単なるスタイルです。ダイアログの作成を試してみましwx.CLOSE_BOXたが、ダイアログの下部にあるボタンを変更するだけでした。設定しなくてもwx.CLOSE_BOX、ウィンドウを閉じる [OK] ボタンがまだありました。それより、×ボタンは?Alt+F4 はどうですか?

あなたの最善の選択肢は、おそらく独自のカスタムパネルを作成し、独自の「閉じる」ボタンを作成してEnable(False)から、プロセスが完了するまで呼び出すことです。ただし、これでも、ユーザーが X ボタンをクリックしたり、Alt+F4 を押したりするのを止めることはできません。そのためには、キャッチする必要がありますwx.EVT_CLOSE。この例を見てください:

class CustomDialog(wx.Dialog):
    def __init__(self, parent, title):
        wx.Dialog.__init__(self, parent=parent, title=title)

        self.closeButton = wx.Button(self,wx.ID_CLOSE,"Close")
        self.closeButton.Enable(False) #initialize the button as disabled

        self.Bind(wx.EVT_BUTTON, self.onClose, id=wx.ID_CLOSE)
        self.Bind(wx.EVT_CLOSE, self.onClose)
        #wx.EVT_CLOSE is triggered by the X button or Alt+F4

    def onClose(self, event):
        if self.closeButton.IsEnabled():
            #if we want to allow the user to close the dialog

            #do something

            event.Skip() #allow this event to close the window

    def reenableButtom(self):
        self.closeButton.Enable(True)

self.reenableButton()その後、プロセスが終了したときに手動で呼び出すか、イベントにバインドできます。

ボタンにバインドされているだけself.closeButton.IsEnabled()ではないことに注意してください。self.onClose()ユーザーが [閉じる] ボタンをクリックした場合でも、[X] ボタンをクリックした場合でも、Alt+F4 キーを押した場合でも、ダイアログが同じように動作するようにしたいと考えています。event.Skip()偶数を上方に伝搬させます。伝播を許可wx.EVT_CLOSEすると、ダイアログが閉じます。したがって、ウィンドウを閉じたい場合を除き、この行を呼び出さないことが非常に重要です。

于 2012-06-04T05:41:08.183 に答える
1

私が知る限り、ウィンドウの作成後にそのスタイルを変更することはできません。ドキュメントによると:

また、コントロールの作成後にすべてのスタイルを変更できるわけではないことに注意してください。

http://docs.wxwidgets.org/stable/wx_wxwindow.html#wxwindowtogglewindowstyle

これが私が使用した簡単なテストです:

import wx

def toggle(window):
    print window.ToggleWindowStyle(wx.CLOSE_BOX)
    window.Refresh()
    wx.CallLater(2000, toggle, window)

def main():
    app = wx.App(None)
    window = wx.Dialog(None)
    toggle(window)
    window.ShowModal()
    window.Destroy()
    app.MainLoop()

if __name__ == '__main__':
    main()
于 2012-06-04T14:41:24.160 に答える