3

What I want to do is to be able to open grid.py by clicking on the button on main.py. Preferably by keeping the same structure (ui file and the main and grid python files). Thank you,

So, I've created a simple UI interface that contains only a push button with Qt Designer (test-open.ui):

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>604</width>
    <height>424</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QPushButton" name="pushButton">
    <property name="geometry">
     <rect>
      <x>230</x>
      <y>160</y>
      <width>75</width>
      <height>23</height>
     </rect>
    </property>
    <property name="text">
     <string>PushButton</string>
    </property>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>604</width>
     <height>21</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

Then I created the main .py file (main.py):

from PyQt5 import QtWidgets, uic

app = QtWidgets.QApplication([])
dlg = uic.loadUi(r"E:\Python\Project\test-open.ui")

dlg.show()
app.exec()

And finally, this is a Grid I've created with WxPython that I want to be opened by the button click (grid.py)

import sys

from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QAction, QTableWidget,QTableWidgetItem,QVBoxLayout
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import pyqtSlot


class App(QWidget):

    def __init__(self):
        super().__init__()
        self.title = 'PyQt5 table - pythonspot.com'
        self.left = 0
        self.top = 0
        self.width = 460
        self.height = 200
        self.initUI()

    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        self.createTable()

        # Add box layout, add table to box layout and add box layout to widget
        self.layout = QVBoxLayout()
        self.layout.addWidget(self.tableWidget) 
        self.setLayout(self.layout) 

        # Show widget
        self.show()

    def createTable(self):
       # Create table
        self.tableWidget = QTableWidget()
        self.tableWidget.setRowCount(4)
        self.tableWidget.setColumnCount(4)
        self.tableWidget.setItem(0,0, QTableWidgetItem("Cell (1,1)"))
        self.tableWidget.setItem(0,1, QTableWidgetItem("Cell (1,2)"))
        self.tableWidget.setItem(0,2, QTableWidgetItem("Cell (1,1)"))
        self.tableWidget.setItem(0,3, QTableWidgetItem("Cell (1,2)"))
        self.tableWidget.setItem(0,4, QTableWidgetItem("Cell (1,1)"))

        self.tableWidget.setItem(1,0, QTableWidgetItem("Cell (1,1)"))
        self.tableWidget.setItem(1,1, QTableWidgetItem("Cell (1,2)"))
        self.tableWidget.setItem(1,2, QTableWidgetItem("Cell (1,1)"))
        self.tableWidget.setItem(1,3, QTableWidgetItem("Cell (1,2)"))
        self.tableWidget.setItem(1,4, QTableWidgetItem("Cell (1,1)"))

        self.tableWidget.setItem(2,0, QTableWidgetItem("Cell (1,1)"))
        self.tableWidget.setItem(2,1, QTableWidgetItem("Cell (1,2)"))
        self.tableWidget.setItem(2,2, QTableWidgetItem("Cell (1,1)"))
        self.tableWidget.setItem(2,3, QTableWidgetItem("Cell (1,2)"))
        self.tableWidget.setItem(2,4, QTableWidgetItem("Cell (1,1)"))

        self.tableWidget.setItem(3,0, QTableWidgetItem("Cell (1,1)"))
        self.tableWidget.setItem(3,1, QTableWidgetItem("Cell (1,2)"))
        self.tableWidget.setItem(3,2, QTableWidgetItem("Cell (1,1)"))
        self.tableWidget.setItem(3,3, QTableWidgetItem("Cell (1,2)"))
        self.tableWidget.setItem(3,4, QTableWidgetItem("Cell (1,1)"))
        self.tableWidget.move(0,0)

        # table selection change
        self.tableWidget.doubleClicked.connect(self.on_click)

    @pyqtSlot()
    def on_click(self):
        print("\n")
        for currentQTableWidgetItem in self.tableWidget.selectedItems():
            print(currentQTableWidgetItem.row(), currentQTableWidgetItem.column(), currentQTableWidgetItem.text())

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())  
eyllanesc
  • 235,170
  • 19
  • 170
  • 241
Creek Barbara
  • 637
  • 1
  • 7
  • 29

1 Answers1

2

You are confusing the concepts, a program is not a set of files but the interaction between objects created based on the classes. So before implementing anything, I will assume that the files have the following structure:

├── grid.py
├── main.py
└── test-open.ui

On the other hand in the App class constructor you are showing the window and that is not what you want, initially the window must be closed so I will eliminate that line. Going to the point, you must import the grid module in main to be able to create an App widget object.

grid.py

import sys

