0

我有一个批处理文件的小程序。这些文件使用地图文件来加载某些设置。映射文件的顶部有一行指定它的目录。

目前我能够读取该行并将其分配给源路径变量(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?如果没有源自 MainFrame 类的处理程序,我实际上无法指向 self.srcTc。

4

2 回答 2

2

有几种方法可以完成这类事情。您可以将句柄传递给面板类,该类可以调用父级中所需的任何内容来设置值(即 parent.myTxtCtrl.SetValue(val) ),或者您可以使用 pubsub。我个人推荐后者,因为它更灵活,并且在您更改程序时不易损坏。我写了以下教程,可以让你快速上手:http: //www.blog.pythonlibrary.org/2010/06/27/wxpython-and-pubsub-a-simple-tutorial/

于 2012-04-27T15:26:53.467 回答
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

解决方案是创建一个 a 的实例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)

现在这样,它应该可以工作。问题是您正在创建另一个框架,更改其路径并更新其文本,但您没有显示它。更正是存储正在显示的实际窗口,并更新这个。

于 2012-04-27T15:21:09.850 回答