Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WxPython位图按钮不可单击_Python_Events_Wxpython_Wxwidgets - Fatal编程技术网

WxPython位图按钮不可单击

WxPython位图按钮不可单击,python,events,wxpython,wxwidgets,Python,Events,Wxpython,Wxwidgets,所以,我正试图为我分配的一个项目制作这个程序。代码仍然是一个草稿,当我被分配到这个项目时,我真的对wxPython一无所知 无论如何。这个程序的作用是创建一个管理相册的应用程序。我让它创建/删除文件夹,并能够更改其根目录,将程序文件移到其他位置。我还可以为每个“相册”生成位图按钮,并将它们放在FlexGridSizer中 我的问题是这些位图按钮不可点击 class RightPanel(wx.Panel): global path def __init__(self, paren

所以,我正试图为我分配的一个项目制作这个程序。代码仍然是一个草稿,当我被分配到这个项目时,我真的对wxPython一无所知

无论如何。这个程序的作用是创建一个管理相册的应用程序。我让它创建/删除文件夹,并能够更改其根目录,将程序文件移到其他位置。我还可以为每个“相册”生成位图按钮,并将它们放在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')
这就是结果的样子。

提前谢谢。

我找到了解决方案


MasterPanel类的代码似乎在init中包含了一个size参数,该参数创建了一个覆盖所有其他内容的不可见面板,使其不可点击。

您没有为单击创建任何处理程序并将处理程序绑定到按钮。另外,将您的代码发布减少到尽可能少的程度也很好-只需将带有按钮的面板的代码放入其中。这不是“self.saasda.Bind(wx.EVT_BUTTON,self.chdir)”所做的吗?这是self.saasda按钮。所有其他的绑定在哪里?这里的代码太多了,请将其简化为(更)简单的东西。
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')