используя wx python функцию вызова кадра python интерпретатор возвращает ошибку - PullRequest
0 голосов
/ 28 мая 2020
class MyFrame(wx.Frame):
    def __init__(self, parent, title):
        super(MyFrame, self).__init__(parent, title=title, size=(620, 665))

        splitter = wx.SplitterWindow(self, wx.ID_ANY)
        self.MainPanel = NewPanel(splitter)
        self.MyNotebook = Nbook(splitter)
        splitter.SplitHorizontally(self.MainPanel, self.MyNotebook, sashPosition=210)
        self.sb = self.CreateStatusBar(3)
        self.MainPanel.Show()
        self.Centre()

    def setNotebookDisabled(self):
        self.MyNotebook.Enabled = False

    def PrintSomething(self):
        print("Something")


class NewPanel(wx.Panel):
    def __init__(self, parent):
        super(NewPanel, self).__init__(parent=parent)

    def Disable_Controls(self):
        self.GrandParent.MyNotebook.Enabled = False

class Nbook(wx.Notebook):
    def __init__(self, parent):
        super(Nbook, self).__init__(parent)

        # self.MyNotebook = wx.Notebook(splitter,wx.ID_ANY)
        page_one = NbPanel1(self)
        page_two = NbPanel2(self)
        page_three = NbPanel3(self)
        self.AddPage(page_one, "Cable")
        self.AddPage(page_two, "Busduct")
        self.AddPage(page_three, "Transformer")

Я могу успешно вызвать PrintSomething () ...
Ошибка:
Файл «c: / Users / Mark / Documents / FaultWireCalc / FCCal c .py», строка 331, в Disable_Controls self.GrandParent.MyNotebook.Enabled = False
AttributeError: объект MyFrame не имеет атрибута MyNotebook

1 Ответ

0 голосов
/ 29 мая 2020

Это не столько ответ, сколько незавершенная работа, учитывая, что комментарий просто не взломает его.

Учитывая, что вы не указали, когда и как возникает ошибка, и она где-то происходит в 1000 строк кода, которые мы не можем видеть, прямо сейчас может быть хорошее время для
a minimal, complete and verifiable example (mcve)
{ ссылка }

Как вы, кажется, неохотно чтобы предоставить его, давайте попробуем следующее:

import wx

class MyFrame(wx.Frame):
    def __init__(self, parent, title):
        super(MyFrame, self).__init__(parent, title=title, size=(620, 665))

        splitter = wx.SplitterWindow(self, wx.ID_ANY)
        self.MainPanel = NewPanel(splitter)
        self.MyNotebook = Nbook(splitter)
        splitter.SplitHorizontally(self.MainPanel, self.MyNotebook, sashPosition=210)
        self.sb = self.CreateStatusBar(3)
        self.MainPanel.Show()
        self.Centre()
        self.Show()

    def setNotebookDisabled(self):
        self.MyNotebook.Enabled = False

    def PrintSomething(self):
        print("Something")


class NewPanel(wx.Panel):
    def __init__(self, parent):
        super(NewPanel, self).__init__(parent=parent)
        testbut = wx.Button(self, -1, "Panel Hit Me")
        self.Bind(wx.EVT_BUTTON, self.Disable_Controls)

    def Disable_Controls(self, event):
        self.GrandParent.MyNotebook.Enabled = not self.GrandParent.MyNotebook.IsEnabled()


class Nbook(wx.Notebook):
    def __init__(self, parent):
        super(Nbook, self).__init__(parent)

        # self.MyNotebook = wx.Notebook(splitter,wx.ID_ANY)
        page_one = wx.Panel(self)
        page_two = wx.Panel(self)
        page_three = wx.Panel(self)
        self.AddPage(page_one, "Cable")
        self.AddPage(page_two, "Busduct")
        self.AddPage(page_three, "Transformer")


if __name__ == "__main__":
    app = wx.App()
    frame = MyFrame(None, "Test")
    app.MainLoop()        

Как видите, он работает (см. ниже): ноутбук можно включить / отключить.

enter image description here

Итак, можете ли вы заставить это вызвать ошибку или сделать вывод, как ваш код отличается способом или при вызове кода, что выдает ошибку?

Вы можете обнаружить, что GrandParent не то, что вы думаете! (Я подозреваю, что задействовано splitter)
Вы можете попробовать:

print("I am",self)
print("My parent is",self.Parent)
print("Granddad is",self.GrandParent)
print("His parent is",self.GrandParent.GetParent())

Еще одна вещь, которую вы можете попробовать при вызове подпрограммы, - это вызвать ее напрямую:

MyFrame.setNotebookDisabled(parent.GetParent())

или вариант для получения подходящего родителя, в зависимости от того, откуда вы его вызываете.

Перед вами.

...