Проблема передачи родительской переменной через tkinter - PullRequest
0 голосов
/ 24 сентября 2019

Прежде всего, я должен сказать, что я новичок в Python, поэтому мой код может показаться избыточным или запутанным.Я сделал этот код, который состоит из двух классов, которые оба tkinter frame.Hdf5GUI наследует от класса GUI и отлично работает.Класс ExportGUI наследуется от Hdf5GUI и вызывается функцией export.

# Parent class

from Tkinter import *

class GUI:
    def __init__(self):
        pass

class Hdf5:
    def __init__(self):
        self.datatsetsfilter = "Something"

class Hdf5GUI(GUI):
    def exportDatasetPath(self):
        self.ohdf5 = Hdf5()

Так что до сих пор мой код прекрасно работал, но мне приходилось завершать свою программу некоторыми другими функциями, которые я вызываю в ExportGUI.Например, export_filter, я пытаюсь получить доступ к родительской переменной datasetsfilter через дочернюю функцию, но она не работает:

#==============================================================================
# Child class   
#==============================================================================



class ExportGUI(Hdf5GUI): 

    def __init__(self,hdf5w, master):

        self.master = master
        self.master.title("Export")
        self.master.geometry('200x200')

        label = Label(self.master, text="Choose the kind of export")
        label.place(x=20, y=0)

        export_selected = Button(self.master, text = 'Export filters',command=self.export_filter)
        export_selected.place(x=20, y=50)

        self.master.mainloop()   

    def export_filter(self):    
        print(self.ohdf5.datatsetsfilter)

Но я получил следующую ошибку:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\ProgramData\Anaconda2\lib\lib-tk\Tkinter.py", line 1542, in __call__
    return self.func(*args)
  File "GUI\GUI.py", line 397, in export_filter
    print(self.ohdf5.datatsetsfilter)
AttributeError: 'ExportGUI' object has no attribute 'ohdf5'

Ни ohdf5, ни datatsetsfilter не известны ExportGUI (у меня была такая же ошибка с self.datatsetsfilter). Учитывая, что этот код не работает Я попытался использовать функцию super.Я создал функцию get_datasetsfilter в Hdf5GUI:

 def get_datasetsfilter(self):
        return self.datasetsfilter

, а затем вызвал ее в ExportGUI (я добавил __metaclass__ = type, чтобы исправить тип prblm в 2.7):

def export_filter(self):    
        super(ExportGUI, self).get_datasetsfilter

Признаюсь, я видел много других примеров с Super, но все они, похоже, используются в методе __init__.Тем не менее, это все еще не работает.Теперь мне интересно, является ли ошибка результатом моего плохого понимания наследования или tkinter.

1 Ответ

0 голосов
/ 24 сентября 2019

Вы должны инициализировать свои экземпляры в __init__ и вызвать super().__init__() в родительском классе.

В Python 2 это, вероятно, super().__init__(self)?ИДК.Вы также должны наследовать от object в Python 2 для создания новых классов стилей.

Ниже приведен код Python 3, который решает вашу проблему, возможно, это поможет:

import tkinter as tk

class GUI:
    def __init__(self):
        pass

class Hdf5:
    def __init__(self):
        self.datatsetsfilter = "Something"

class Hdf5GUI(GUI):

    def __init__(self):
        self.ohdf5 = Hdf5()


class ExportGUI(Hdf5GUI): 

    def __init__(self, master):

        super().__init__()

        self.master = master
        self.master.title("Export")
        self.master.geometry('200x200')

        label = tk.Label(self.master, text="Choose the kind of export")
        label.place(x=20, y=0)

        export_selected = tk.Button(self.master, text = 'Export filters',command=self.export_filter)
        export_selected.place(x=20, y=50)

        self.master.mainloop()   

    def export_filter(self):    
        print(self.ohdf5.datatsetsfilter)

e = ExportGUI(tk.Tk())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...