0

BoaConstructor を介してアプリケーションを開発するために、wxPython 2.8.12 で Python 2.6 を使用しています。TextCtrl からいくつかの変数を保存し、ダイアログ ウィンドウで self.Destroy() 呼び出しを実行して閉じるようにプログラムされた適用ボタンがあります。このボタンをクリックすると、GUI がハングし、アプリケーションがフリーズします。ただし、self.Destroy() を呼び出さない場合は、ウィンドウの右上隅にある [X] ボタンを使用してウィンドウを閉じようとするまで、問題なく変数を保存できます (印刷コマンドを使用してテスト)。変数を保存しようとせず、ボタンを押して self.Destroy() を実行するだけであれば、すべて問題ありません。GUI がハングするのは、変数を保存して self.Destroy() を実行しようとしたときだけです。誰かが手を貸してくれませんか?前もって感謝します。

    def OnApplyButton(self, event):
        print self.IMSINumberDigitTextCtrl.GetValue()
        if self.IMSINumberDigitCheckBox.GetValue() == True:
            print self.IMSINumberDigit #Debugging purposes only.  Returns expected value
            print self.IMSINumberDigitTextCtrl.GetValue() #Debugging purposes only.  Returns expected value
            self.IMSINumberDigit = self.IMSINumberDigitTextCtrl.GetValue()
            print self.IMSINumberDigit #Debugging purposes only.  Returns expected value
    self.Destroy()

編集:これはマイクの提案を指します。これらは、私がテストした小さなプログラムの 2 つのファイルで、問題なく動作しました。

#!/usr/bin/env python
#Boa:App:BoaApp

import wx

import Frame1

modules = {'Frame1': [1, 'Main frame of Application', u'Frame1.py']}

class BoaApp(wx.App):
    def OnInit(self):
        self.main = Frame1.create(None)
        self.main.Show()
        self.SetTopWindow(self.main)
        return True

def main():
    application = BoaApp(0)
    application.MainLoop()

if __name__ == '__main__':
    main()

#Boa:Frame:Frame1

import wx

def create(parent):
    return Frame1(parent)

[wxID_FRAME1, wxID_FRAME1APPLY, wxID_FRAME1CHECKBOX1, wxID_FRAME1CHECKBOX2, 
 wxID_FRAME1TEXTCTRL1, 
] = [wx.NewId() for _init_ctrls in range(5)]

class Frame1(wx.Frame):
    def _init_ctrls(self, prnt):
        # generated method, don't edit
        wx.Frame.__init__(self, id=wxID_FRAME1, name='', parent=prnt,
              pos=wx.Point(480, 245), size=wx.Size(279, 135),
              style=wx.DEFAULT_FRAME_STYLE, title='Frame1')
        self.SetClientSize(wx.Size(279, 135))

        self.checkBox1 = wx.CheckBox(id=wxID_FRAME1CHECKBOX1, label='checkBox1',
              name='checkBox1', parent=self, pos=wx.Point(24, 16),
              size=wx.Size(95, 22), style=0)
        self.checkBox1.Bind(wx.EVT_CHECKBOX, self.OnCheckBox1Checkbox,
              id=wxID_FRAME1CHECKBOX1)

        self.checkBox2 = wx.CheckBox(id=wxID_FRAME1CHECKBOX2, label='checkBox2',
              name='checkBox2', parent=self, pos=wx.Point(48, 48),
              size=wx.Size(95, 22), style=0)
        self.checkBox2.Enable(False)
        self.checkBox2.Bind(wx.EVT_CHECKBOX, self.OnCheckBox2Checkbox,
              id=wxID_FRAME1CHECKBOX2)

        self.Apply = wx.Button(id=wxID_FRAME1APPLY, label=u'Apply',
              name=u'Apply', parent=self, pos=wx.Point(24, 88),
              size=wx.Size(232, 29), style=0)
        self.Apply.Bind(wx.EVT_BUTTON, self.OnApplyButton, id=wxID_FRAME1APPLY)

        self.textCtrl1 = wx.TextCtrl(id=wxID_FRAME1TEXTCTRL1, name='textCtrl1',
              parent=self, pos=wx.Point(160, 44), size=wx.Size(80, 27), style=0,
              value='textCtrl1')
        self.textCtrl1.SetEditable(True)
        self.textCtrl1.Enable(False)

    def __init__(self, parent):
        self._init_ctrls(parent)
        self.TextCtrlVariableHolder = None

    def OnCheckBox1Checkbox(self, event):
        value = self.checkBox1.GetValue()
        if value == True:
            self.checkBox2.Enable(True)
        else:
            self.checkBox2.Enable(False)

    def OnCheckBox2Checkbox(self, event):
        value = self.checkBox2.GetValue()
        if value == True:
            self.textCtrl1.Enable(True)
        else:
            self.textCtrl1.Enable(False)

    def OnApplyButton(self, event):
        print self.textCtrl1.GetValue()
        if self.checkBox2.GetValue() == True:
            print self.TextCtrlVariableHolder
            print self.textCtrl1.GetValue()
            self.TextCtrlVariableHolder = self.textCtrl1.GetValue()
            print self.TextCtrlVariableHolder
        self.Destroy()

ありがとう!

4

1 に答える 1

0

問題は私自身のコーディングであることが判明しました。私はずっと疑っていましたが、特定できませんでした。値をキャプチャする方法が原因で、無限ループが実行されていました。TextCtrls は int ではなく文字列を返します。誰かわかったね。したがって、ダイアログが生成されたフレームでは、i < "StringThatIToughtWasAnINT" は決してエスケープされません。@MikeDriscoll でも、ご協力いただきありがとうございます。

于 2012-08-29T19:58:18.560 に答える