AttributeError: у объекта 'master' нет атрибута '_loadtk' - PullRequest
0 голосов
/ 04 сентября 2018

Я пытаюсь сделать графический интерфейс для уже функциональных модулей Python в качестве проекта. Я новичок в Tkinter, поэтому я использовал https://stackoverflow.com/a/7557028/10315872 этот ответ Брайана Оукли здесь в качестве справочного материала для моей работы с небольшими изменениями здесь и там. Здесь предполагается, что файл Python с графическим интерфейсом получает данные от пользователя и использует другие модули Python PdbHandler и CrdHandler для генерации файлов данных, которые должны отображаться с использованием Tkinter. Ниже приведен текущий прогресс проекта, который показывает ошибку. Атрибут error «Главный» объект не имеет атрибута «_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 объект ошибки не имеет атрибута . Но это показывает другую ошибку.

 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()

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Проблема в этих трех строках:

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

Вы наследуете от tk.Frame, но затем пытаетесь вызвать метод __init__ для tk.Tk Первая и третья строки приведенного выше фрагмента должны согласовать класс.

0 голосов
/ 04 сентября 2018

Не должно быть строки 8:

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