我有一个批处理文件的小程序。这些文件使用映射文件来加载某些设置。地图文件在顶部有一行,用于指定目录的位置。
目前我能够读取该行并将其分配给源路径变量(sPath)。我想更新源目录的TextCtrl,但是它在MainFrame类中,我将地图文件加载到另一个类中。
class Process(wx.Panel):
def loadMap(self, event):
MainFrame.sPath = str(mapFile.readline()).strip("\n")
MainFrame.loadSource(MainFrame())
class MainFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, title="DICOM Toolkit", size=(800,705))
self.srcTc = wx.TextCtrl(self.panel, 131, '', size=(600,25), style=wx.TE_READONLY)
def loadSource(self):
self.srcTc.SetValue(MainFrame.sPath)
我删除了大部分代码,上面的内容是给我带来麻烦的地方。如何从Process类或MainFrame类中的函数更改MainFrame类中的self.srcTc?我实际上指向self.srcTc时没有来自MainFrame类的处理程序。
答案 0 :(得分:2)
有几种方法可以完成这类事情。您可以将一个句柄传递给面板类,该面板类可以调用父级中需要的任何内容来设置值(即parent.myTxtCtrl.SetValue(val)),也可以使用pubsub。我个人推荐后者,因为它更灵活,并且在您更改程序时不易破损。我编写了以下教程,可以帮助您加快速度:http://www.blog.pythonlibrary.org/2010/06/27/wxpython-and-pubsub-a-simple-tutorial/
答案 1 :(得分:1)
我认为你想要的东西看起来像那样(没有一个工作的例子):
class Process(wx.Panel):
def loadMap(self, event):
frame = MainFrame()
frame.sPath = str(mapFile.readline()).strip("\n")
frame.loadSource()
使用MainFrame.sPath = ...
时,您实际上并没有将sPath更改为您创建的MainFrame,而是更改为类本身,然后在MainFrame()
中创建它,而不存储对它的引用(将其分配给例如一个变量)。因此,您无法从类本身“内部”以外的地方访问它self
。
解决方案是创建MainFrame
的实例并对其进行操作。创建并将其分配给变量后,您可以操纵.sPath
属性并调用loadSource()
。
更新:从您的代码段开始,您似乎在文件末尾创建MainFrame
实例:MainFrame().Show()
,然后在loadMap
中方法,你创建一个新的。
你应该做的就是这个,在你的档案的最后:
app = wx.App(0)
#MainFrame().Show()
mainFrame = MainFrame() # or, insteadof making it a global variable, pass it as an argument to the objects you create, or store a reference to it anywhere else.
mainFrame.Show()
app.MainLoop()
并在loadMap
方法中:
def loadMap(self, event):
global mainFrame # or wherever you stored the reference to it
# ...
# remove this:
# mainFrame = MainFrame()
# set the sPath to the OBJECT mainFrame not the CLASS MainFrame
mainFrame.sPath = str(mapFile.readline()).strip("\n")
mainFrame.srcTc.SetValue(MainFrame.sPath)
现在这样,它应该工作。 问题是您正在创建另一个框架,更改其路径并更新其文本,但您没有显示它。更正是存储正在显示的实际窗口,并更新此窗口。