如何用自已的其他类调用函数?

时间:2019-03-11 06:39:11

标签: python user-interface wxpython self

在我的一个帖子之前,我找到了一些我想使用的代码。有一个带有复选框的ComboPopup。如果这些复选框之一被激活,我想将所选文本传递回我的班级(即MyForm)。有一个称为self.text的StaticText。我想用ComboPopup的选定文本更改标签。

我尝试过:

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

我以为self.textMyForm()的父母。但这是行不通的。没有错误,也没有文本更改。

在这种情况下,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 个答案:

答案 0 :(得分:2)

您的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 new 实例(与您的应用显示的实例无关)。然后,您在您的onUpdate类的 new 实例上调用MyForm

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

由于您永远不会Show()该新实例,因此您看不到操作的效果。但是,您可能仍然不想/不需要该新实例。 您需要main块中的您的实例。

parent初始化程序上有一个CheckListCtrl自变量。它可能包含一连串对象,您可能可以升序直到到达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

修改
根据OP的评论,wx对象的parent属性用大写的P拼写。相应的代码段已相应更新。

答案 1 :(得分:0)

我不知道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之前插入此行。并以self作为参数,而不是x。

原文:Link