【问题标题】:Manually call __init__手动调用 __init__
【发布时间】:2015-08-04 02:25:16
【问题描述】:

所以我试图在 python tkinter 中处理两个窗口,它们可以编辑包含某些图像路径的 xml 文件,问题是读取文件的函数在我的两个类窗口的 __init__ 中,所以每当我在窗口之间切换,出现相同的图像。我的问题是:有什么方法可以重新启动课程以便 __init__ 运行?

我认为问题出在show_frame 函数内,因为tkraise 不运行类中的函数,而只是将类中的任何内容弹出到顶部。

class xmleditApp(tk.Tk):

    def __init__(self, *args, **kwargs):

        tk.Tk.__init__(self, *args, **kwargs)
        container = tk.Frame(self)

        container.pack(side="top", fill="both", expand = True)

        container.grid_rowconfigure(0,weight=1)
        container.grid_columnconfigure(0,weight=1)

        self.frames = {}

        for F in (FirstWindow, SecondWindow):

            frame = F(container, self)

            self.frames[F] = frame

            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame(FirstWindow)

    def show_frame(self, cont):
        frame=self.frames[cont]
        frame.tkraise()

这是我想在返回时自动更新的类:

class FirstWindow(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self,parent)

        secondwindow=tk.Button(self,text="edit xml",command=lambda: controller.show_frame(SecondWindow))
        secondwindow.grid(row=3,column=0)

        def getimagepath():
            doc = parse('pruebasXML.xml')
            paths = doc.getroot()
            path = paths.findall('path')
            pasthlist = []
            for elem in range (0,len(path)):
                pathlist+=[[]]
                for tag in range (0,11):
                    pathlist[elem]+=[path[elem][tag].text]
            return createbutton(pasthlist)

        def createbutton(lst):
            for elem in range(0,len(lst)):
                buttonName=elem
                photo=tk.PhotoImage(file=lst[elem][0]+'.gif')
                buttonName=tk.Button(self, image=photo)
                buttonName.grid(row=2, column=elem)
                buttonName.image=photo

        if os.path.exists('pathsXML.xml')==True:
            getimagepath()

【问题讨论】:

  • 这样安全吗?我听说调用 init 时会出现很多问题,我还需要在括号中写上父级和控制器吗? @fhdrsdg
  • 你为什么不把逻辑移出__init__呢?
  • 我会试一试,告诉你进展如何
  • 当我将它移出 init 时,我收到一条错误消息,提示 createbutton 不存在
  • 定义createbutton__init__同级时,应定义为def createbutton(self, lst):,调用为self.createbutton(some_list)

标签: python class tkinter window


【解决方案1】:

如果您有一个名为myclass 的类,您可以使用myclass.__init__(self, etc) 手动调用__init__。这里,self 是 self 参数,etc 是其他参数。

【讨论】:

    猜你喜欢
    • 2010-11-26
    • 2018-12-02
    • 2020-07-15
    • 2017-08-26
    • 2013-08-17
    • 2015-11-20
    • 2016-08-08
    • 2015-09-08
    • 1970-01-01
    相关资源
    最近更新 更多