2017-01-13 12 views
0

私は割り当てられたプロジェクトに対してこのプログラムを作成しようとしています。コードはまだドラフトであり、私はこのプロジェクトが割り当てられたときにwxPythonについて何も知らなかった。WxPython BitmapButtonをクリックできない

とにかく。このプログラムが行うことは、フォトアルバムを管理するアプリケーションを作成することです。私はフォルダを作成/削除し、そのルートディレクトリを変更して、プログラムファイルを別の場所に移動できるようにしました。また、各アルバムのビットマップボタンを生成し、FlexGridSizerに配置するようにしました。

私の問題は、これらのビットマップボタンが解除できないことです。

class RightPanel(wx.Panel): 
    global path 
    def __init__(self, parent): 
     a = wx.GetDisplaySize() 
     width = 3 * a[0]/4 
     height = 3 * a[1]/4 
     wx.Panel.__init__(self, parent=parent, 
          size=(3*width/4, height), 
          style=wx.EXPAND) 
     self.SetBackgroundColour('dark grey') 
     self.widgetSizer = wx.BoxSizer(wx.VERTICAL) 





class MasterPanel(wx.Panel): 
    global delete, CurrentDirg, locale 
    delete = False 
    a = wx.GetDisplaySize() 
    width = 3 * a[0]/4 
    height = 3 * a[1]/4 
    id = {} 

    def __init__(self, parent): 
     wx.Panel.__init__(self, parent) 
     self.MasterPanel = wx.Panel(self, 
            wx.ID_ANY, 
            size=(self.width, self.height), 
            ) 
     self.SetBackgroundColour('light grey') 
     self.sizer = wx.BoxSizer(wx.VERTICAL) 

     splitter1 = wx.SplitterWindow(self) 
     splitter2 = wx.SplitterWindow(splitter1) 

     left_pt = LeftPanelTop(splitter2) 
     left_pb = LeftPanelBottom(splitter2) 
     self.rightP = RightPanel(splitter1) 
     self.boxsizer2 = wx.BoxSizer(wx.VERTICAL) 

     splitter2.SetSashGravity(0.5) 
     splitter2.SplitHorizontally(left_pt, left_pb) 

     splitter1.SplitVertically(splitter2, self.rightP) 
     splitter1.SetSashGravity(0.5) 

     self.gSizer = wx.FlexGridSizer(0, 5, 10, 10) 

     self.dir_search() 
     self.boxsizer2.Add(self.gSizer, 1, wx.EXPAND|wx.ALL) 
     self.rightP.SetSizer(self.boxsizer2) 
     self.boxsizer2.Layout() 
     self.sizer.Add(splitter1, 1, wx.EXPAND) 
     self.SetSizer(self.sizer) 

    def dir_search(self): 
     global path, delete 

     try: 
      if self.id != {} or delete == True: 
       sizer = self.gSizer 
       for i in sizer.GetChildren(): 
        sizer.Hide(0) 
        sizer.Remove(0) 

        self.boxsizer2.Layout() 
      self.gSizer.Layout() 
      self.id = {} 
      with open('albums.dir', mode='r', buffering=1) as alb: 
       names = alb.readlines() 
       for i in range(len(names)): 
        names[i] = names[i].rstrip('\n') 
       paths = [path + '\\' + i for i in names] 
      counter = 0 

      for i in paths: 
       self.dirimcreate(i, counter) 
       counter += 1 
      print(self.id) 
     except Exception as E: 
      print(E) 
      sizer = self.gSizer 
      while sizer.GetChildren(): 
       sizer.Hide(0) 
       sizer.Remove(0) 
     self.boxsizer2.Layout() 

    def dirimcreate(self, path, counter): 
     pic = wx.Image('input.ico', wx.BITMAP_TYPE_ANY) 
     pic = pic.Scale(self.width/10, self.width/10, wx.IMAGE_QUALITY_HIGH) 
     pic = pic.ConvertToBitmap() 

     self.saasda = wx.BitmapButton(self.rightP, 
             wx.ID_ANY, 
             pic, 
             size=(self.width/10, self.width/10), 
             style=wx.NO_BORDER 
            ) 
     self.saasda.Bind(wx.EVT_BUTTON, self.chdir) 
     self.saasda.SetDefault() 
     self.saasda.myname = self.saasda.GetId() 

     self.id[self.saasda.GetId()] = path 
     self.gSizer.Add(self.saasda, 0, wx.ALL, 5) 

     self.boxsizer2.Layout() 

    def chdir(self, event): 
     self.Info(message='You clicked a button') 

結果は次のようになります。 The program

ありがとうございます。

+1

クリックのためのハンドラを作成せず、ボタンにハンドラをバインドしました。また、ボタンを使ってパネルのコードを置くだけで、できるだけコードを投稿しないようにするのもいいでしょう。 – Igor

+0

これは 'self.saasda.Bind(wx.EVT_BUTTON、self.chdir)'とは異なりますか? –

+0

これはself.saasdaボタン用です。他のすべてのバインディングはどこにありますか? – Igor

答えて

0

解決策が見つかりました。

MasterPanelクラスのコードにはinitのサイズパラメータが含まれているようです。これは、他のすべてをカバーする不可視のパネルを作成し、それをunclickableにしました。

関連する問題