Python 如何使用self从其他类调用函数?

Python 如何使用self从其他类调用函数?,python,python-3.x,user-interface,wxpython,self,Python,Python 3.x,User Interface,Wxpython,Self,在我之前的一篇文章中,我找到了一些我想使用的代码。有一个组合弹出窗口,其中包含复选框。如果其中一个复选框被激活,我想将所选文本传递回我的类(即MyForm)。有一个静态文本名为self.text。我想用组合弹出窗口的choosen文本更改标签 我试了一下: test = MyForm() MyForm.OnUpdate(test,item.GetText()) 因为我认为self.text是MyForm()的父项。但这不起作用。没有错误,但也没有文本的更改 在这种情况下,sel

在我之前的一篇文章中,我找到了一些我想使用的代码。有一个组合弹出窗口,其中包含复选框。如果其中一个复选框被激活,我想将所选文本传递回我的类(即
MyForm
)。有一个静态文本名为
self.text
。我想用组合弹出窗口的choosen文本更改标签

我试了一下:

    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()

我不知道wx库做什么,但有一种方法可以检查.text在哪里

要将vars()与pprint()混合使用:

建议2

type(x).__name__
这将获取实例的类名。您可以在self.text之前插入此行。并将self作为参数,而不是x


原文:

我不知道wx库做什么,但有一种方法可以检查.text在哪里

要将vars()与pprint()混合使用:

建议2

type(x).__name__
这将获取实例的类名。您可以在self.text之前插入此行。并将self作为参数,而不是x


原始:

您的
wx.Frame
子类实例没有父类。您可以显式创建它,而不使用:

wx.Frame.__init__(self, None, title="Popup Menu")
\uuuu name\uuuu='\uuuuuu main\uuuu'
块中创建
MyForm
的实例:

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
实例
你在这里做什么:

test = MyForm()
正在创建
MyFrame
的新实例(与应用程序显示的实例无关)。然后对
MyForm
类的新实例调用
onUpdate

MyForm.OnUpdate(test,item.GetText())
由于您从未
Show()
过该新实例,因此无法看到操作的效果。但是,您可能无论如何都不想要/不需要该新实例。 您需要从
main
块获取实例。

CheckListCtrl
初始值设定项上有一个
parent
参数。这可能包含一个对象链,您可能会一直提升到您的
MyForm
实例。 我不能确定,因为它在
列表视图组合弹出窗口中的调用位置和方式不可见:

def Create(self, parent):
    self.lc = CheckListCtrl(parent)
OnCheckItem
中执行
打印(self.Parent)
以查看它包含的内容,然后将另一个
.Parent
添加到
self.Parent
中,直到您有希望得到一个
为止。这是要调用
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
对象上的父属性用大写字母
P
拼写。相应的代码片段已相应更新。

您的
wx.Frame
子类实例没有父类。您可以显式创建它,而不使用:

wx.Frame.__init__(self, None, title="Popup Menu")
\uuuu name\uuuu='\uuuuuu main\uuuu'
块中创建
MyForm
的实例:

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
实例
你在这里做什么:

test = MyForm()
正在创建
MyFrame
的新实例(与应用程序显示的实例无关)。然后对
MyForm
类的新实例调用
onUpdate

MyForm.OnUpdate(test,item.GetText())
由于您从未
Show()
过该新实例,因此无法看到操作的效果。但是,您可能无论如何都不想要/不需要该新实例。 您需要从
main
块获取实例。

CheckListCtrl
初始值设定项上有一个
parent
参数。这可能包含一个对象链,您可能会一直提升到您的
MyForm
实例。 我不能确定,因为它在
列表视图组合弹出窗口中的调用位置和方式不可见:

def Create(self, parent):
    self.lc = CheckListCtrl(parent)
OnCheckItem
中执行
打印(self.Parent)
以查看它包含的内容,然后将另一个
.Parent
添加到
self.Parent
中,直到您有希望得到一个
为止。这是要调用
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
对象上的父属性用大写字母
P
拼写。相应的代码片段已相应更新。

谢谢您的回答。WX是一个GUI工具包。你的密码只给了我一个空的口述。你的第四行给了我这个谢谢你的回答。WX是一个GUI工具包。你的代码只给了我一个空的dict。你的第四行给了我这个self.Parent.Parent.Parent.OnUpdate(item.GetText())(Parent处的大写P)成功了!谢谢你的回答!你介意回顾一下我的代码,看看哪里可以做得更好吗?我明白你的解释,但我真的想让我的代码变得更好。。大写属性名称。好的,从阅读文档来看,这并不明显。很好,你找到了!代码审查更适合at,我对wx不太熟悉。老实说,除了我提到的
frame=MyForm().Show()
。看到对父类初始值设定项的旧式调用有点奇怪,但是
wx
文档到处都是这样做的,所以它可能与该包有关……我将看看CodeReview!非常感谢。我还将更改
frame=MyForm().Show()
。祝你度过愉快的一天。
self.Parent.Parent.Parent.OnUpdate(item.GetText())
(Parent的大写P)成功了!谢谢你的回答!你介意回顾一下我的代码,看看哪里可以做得更好吗?我明白你的解释,但我真的想让我的代码变得更好。。大写属性名称。好的,t