Как вызвать функцию из другого класса с помощью self? - PullRequest
0 голосов
/ 11 марта 2019

Одна запись прямо перед моей, я нашел код, который хотел бы использовать.Есть ComboPopup, в котором есть флажки.Если один из этих флажков активирован, я хочу передать выбранный текст обратно в мой класс (например, MyForm).Существует StaticText с именем self.text.Я хочу изменить метку с помощью выбранного текста ComboPopup.

Я пробовал это с:

    test = MyForm()
    MyForm.OnUpdate(test,item.GetText())

, так как я думал, что self.text является родителем от MyForm().Но это не работает.Нет ошибок, но также нет изменений в тексте.

Что такое self в этом случае?Есть ли хороший способ узнать, что такое self?Как напечатать имя или что-нибудь: -)

Мой код:

import wx
import wx.stc
from wx.lib.mixins.listctrl import CheckListCtrlMixin, ListCtrlAutoWidthMixin

class CheckListCtrl(wx.ListCtrl, CheckListCtrlMixin, ListCtrlAutoWidthMixin):

    def __init__(self, parent):
        wx.ListCtrl.__init__(self, parent, wx.ID_ANY, style=wx.LC_REPORT | 
                wx.SUNKEN_BORDER)
        CheckListCtrlMixin.__init__(self)
        ListCtrlAutoWidthMixin.__init__(self)
        self.SetSize(-1, -1, -1, 50)

    def OnCheckItem(self, index, flag):
        item = self.GetItem(index)
        if flag:
            what = "checked"
        else:
            what = "unchecked"
        print(f'{item.GetText()} - {what}')

        test = MyForm()
        MyForm.OnUpdate(test,item.GetText())


class ListViewComboPopup(wx.ComboPopup):

    def __init__(self):
        wx.ComboPopup.__init__(self)
        self.lc = None
    def AddItem(self, txt):
        self.lc.InsertItem(0, txt)
    def Init(self):
        self.value = -1
        self.curitem = -1
    def Create(self, parent):
        self.lc = CheckListCtrl(parent)
        self.lc.InsertColumn(0, '', width=90)
        return True
    def GetControl(self):
        return self.lc
    def OnPopup(self):
        wx.ComboPopup.OnPopup(self)
    def GetAdjustedSize(self, minWidth, prefHeight, maxHeight):
        return wx.ComboPopup.GetAdjustedSize(
            self, minWidth, 110, maxHeight)

class MyForm(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self, None, title="Popup Menu")
        self.panel = wx.Panel(self)

        vsizer = wx.BoxSizer(wx.VERTICAL)

        comboCtrl = wx.ComboCtrl(self.panel, wx.ID_ANY, "Select Text")    
        popupCtrl = ListViewComboPopup()
        comboCtrl.SetPopupControl(popupCtrl)

        popupCtrl.AddItem("Text One")

        self.txt = wx.StaticText(self.panel,-1,style = wx.ALIGN_LEFT)
        self.txt.SetLabel("Startup Text")

        vsizer.Add(comboCtrl,1,wx.EXPAND)
        vsizer.Add(self.txt,1,wx.EXPAND)

        self.panel.SetSizer(vsizer)

    def OnUpdate(self, txt):
        self.txt.SetLabel(txt) 

if __name__ == "__main__":
    app = wx.App(False)
    frame = MyForm().Show()
    app.MainLoop()

Ответы [ 2 ]

2 голосов
/ 11 марта 2019

Ваш экземпляр класса wx.Frame не имеет родителя.Вы явно создаете его без одного:

wx.Frame.__init__(self, None, title="Popup Menu")

Вы создаете экземпляр MyForm в своем блоке __name__ == '__main__':

frame = MyForm().Show()
# Note: your name 'frame' holds the return value of the method Show(), i.e. a boolean
# This probably should rather read:
# frame = MyForm()
# frame.Show()

Этот является MyForm экземпляр, который вы показываете в своем app.
Что вы здесь делаете:

test = MyForm()

создает новый экземпляр MyFrame (который не имеет ничего общего стот, который показывает ваше приложение).Затем вы вызываете onUpdate для этого нового экземпляра вашего MyForm класса

MyForm.OnUpdate(test,item.GetText())

Так как вы никогда не Show() этого нового экземпляра, вы не можете увидеть эффект вашегооперация.Тем не менее, вы, вероятно, не хотите / не нуждаетесь в этом новом экземпляре в любом случае.Вам нужен ваш экземпляр из блока main.

В инициализаторе CheckListCtrl есть аргумент parent.Это может содержать цепочку объектов, которые вы, вероятно, сможете поднимать, пока не достигнете своего MyForm экземпляра.Я не могу сказать наверняка, так как не видно, где и как это называется в ListViewComboPopup:

def Create(self, parent):
    self.lc = CheckListCtrl(parent)

Сделайте print(self.Parent) в OnCheckItem, чтобы увидеть, что он содержит, а затемдобавьте еще .Parent к self.Parent, пока вы, надеюсь, не получите <__main__.MyForm instance [...]>.Здесь вы хотите вызвать метод onUpdate.Это должно выглядеть примерно так:

self.Parent.Parent.Parent.OnUpdate(item.GetText())
# the number of '.Parent' my vary, based on where in the chain you find your MyForm instance

Редактировать
Согласно комментарию ОП, родительский атрибут для wx объектов пишется с большой буквы P.Соответствующие фрагменты кода были обновлены соответствующим образом.

0 голосов
/ 11 марта 2019

Я не знаю, что делает библиотека wx, но есть способ проверить, где находится .text.

Вы хотите, чтобы vars () смешивался с pprint ():

from pprint import pprint
pprint(vars(your_object))

pprint(your_object) # this is OK too

Предложение 2

type(x).__name__

Это дает вам имя класса экземпляра. Вы можете вставить эту строку перед self.text. И дать себе в качестве аргумента вместо х.

Оригинал: Ссылка

...