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