【问题标题】:AttributeError: 'master' object has no attribute '_loadtk'AttributeError:“主”对象没有属性“_loadtk”
【发布时间】:2018-09-05 05:48:53
【问题描述】:

我正在尝试为已经具有功能的 python 模块作为一个项目制作一个 GUI。我是 Tkinter 的新手,所以我在这里和那里使用了 https://stackoverflow.com/a/7557028/10315872 Bryan Oakley 的这个答案作为我工作的参考,并在此处和那里进行了细微的更改。这里的 GUI python 文件应该从用户那里获取数据并使用其他 python 模块 PdbHandler 和 CrdHandler 来生成必须使用 Tkinter 显示的数据文件。下面附上项目的当前进度,显示错误属性错误“主”对象没有属性“_loadtk”。

  File "C:\Users\Dark12Arrow\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 2022, in __init__
self._loadtk()
AttributeError: 'master' object has no attribute '_loadtk'

我尝试使用 root=tk.Tk() 并将 root 传递给 master,这与此查询 Python Tkinter error object has no attribute 中的类似问题一样。但这显示了另一个错误。

 File "C:\Users\Dark12Arrow\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 2020, in __init__
self.tk = _tkinter.create(screenName, baseName, className, interactive, 
wantobjects, useTk, sync, use)
TypeError: create() argument 1 must be str or None, not Tk

由于代码还不完整,第二页只是一个空白页:

import tkinter as tk
import PdbHandler 
import CrdHandler
from tkinter import filedialog
filetype=0
class master(tk.Frame):
    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 (StartPage, PageOne, PageTwo):
            page_name = F.__name__
            frame = F(parent=container, controller=self)
            self.frames[page_name] = frame
            self.frames[page_name].grid(row=0, column=0, sticky="nsew")

        self.show_frame("StartPage")

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


class StartPage(tk.Frame):
    def __init__(self,parent,controller):
        tk.Frame.__init__(self,parent)
        def NextAction(event):
            if choice.get()==0:
                print("PDB selected")
                filetype=0
                controller.show_frame(PageOne)
            elif choice.get()==1:
                print("CRD Selected")
                filetype = 1
                controller.show_frame(PageOne)
            else:
                print("select one atleast")

        chosemsg=tk.StringVar()
        choice=tk.IntVar()
        clabel=tk.Label(self,textvariable=chosemsg)
        clabel.grid(row=0,padx=30,pady=10)
        chosemsg.set("Chose File type :")
        pdbradbutton=tk.Radiobutton(self,text="PDB",variable=choice,value=0)
        pdbradbutton.grid(row=1)
        crdradbutton=tk.Radiobutton(self,text="CRD",variable=choice,value=1)
        crdradbutton.grid(row=2)
        nextBttn=tk.Button(self,text="Next", command=lambda: NextAction)
        nextBttn.grid(row=4,pady=10,column=5)

class PageOne(tk.Frame):
    def __init__(self,parent,controller):
        tk.Frame.__init__(self,parent)
        def OpenAction():
            if filetype==0:

                self.filename = filedialog.askopenfilename(initialdir="C:\\", title="Select file",
                                                       filetypes=(("pdb files", "*.pdb"), ("all files", "*.*")))
                PdbHandler.pdbHandler(self.filename)
                controller.show_frame(PageTwo)
            elif filetype==1:
                self.filename = filedialog.askopenfilename(initialdir="C:\\", title="Select file",
                                                       filetypes=(("pdb files", "*.pdb"), ("all files", "*.*")))
                CrdHandler.crdHandler(self.filename)
                controller.show_frame(PageTwo)
            else:
                print("select one atleast")


        filename=tk.StringVar()
        choice=tk.IntVar()
        clabel=tk.Label(self,textvariable="Choose file")
        clabel.grid(row=0,padx=30,pady=10)

        nextBttn=tk.Button(self,text="Open", command=lambda: OpenAction)
        nextBttn.grid(row=4,pady=10,column=5)

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

app= master()
app.mainloop()

【问题讨论】:

  • 与提出的问题无关,command=lambda: NextAction 需要为command=NextAction
  • 我最近自己修复了它,但再次感谢。在旁注中,与上述问题无关,即使在修复按钮后我也有一个 KeyError : main.pageone'> 我通过使用stackoverflow.com/a/32716539/10315872 (也由你)修复。我猜这不是必需的,因为在我使用的代码中已经使用 for 循环来实例化所有页面。但无论如何它都得到了解决。代码正在运行。正在加载起始页面。单击的下一个按钮也使用 "PDB Selected" 或 "CRD selected" 登录到控制台。但问题是:下一页,即 PageOne 没有加载
  • 如果您查看代码,您会发现您需要传递"PageOne",而不是PageOne。它需要类 name,而不是实际的类。
  • 很抱歉再次给您带来麻烦,但是在进行更改后,我又收到了一个 KeyError : 'PageOne'
  • 同样的问题。这就是为什么你不应该在不试图理解的情况下从互联网上复制代码的原因。这是一个很容易解决的问题。

标签: python tkinter attributeerror


【解决方案1】:

第 8 行不应该是:

super().__init__(*args, **kwargs)

【讨论】:

  • master 应该派生自tk,而不是tk.Frame
  • 成功了。谢谢各位。虽然由于某种原因,开始页面上的下一步按钮仍然不起作用:/
【解决方案2】:

问题出在这三行:

class master(tk.Frame):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

你是继承自tk.Frame,然后又试图调用tk.Tk__init__方法上面sn-p的第一行和第三行需要对类进行约定。

【讨论】:

  • 您好,属性错误已修复。谢谢。但是起始页中的下一步按钮仍然不起作用
猜你喜欢
  • 1970-01-01
  • 2012-12-01
  • 2021-04-19
  • 2021-11-22
  • 1970-01-01
  • 1970-01-01
  • 2018-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多