0

ボタン付きのwxframeを作成しました。このボタンをクリックすると、「samples」という名前の辞書から保存されたデータを使用してテキストコントロールを生成する子フレームが表示されます。子フレームの考え方は、データを編集するための編集ウィンドウであるということです。

私の問題は、生成されたテキストコントロールからデータを取得する方法がわからないことです。最後に生成されたテキストコントロールからのみデータを取得できます。

これが私が作成したコードの簡略化されたバージョンです:

import wx

class MyFrame1(wx.Frame):


    def __init__(self, *args, **kwds):
        # begin wxGlade: MyFrame1.__init__
        kwds["style"] = wx.DEFAULT_FRAME_STYLE
        self.frame=wx.Frame.__init__(self, *args, **kwds)
        self.panel_1 = wx.Panel(self, -1)
        self.f3 = wx.Frame(None,-1,'Edit Tags')

        self.editTag = wx.Button(self.panel_1, -1, "Edit Tags", size=(100, 50))
        self.editTag.Bind(wx.EVT_BUTTON, self.editTags)

        self.Bind( wx.EVT_CLOSE, self.CloseAll)



        # end wxGlade

#-------------------------------------------------------------------------------
    def editTags(self, event):  # wxGlade: MyFrame.<event_handler>
        samples={
              "Face1":"(100,100)", \
              "Face2":"(50,40)", \
              "Car":"(500,230)", \
              "Wallclock":"(120,230)"

            }

        self.f3.okButton = wx.Button(self.f3, label="OK")
        self.f3.okButton.Bind(wx.EVT_BUTTON, self.onOK)
        self.f3.okButton.SetPosition((40,200))

        spacer=0

        for k, v in sorted(samples.iteritems()):
            print "K: ", k

            spacer=spacer+40
            print "V: ", v
            print

        self.f3.new_TextControl = wx.TextCtrl(self.f3, -1, value=k)
        self.f3.new_TextControl.SetPosition((40,spacer))

        print

        self.f3.Show()

   #-------------------------------------------------------------------------------
    def onOK(self, event):  # wxGlade: MyFrame.<event_handler>
        print self.f3.new_TextControl.GetValue()
        print self.f3.new_TextControl.GetValue()
        print "OK clicked"
        self.f3.Hide()
   #-------------------------------------------------------------------------------

    def CloseAll(self, event):
        self.DestroyChildren()  # First destroy child frames
        self.Destroy()          # Then destroy the parent frame
        self.f3.Close()
        self.Close()
   #-------------------------------------------------------------------------------

    # end of class MyFrame1
    if __name__ == "__main__":
        app = wx.PySimpleApp(0)
        frame_1 = MyFrame1(None, -1, "")
        app.SetTopWindow(frame_1)
        frame_1.Show()
        app.MainLoop()

代替ソリューションも歓迎します

私はPython2.7.2を使用しています。およびwxpython

4

1 に答える 1

2

コードを見てみましょう:

def editTags(self, event):  # wxGlade: MyFrame.<event_handler>
    samples={
          "Face1":"(100,100)", \
          "Face2":"(50,40)", \
          "Car":"(500,230)", \
          "Wallclock":"(120,230)"

        }

    self.f3.okButton = wx.Button(self.f3, label="OK")
    self.f3.okButton.Bind(wx.EVT_BUTTON, self.onOK)
    self.f3.okButton.SetPosition((40,200))

新しいコントロール用のストレージを作成しましょう(以下で説明します)。

    self.f3.new_controls = {}

    spacer=0

ここで、将来のフィールドを繰り返し処理します。問題は次のとおりです。

    for k, v in sorted(samples.iteritems()):
        print "K: ", k

        spacer=spacer+40
        print "V: ", v
        print

次のステップ:実際にコントロールを作成します。ここにいくつかの問題が隠されています:

  1. サイクルから作成し、forループブロック内に配置する必要があります(バリアントでは、1つのテキストコントロールのみが作成されます(フィールドに格納されます))。これは、最後に繰り返される値new_TextControlのフィールドになります(これが機能します) 。 。vfor
  2. self.f3.new_controlsコントロールを保持するために、いくつかのコンテナーを作成する必要があります(上記で作成したことを覚えていますか?) dict)

それでは、コードにさらにいくつかの変更を加えましょう。

        # Dict will hold {'Car': wx.TextCtrl(...), 'Wallclock': ...}
        self.f3.new_controls[k] = wx.TextCtrl(self.f3, -1, value=k)
        self.f3.new_controls[k].SetPosition((40,spacer))

そして、あなたはあなたのフレームを見せます、それは大丈夫です:

    self.f3.Show()

new_controlsdictから新しく作成されたフィールドの値にアクセスできます。

self.f3.new_controls['Car'].GetValue()  # Receive input from 'Car' text control.
于 2012-08-15T10:09:16.123 に答える