在我的一个帖子之前,我找到了一些我想使用的代码。有一个带有复选框的ComboPopup。如果这些复选框之一被激活,我想将所选文本传递回我的班级(即MyForm
)。有一个称为self.text
的StaticText。我想用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()
答案 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