On Sun, Oct 16, 2016 at 12:39 PM likage <dissidia....@gmail.com> wrote:

> I have done all my codings, ui creation etc into a single file and I would
> like to separate between my main functions (manager_main.py) and the ui
> (manager_ui.py) into 2 files
> Just so you know, I created my widgets 'manually' instead of using Qt
> designer..
>
> class manager_ui(QtGui.QDialog):
>     def __init__(self, parent=None):
>         QtGui.QDialog.__init__(self, parent)
>         self.setWindowTitle('UI Manager')
>
>         # Build the GUI
>         self.init_ui()
>         self.populate_table_data()
>         self.connect_signals()
>         self.resize(QtCore.QSize(600, 350))
>
>
>     def init_ui(self):
>         self.color_table = QtGui.QTableWidget()
>         self.color_table.setRowCount(5)
>         self.color_table.setColumnCount(2)
>         self.color_table.setHorizontalHeaderLabels(['Geos in Scene',
>                                                       'Colors'])
>         self.set_color_btn = QPushButton()
>         ...
>
>     def connect_signals(self):
>         self.reset_colors_btn.clicked.connect(self.reset_color)
>
>     def reset_color(self):
>         for row in xrange(self.variant_table.rowCount()):
>             self.color_table.cellWidget(row, 1).setCurrentIndex(0)
>
>     def populate_data(self):
>         ...
>         self.color_combobox = QtGui.QComboBox()
>         self.color_combobox.addItems(list(sorted(new_itempath)))
>         self.color_table.setCellWidget(index, 1, self.color_combobox)
>
> Suppose if I am going to shift the reset_color function into the main
> file, I do got errors stating that self.variant_table, where self is not
> defined etc. I also tried importing in the ui file into the main script and
> renamed it to something such as 'mangaer_ui.variant_table.cellWidget...'
> still I am getting errors.
>
> And so my question would be, in the various functions I have wrote, and
> especially within the functions in which I have stated the widget creations
> variables I have defined (self.color_table, self.set_color_btn etc), I
> suppose I am not able to move it into the main file at all? If it is, what
> is the best way to approach it?
>

Your reset_color() method has direct knowledge of the UI structure in your
class, so it needs to know about a couple table widget members. There are a
few ways you can restructure this to make it work. You can make
reset_color() a function which takes the required table widgets as
parameters, and then you would have to use functools.partial() to wrap it
up in your signal/slot connection:
self.reset_colors_btn.clicked.connect(partial(other_module.reset_color,
table1, table2))
This can work in a number of situations, but for times when you have
widgets that you expect to delete, this can sometimes cause your objects to
stay alive (because of the partial wrapper).

Another way would be to do what is documented in Qt about the different
approaches in using a UI file:
http://pyqt.sourceforge.net/Docs/PyQt4/designer.html
What you see in those examples is a reference to the instance of the main
class being passed to the UI setup class, so that it can initialize it.
Maybe something like this:

class MainClass():
    def __init__(...):
        self._ui = UIClass()
        self._ui.my_button.clicked.connect(self.reset_colors)

    def reset_colors():
        self._ui.some_table.doSomething()



>
> Additionally, was wondering if anyone could give me any insights on what
> to look out for when splitting the file into a main and a ui file?
>

There are a couple of ways to design these things. Your UI could be "dumb"
like the way Qt Designer UI files look after you convert them. They just
define the layout of widgets but have no logic. And then some other class
initializes them and uses the widgets. Then you could go the route of
having a smart UI, where it privately lays out its internal widgets, has a
bunch of logic for doing what it is meant to do, and exposes only the
desired public signals, slots, and methods that a user should access. This
encapsulation makes your widgets more reusable, since the outside world
won't have knowledge about the child widgets. This is also my preferred
approach.


> --
> You received this message because you are subscribed to the Google Groups
> "Python Programming for Autodesk Maya" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to python_inside_maya+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/python_inside_maya/fe696c48-6cc6-4a63-9fe9-acb3ae6056f3%40googlegroups.com
> <https://groups.google.com/d/msgid/python_inside_maya/fe696c48-6cc6-4a63-9fe9-acb3ae6056f3%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"Python Programming for Autodesk Maya" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to python_inside_maya+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/python_inside_maya/CAPGFgA1tTQ5MNqt0GLP38ZfWbqOGSp9G08221mZi2Nw-mShwkA%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to