2011-01-28 23 views
2

ボタンをクリックしたときに特定の入力に対して一連の手順を実行するwx pythonアプリケーションがあります。アプリケーションは初めて動作しますが、別の入力値で2回目にボタンをクリックしようとするとエラーが発生します。WXPythonのエラー処理と繰り返し使用

私は2つの質問があります: 1.)このエラーメッセージが表示されなくなるように、下のコードを修正するにはどうすればよいですか?

2.)このようなエラーメッセージがダイアログボックスのエンドユーザーに表示されるように、どの特定のコードを追加する必要がありますか?エラーをスローしたプロセス(ボタンをクリックして開始)を正常に終了し、エラーメッセージを表示する新しいダイアログボックスをプログレスバーに置き換えて、ユーザーがボタンをクリックできるようにしたいと思いますそれらをアプリケーションのメインウィンドウに戻して、ボタンをもう一度クリックして新しい入力を使用できるようにすることができます。私はこれをすぐにexeファイルにまとめようとしていますが、現在のところ、エラー処理の唯一のエラーメッセージはPythonシェルです。ユーザーはPythonシェルを持っていないので、この段落で説明した方法でエラーメッセージを表示する必要があります。ここで私のOnClick()関数はクラスをインスタンス化することに注意してください。実際のコードでは、それぞれが非常に複雑で、さまざまなクラスの数を使用しています。さまざまなクラスの腸の深部で発生するエラーを処理できるよう、ここで求めている機能が必要ですOnClick()関数によってインスタンス化されます。

import wxversion 
import wx 
ID_EXIT = 130 

class MainWindow(wx.Frame): 
    def __init__(self, parent,id,title): 
     wx.Frame.__init__(self,parent,wx.ID_ANY,title, size = (500,500), style = wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE) 

     # A button 
     self.button =wx.Button(self, label="Click Here", pos=(160, 120)) 
     self.Bind(wx.EVT_BUTTON,self.OnClick,self.button) 

     # the combobox Control 
     self.sampleList = ['first','second','third'] 
     self.lblhear = wx.StaticText(self, label="Choose TestID to filter:", pos=(20, 75)) 
     self.edithear = wx.ComboBox(self, pos=(160, 75), size=(95, -1), choices=self.sampleList, style=wx.CB_DROPDOWN) 

     # the progress bar 
     self.progressMax = 3 
     self.count = 0 
     self.newStep='step '+str(self.count) 
     self.dialog = None 

     #-------Setting up the menu. 
     # create a new instance of the wx.Menu() object 
     filemenu = wx.Menu() 

     # enables user to exit the program gracefully 
     filemenu.Append(ID_EXIT, "E&xit", "Terminate the program") 

     #------- Creating the menu. 
     # create a new instance of the wx.MenuBar() object 
     menubar = wx.MenuBar() 
     # add our filemenu as the first thing on this menu bar 
     menubar.Append(filemenu,"&File") 
     # set the menubar we just created as the MenuBar for this frame 
     self.SetMenuBar(menubar) 
     #----- Setting menu event handler 
     wx.EVT_MENU(self,ID_EXIT,self.OnExit) 

     self.Show(True) 

    def OnExit(self,event): 
     self.Close(True) 

    def OnClick(self,event): 
     #SECOND EDIT: added try: statement to the next line: 
     try: 
      if not self.dialog: 
       self.dialog = wx.ProgressDialog("Progress in processing your data.", self.newStep, 
              self.progressMax, 
              style=wx.PD_CAN_ABORT 
              | wx.PD_APP_MODAL 
              | wx.PD_SMOOTH) 
      self.count += 1 
      self.newStep='Start' 
      (keepGoing, skip) = self.dialog.Update(self.count,self.newStep) 
      TestID = self.edithear.GetValue() 

      self.count += 1 
      self.newStep='Continue.' 
      (keepGoing, skip) = self.dialog.Update(self.count,self.newStep) 
      myObject=myClass(TestID) 
      print myObject.description 

      self.count += 1 
      self.newStep='Finished.' 
      (keepGoing, skip) = self.dialog.Update(self.count,self.newStep) 

      **#FIRST EDIT: Added self.count = 0 on the following line** 
      self.count = 0 

      self.dialog.Destroy() 

     #SECOND EDIT: Added the next seven lines to handle exceptions. 
     except: 
      self.dialog.Destroy() 
      import sys, traceback 
      xc = traceback.format_exception(*sys.exc_info()) 
      d = wx.MessageDialog(self, ''.join(xc),"Error",wx.OK) 
      d.ShowModal() # Show it 
      d.Destroy() #finally destroy it when finished 


    class myClass(): 
     def __init__(self,TestID): 
      self.description = 'The variable name is: '+str(TestID)+'. ' 

app = wx.PySimpleApp() 
frame = MainWindow(None,-1,"My GUI") 
app.MainLoop() 

私の実際のコードは、LOTより複雑ですが、私はそれで問題を説明するために、それをこのダミーのバージョンを作成しました:

は、ここに私のコードの非常に単純化されたが、作業バージョンです。上記のコードは、最初にボタンをクリックしたときにPythonで実行すると動作します。

Traceback (most recent call last): 
    File "mypath/GUIdiagnostics.py", line 55, in OnClick 
    (keepGoing, skip) = self.dialog.Update(self.count,self.newStep) 
    File "C:\Python26\lib\site-packages\wx-2.8-msw-unicode\wx\_windows.py", line 2971, in Update 
    return _windows_.ProgressDialog_Update(*args, **kwargs) 
wx._core.PyAssertionError: C++ assertion "value <= m_maximum" failed at ..\..\src\generic\progdlgg.cpp(337) in wxProgressDialog::Update(): invalid progress value 

最初の編集:私は、ボタンをもう一度クリックしてください場合でも、私はPythonシェルで、次のエラーメッセージが表示されます OK、私は

を追加することにより、上記の私の最初の質問に答え上記のコードで

self.dialog.Destroy() 

上記

self.count = 0 

。しかし、上記のコードでのエラー処理に関する私の2番目の質問はどうですか?誰もそれで私を助けることができますか?確かに、wxpythonでのエラー処理は、既知のメソッドがある一般的な問題です。私はpy2exeを使ってこのアプリケーションをexeファイルにまとめます。


SECOND EDIT:私は試して上の私の2番目の質問に答え:、以外:私は上記の私のコードに追加した声明。面白い、これはスタックオーバフローの誰も私の質問に答えることができなかったのは初めてです。私はこのタイプのプログラミングに慣れていないので、多くのことを私はちょうど彼らが来るようにピックアップしています。この質問に答えました。

答えて

0

私の2つの質問に答えました(私のところ、上記参照)。したがって、このスレッドは現在閉じられています。

関連する問題