from PyQt5.QtWidgets import (
    QMainWindow,
    QApplication,
    QWidget,
    QAction,
    QTableWidget,
    QTableWidgetItem,
    QVBoxLayout,
)
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import pyqtSlot


class App(QWidget):
    def __init__(self):
        super().__init__()
        self.title = "PyQt5 table - pythonspot.com"
        self.left = 0
        self.top = 0
        self.width = 460
        self.height = 200
        self.initUI()

    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        self.createTable()

        # Add box layout, add table to box layout and add box layout to widget
        self.layout = QVBoxLayout()
        self.layout.addWidget(self.tableWidget)
        self.setLayout(self.layout)

    def createTable(self):
        # Create table
        self.tableWidget = QTableWidget()
        self.tableWidget.setRowCount(4)
        self.tableWidget.setColumnCount(4)
        self.tableWidget.setItem(0, 0, QTableWidgetItem("Cell (1,1)"))
        self.tableWidget.setItem(0, 1, QTableWidgetItem("Cell (1,2)"))
        self.tableWidget.setItem(0, 2, QTableWidgetItem("Cell (1,1)"))
        self.tableWidget.setItem(0, 3, QTableWidgetItem("Cell (1,2)"))
        self.tableWidget.setItem(0, 4, QTableWidgetItem("Cell (1,1)"))

        self.tableWidget.setItem(1, 0, QTableWidgetItem("Cell (1,1)"))
        self.tableWidget.setItem(1, 1, QTableWidgetItem("Cell (1,2)"))
        self.tableWidget.setItem(1, 2, QTableWidgetItem("Cell (1,1)"))
        self.tableWidget.setItem(1, 3, QTableWidgetItem("Cell (1,2)"))
        self.tableWidget.setItem(1, 4, QTableWidgetItem("Cell (1,1)"))

        self.tableWidget.setItem(2, 0, QTableWidgetItem("Cell (1,1)"))
        self.tableWidget.setItem(2, 1, QTableWidgetItem("Cell (1,2)"))
        self.tableWidget.setItem(2, 2, QTableWidgetItem("Cell (1,1)"))
        self.tableWidget.setItem(2, 3, QTableWidgetItem("Cell (1,2)"))
        self.tableWidget.setItem(2, 4, QTableWidgetItem("Cell (1,1)"))

        self.tableWidget.setItem(3, 0, QTableWidgetItem("Cell (1,1)"))
        self.tableWidget.setItem(3, 1, QTableWidgetItem("Cell (1,2)"))
        self.tableWidget.setItem(3, 2, QTableWidgetItem("Cell (1,1)"))
        self.tableWidget.setItem(3, 3, QTableWidgetItem("Cell (1,2)"))
        self.tableWidget.setItem(3, 4, QTableWidgetItem("Cell (1,1)"))
        self.tableWidget.move(0, 0)

        # table selection change
        self.tableWidget.doubleClicked.connect(self.on_click)

    @pyqtSlot()
    def on_click(self):
        print("\n")
        for currentQTableWidgetItem in self.tableWidget.selectedItems():
            print(
                currentQTableWidgetItem.row(),
                currentQTableWidgetItem.column(),
                currentQTableWidgetItem.text(),
            )


if __name__ == "__main__":
    app = QApplication(sys.argv)
    ex = App()
    ex.show()
    sys.exit(app.exec_())

main.py

from PyQt5 import QtWidgets, uic
from grid import App


if __name__ == "__main__":
    import os
    import sys

    app = QtWidgets.QApplication(sys.argv)
    file = os.path.join(
        os.path.dirname(os.path.realpath(__file__)), "test-open.ui"
    )
    dlg = uic.loadUi(file)
    w = App()
    dlg.pushButton.clicked.connect(w.show)
    dlg.show()
    sys.exit(app.exec_())
eyllanesc
  • 235,170
  • 19
  • 170
  • 241
  • Thank you @eyllanesc it worked great. What line are you talking about that is showing the window? One last question if you allow me, if I have two buttons on my main.py, how do I differentiate between which one has been clicked? – Creek Barbara May 20 '19 at 04:55
  • 1
    @CreekBarbara 1) The line that shows the window is the following `dlg.pushButton.clicked.connect(w.show)` 2) In the .ui each button has a name: ``, so if you have another button it will have another name – eyllanesc May 20 '19 at 05:02
  • I figured the name out the same moment you posted your answer :). For the 1st question I was asking about the line that line you eliminated from my code, I can't put my finger on it. Thank you again – Creek Barbara May 20 '19 at 05:07
  • 1
    @CreekBarbara this lines `# Show widget self.show()` – eyllanesc May 20 '19 at 05:10