Python XRC按钮不可单击
我正在开发一个python应用程序,遇到了一个障碍。我的目标是拥有一个包含许多控件的主框架,以及一个将从运行时指定的xrc文件加载的面板。本质上,当用户单击按钮时,我希望从xrc文件填充一个面板,xrc文件是根据单击哪个按钮来选择的 我正在用XRCed定义UI,以下是我到目前为止所做的。这似乎会将子面板控件加载到框架中,但它们不可单击,并且它们不会像我希望的那样出现在DynamicPanel中。非常感谢你的帮助 编辑 我已经修改了我的主代码,现在控件显示在框架中的位置,但是按钮仍然无法单击。谁能告诉我为什么 Python代码:Python XRC按钮不可单击,python,button,clickable,wxwidgets,xrc,Python,Button,Clickable,Wxwidgets,Xrc,我正在开发一个python应用程序,遇到了一个障碍。我的目标是拥有一个包含许多控件的主框架,以及一个将从运行时指定的xrc文件加载的面板。本质上,当用户单击按钮时,我希望从xrc文件填充一个面板,xrc文件是根据单击哪个按钮来选择的 我正在用XRCed定义UI,以下是我到目前为止所做的。这似乎会将子面板控件加载到框架中,但它们不可单击,并且它们不会像我希望的那样出现在DynamicPanel中。非常感谢你的帮助 编辑 我已经修改了我的主代码,现在控件显示在框架中的位置,但是按钮仍然无法单击。谁能
import wx
import wx.xrc as xrc
from UNTITLED_xrc import xrcFRAME1
class XrcFrameSubClass(xrcFRAME1):
""""""
#----------------------------------------------------------------------
def __init__(self):
xrcFRAME1.__init__(self, parent = None)
self.Bind(wx.EVT_BUTTON, self.OnButton_1, self.button1)
self.Bind(wx.EVT_BUTTON, self.OnButton_2, self.button2)
self.Bind(wx.EVT_BUTTON, self.OnButton_Clear, self.Button_Clear)
self.Show()
def OnButton_Clear(self, event):
self.ClearSubPanel()
def ClearSubPanel(self):
try:
self.SubPanel.Destroy()
self.Fit()
self.Layout()
except:
pass
def OnButton_1(self, event):
self.ClearSubPanel()
SubPanel_xrc = '''<?xml version="1.0" ?><resource>
<object class="wxPanel" name="SubPanel">
<object class="wxBoxSizer">
<orient>wxVERTICAL</orient>
<object class="sizeritem">
<object class="wxStaticText">
<label>Your Mother was a</label>
</object>
</object>
<object class="sizeritem">
<object class="wxButton" name="SubButton1">
<label>Hamster</label>
</object>
</object>
<object class="sizeritem">
<object class="wxButton" name="SubButton2">
<label>Black Knight</label>
</object>
</object>
</object>
</object>
</resource>'''
#PanelCoord = self.DynamicPanel.GetPosition()
TopSizer = self.TopPanel.GetSizer()
res = xrc.EmptyXmlResource() #Here it is
res.LoadFromString(SubPanel_xrc)
self.SubPanel = res.LoadPanel(self, "SubPanel")
#Note: the first argument of the sizer.Insert() method is the index at which to insert the new item
TopSizer.Insert(1,self.SubPanel,1, wx.EXPAND|wx.ALL, 5)
self.Fit()
self.Layout()
# #Not sure how to do the event binding dynamically yet
# self.SubButton1 = xrc.XRCCTRL(self.SubPanel, "SubButton1")
# self.SubButton2 = xrc.XRCCTRL(self.SubPanel, "SubButton2")
def OnButton_2(self, event):
self.ClearSubPanel()
SubPanel_xrc = '''<?xml version="1.0" ?>
<resource>
<object class="wxPanel" name="SubPanel">
<object class="wxBoxSizer">
<orient>wxHORIZONTAL</orient>
<object class="sizeritem">
<object class="wxStaticText">
<label>Your father smelt of</label>
</object>
</object>
<object class="sizeritem">
<object class="wxButton" name="SubButton1">
<label>Elderberries</label>
</object>
</object>
<object class="sizeritem">
<object class="wxButton" name="SubButton2">
<label>Shrubberies</label>
</object>
</object>
</object>
</object>
</resource>'''
TopSizer = self.TopPanel.GetSizer()
res = xrc.EmptyXmlResource() #Here it is
res.LoadFromString(SubPanel_xrc)
self.SubPanel = res.LoadPanel(self, "SubPanel")
#Note: the first argument of the sizer.Insert() method is the index at which to insert the new item
TopSizer.Insert(1,self.SubPanel,1, wx.EXPAND|wx.ALL, 5)
self.Layout()
self.Fit()
# self.SubButton1 = xrc.XRCCTRL(self.SubPanel, "SubButton1")
# self.SubButton2 = xrc.XRCCTRL(self.SubPanel, "SubButton2")
if __name__ == "__main__":
app = wx.App(False)
frame = XrcFrameSubClass()
app.MainLoop()
导入wx
将wx.xrc作为xrc导入
从未命名的xrc导入xrcFRAME1
类XrcFrameSubClass(xrcFRAME1):
""""""
#----------------------------------------------------------------------
定义初始化(自):
xrcFRAME1.\uuuuu init\uuuuuuuuu(自,父=无)
self.Bind(wx.EVT_按钮、self.OnButton_1、self.button1)
self.Bind(wx.EVT_按钮、self.OnButton_2、self.button2)
self.Bind(wx.EVT_按钮、self.OnButton_清除、self.BUTTON_清除)
self.Show()
def ON按钮_清除(自身、事件):
self.ClearSubPanel()
def清除面板(自身):
尝试:
self.SubPanel.Destroy()
self.Fit()
self.Layout()
除:
通过
def ON按钮_1(自身,事件):
self.ClearSubPanel()
子面板_xrc=“”
WX垂直
你母亲是一个
仓鼠
黑骑士
'''
#PanelCoord=self.DynamicPanel.GetPosition()
TopSizer=self.TopPanel.GetSizer()
res=xrc.EmptyXmlResource()
res.LoadFromString(子面板)
self.SubPanel=res.LoadPanel(self,“SubPanel”)
#注意:sizer.Insert()方法的第一个参数是插入新项的索引
顶置器.插入(1,自子面板,1,wx.展开| wx.ALL,5)
self.Fit()
self.Layout()
##还不确定如何动态绑定事件
#self.SubButton1=xrc.XRCCTRL(self.SubPanel,“SubButton1”)
#self.SubButton2=xrc.XRCCTRL(self.SubPanel,“SubButton2”)
def ON按钮2(自身,事件):
self.ClearSubPanel()
子面板_xrc=“”
水平方向
你父亲有股
接骨木
灌木林
'''
TopSizer=self.TopPanel.GetSizer()
res=xrc.EmptyXmlResource()
res.LoadFromString(子面板)
self.SubPanel=res.LoadPanel(self,“SubPanel”)
#注意:sizer.Insert()方法的第一个参数是插入新项的索引
顶置器.插入(1,自子面板,1,wx.展开| wx.ALL,5)
self.Layout()
self.Fit()
#self.SubButton1=xrc.XRCCTRL(self.SubPanel,“SubButton1”)
#self.SubButton2=xrc.XRCCTRL(self.SubPanel,“SubButton2”)
如果名称=“\uuuuu main\uuuuuuuu”:
app=wx.app(假)
frame=XrcFrameSubClass()
app.MainLoop()
大型机:
<?xml version="1.0" encoding="cp1252"?>
<resource>
<object class="wxFrame" name="FRAME1">
<title>This is the title</title>
<object class="wxPanel" name="TopPanel">
<object class="wxBoxSizer">
<orient>wxVERTICAL</orient>
<object class="sizeritem">
<object class="wxBoxSizer">
<orient>wxVERTICAL</orient>
<object class="sizeritem">
<object class="wxButton" name="button1">
<label>Load SubXRC 1</label>
</object>
<option>1</option>
<flag>wxGROW</flag>
</object>
<object class="sizeritem">
<object class="wxButton" name="button2">
<label>Load SubXRC 2</label>
</object>
<option>1</option>
<flag>wxGROW</flag>
</object>
<object class="sizeritem">
<object class="wxButton" name="Button_Clear">
<label>Clear</label>
</object>
</object>
<object class="spacer">
<size>40,20</size>
</object>
</object>
</object>
<object class="sizeritem">
<object class="wxPanel" name="DynamicPanel"/>
<option>1</option>
<flag>wxEXPAND</flag>
<minsize>100,200</minsize>
</object>
<object class="sizeritem">
<object class="wxBoxSizer">
<orient>wxHORIZONTAL</orient>
<object class="sizeritem">
<object class="wxButton" name="button3">
<label>button3</label>
</object>
</object>
<object class="sizeritem">
<object class="wxButton" name="button4">
<label>button4</label>
</object>
</object>
</object>
<flag>wxALIGN_CENTRE</flag>
</object>
</object>
</object>
</object>
</resource>
这是标题
WX垂直
WX垂直
加载子XRC 1
1.
wxGROW
加载子XRC 2
1.
wxGROW
清楚的
40,20
1.
wxEXPAND
100,200
水平方向
按钮3
按钮4
wxALIGN_中心
您是否尝试过使用wxFormBuilder生成XRC?它可以让您为整个应用程序生成一个XRC文件,包括您的Boxsizer、子面板等。我发现这比手动布局或使用多个XRC文件要容易得多。我没有,但我会研究一下。不过,我仍然有一个问题,那就是如何在面板中显示哪个xrc块。试试这个问题:我无法找到wx控件不处于活动状态的具体问题的解决方案(可单击--随便什么)因此,我最终采用了另一种解决方案,包括预先定义一组面板并隐藏/显示它们。这不是一个优雅的解决方案,但它似乎有效。