0

私は wxPython プログラミングが初めてで、理想的には、ImageFrame で設定されたデフォルト パラメータ値にデフォルト値がすでに入力されているテキスト ボックスを使用して、カスタム ダイアログ (ParameterDialog) で開くように設定できるパラメータを用意することです。次に、[OK] を押すか、ダイアログ フレームを閉じる/終了して、変更された値またはすべての値を ParameterDialog ダイアログ フレームに戻します。これについて最善の方法は何ですか?または、ダイアログ ポップアップ フレームを使用するよりも優れた解決策があります。

また、ShowModal() の代わりに Show() を使用してモードレス ウィンドウを開くことも読みました。ShowModal() の代わりに Show() を使用するたびに、何も起こりません。以下のコードのほとんどを切り取りましたが、必要なもののほとんど最小限の例を示して、つなぎ合わせることができたはずです。

import os
import pprint
import random
import wx
import numpy as np
import matplotlib
matplotlib.use('WXAgg')
from matplotlib.figure import Figure
from matplotlib.backends.backend_wxagg import \
    FigureCanvasWxAgg as FigCanvas, \
    NavigationToolbar2WxAgg as NavigationToolbar

class ImageFrame(wx.Frame):
    """ The main frame of the application
    """
    def __init__(self):
        wx.Frame.__init__(self, None, -1, 'title')

        self.param1 = 10
        self.param2 = 0.2

        self.panel = wx.Panel(self)        

        self.button_set_parameters = wx.Button(self.panel, -1, "Set Parameters")
        self.Bind(wx.EVT_BUTTON, self.on_set_parameters, self.button_set_parameters)

        #
        # Layout with box sizers
        #
        self.vbox = wx.BoxSizer(wx.VERTICAL)
        self.vbox.Add(self.button_set_parameters, 0, border=3, flag=flags)
        self.panel.SetSizer(self.vbox)
        self.vbox.Fit(self)

    def on_set_parameters(self, event):
        dia = ParameterDialog()
        res = dia.ShowModal() # Use Show() here to allow edit window to remain open while using rest of application

        # Ideally the code below would run on ok or on closing the dialog?? Is this possible or better way to do this? Or is Checking everytime a change is made to a textbox possible and a better way?
        if res == wx.ID_CLOSE or res == wx.ID_EXIT or res == wx.ID_OK:
            self.param1 = dia.param1.GetValue()
            self.param2 = dia.param2.GetValue()
        dia.Destroy()
        return True

    def on_exit(self, event):
        self.Destroy()


class ParameterDialog(wx.Dialog):
    """
    Used to set the parameters for running.
    """
    def __init__(self):
        wx.Dialog.__init__(self, None, title="Parameters")

        self.static_text_param1 = wx.StaticText(self, label="Param1:")
        # Defualt value of 10 displayed in the textbox here as param1 but would need passed in from the ImageFrame class.
        self.param1 = wx.TextCtrl(self, size=(100, -1))        

        self.static_param2 = wx.StaticText(self, label="Param2:")
        self.param2 = wx.TextCtrl(self, size=(100, -1))        

        # Setup up Sizer
        flags = wx.ALIGN_LEFT | wx.ALL | wx.ALIGN_CENTER_VERTICAL
        sizer_vert =  wx.BoxSizer(wx.VERTICAL)

        sizer_horz = wx.BoxSizer(wx.HORIZONTAL)
        sizer_horz.Add(self.static_text_param1, 0, border=3, flag=flags)
        sizer_horz.Add(self.param1, 0, border=3, flag=flags)
        sizer_vert.Add(sizer_horz, 0, flag = wx.ALIGN_LEFT | wx.TOP)

        sizer_horz = wx.BoxSizer(wx.HORIZONTAL)
        sizer_horz.Add(self.static_param2, 0, border=3, flag=flags)
        sizer_horz.Add(self.param2, 0, border=3, flag=flags)
        sizer_vert.Add(sizer_horz, 0, flag = wx.ALIGN_LEFT | wx.BOTTOM)

        self.SetSizer(sizer_vert)
        sizer_vert.Fit(self)


if __name__ == '__main__':
    app = wx.PySimpleApp()
    app.frame = ImageFrame()
    app.frame.Show()
    app.MainLoop()
4

1 に答える 1

0

すでに持っているものを使用して値を取得できるはずです。

self.param1 = dia.param1.GetValue()

ただし、これはダイアログをモーダルに表示している場合にのみ機能します。ダイアログをモーダルに表示すると、アプリケーションのメイン ループがブロックされ、ダイアログの新しいメイン ループが作成されます。次に、ダイアログが終了したら、ダイアログを破棄する前に、上記のコードを使用して値を取得できます。

モーダル ダイアログを使用したくない場合や、少し違う方法で試してみたい場合は、pubsub を試してみることをお勧めします。1 つ以上のリスナーを設定し、メッセージをそのリスナーにパブリッシュするパブリッシュ/サブスクライブ モデルを使用します。簡単なチュートリアルへのリンク: http://www.blog.pythonlibrary.org/2010/06/27/wxpython-and-pubsub-a-simple-tutorial/

于 2013-08-12T18:13:17.823 に答える