2017-01-25 13 views
0

私は、複数の列を持つテーブルのユーザー入力用の複数のテキストボックスを提供する、ironpythonでダイアログウィンドウを構築しようとしています。しかし、私は、ユーザー入力値を別の関数に渡すのが難しいです。私のコードは次のようになります。Pythonで複数のテキストボックスダイアログの入力を保存するにはどうすればよいですか?

self.newVal = [] 
for column in columns: 
      self.label = Label() 
      self.label.Text = col 
      self.label.Location = Point(10, offset) 
      self.cb = Textbox() 
      self.cb.Text = "Type in new value" 
      self.cb.Location = Point(150,offset) 
      self.cb.Height = 20 
      self.cb.Width = 295 
      self.cb.Enabled = True 
      self.Controls.Add(self.label) 
      self.Controls.Add(self.cb) 
      self.newVal.append(self.cb.Text) 
      offset = offset + 30 

問題は、このコードは、「新しい値を入力」のちょうど元のメッセージが、それは本当にテキストでユーザーの入力値をとらないですからself.newValが渡されたということです他の関数によって呼び出されたときに、実際には、別の関数のself.cb.Textを参照すると、値はユーザーが新しく入力した値です。しかし、self.cb.Textは最後の列の入力しか与えないので、これは私のためには機能しません。 self.newValにはすべての列の値が含まれますが、前述のユーザー入力では更新されません。

別の関連する質問。私は複数のTextboxを定義して個別に渡すことでこの問題を解決しようとしました。しかし、私はself.の後に変数を使用する方法を見つけることができません。私は self.colの代わりself.cbを使用している場合たとえば、上記のコードでは、コードは本当にここ変数としてcolを扱っていない、私が得るすべては、文字列、self.cbを使用するのとまったく同じであることcolを持つ単一のself.colです。クラス内でself.の後に変数を使用することはできますか?

+0

「別の関数」の 'self.cb.Text'からテキストを取得し、このテキストを「別の関数」に取得して' self.newVal'に追加すると、プログラムはこれを自動的に付加しません。手動で追加する必要があります。 – furas

+1

'self.col'は常に値を変更できるので可変です。あなたが何を期待しているかは不明です。あなたの問題は、 'Textbox()'を1つの変数に代入して以前の値を上書きし、以前の 'Textbox()'へのアクセス権を持たないためです - リスト 'self.all_cb.append(self.cb)' 'self.all_cb [0] .Text'、' self.all_cb [1] .Text'などにアクセスします。 – furas

答えて

1

ありがとうございました! self.newVal.append(self.cb.Text)の代わりにself.all_cb.append(self.cb)を使用すると問題が解決しました。

0

前述のように、初期化されたTextBoxをリストに追加するか、TextBoxごとに新しい変数を作成する必要があります。私はキーが列です辞書、参照することを好むだろうけど

self.textbox_list = [] 
for _ in columns: 
    textbox = TextBox() 
    self.textbox_list.append(textbox) 

:たとえば

self.textbox_dict = {} 
for i in range(columns): 
    textbox = TextBox() 

    # Here you can manipulate the textbox 

    self.textbox_dict[i] = textbox 

# Then reference each TextBox by column number 
val = self.textbox_dict[0].Text 

をまた、テーブルを初期化するために、クラスの機能を作成することができます。ここでは、setattrを使ってTextBoxオブジェクトの変数名を動的に作成する方法の例も示します。

class MyClass: 
    columns = 8 
    self.init_table(columns) 

    # Then you can reference the textbox by variable name 
    val = self.textbox_0.Text 

    def init_table(self, cols): 
     for i in range(cols): 
      setattr(self, "textbox_{}".format(i), TextBox()) 
関連する問題