0

I am a beginner in QT. I want to create a simple GUI to load an image from a file. That's Why I create a button in my GUI, named pushButton (I designed the GUI by QT Creator). Now how can I access the pushButton from my python file?

enter image description here

Here is my XML Code (from ui file)

<ui version="4.0">
 <class>OCR</class>
 <widget class="QWidget" name="OCR">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>567</width>
    <height>332</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>OCR</string>
  </property>
  <widget class="QPushButton" name="pushButton">
   <property name="geometry">
    <rect>
     <x>480</x>
     <y>300</y>
     <width>75</width>
     <height>23</height>
    </rect>
   </property>
   <property name="text">
    <string>Open Image</string>
   </property>
   <property name="autoDefault">
    <bool>true</bool>
   </property>
  </widget>
  <widget class="QScrollArea" name="scrollArea">
   <property name="geometry">
    <rect>
     <x>10</x>
     <y>10</y>
     <width>541</width>
     <height>281</height>
    </rect>
   </property>
   <property name="verticalScrollBarPolicy">
    <enum>Qt::ScrollBarAlwaysOn</enum>
   </property>
   <property name="horizontalScrollBarPolicy">
    <enum>Qt::ScrollBarAlwaysOn</enum>
   </property>
   <property name="widgetResizable">
    <bool>true</bool>
   </property>
   <widget class="QWidget" name="scrollAreaWidgetContents">
    <property name="geometry">
     <rect>
      <x>0</x>
      <y>0</y>
      <width>522</width>
      <height>262</height>
     </rect>
    </property>
    <layout class="QGridLayout" name="gridLayout">
     <item row="0" column="0">
      <widget class="QLabel" name="label">
       <property name="styleSheet">
        <string notr="true">background-color: rgb(170, 255, 255);</string>
       </property>
       <property name="text">
        <string>Photo</string>
       </property>
       <property name="alignment">
        <set>Qt::AlignCenter</set>
       </property>
      </widget>
     </item>
    </layout>
   </widget>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>

Here is My Python Code

import sys
import os
import cv2
from PySide2.QtGui import QImage, QPixmap

from PySide2.QtWidgets import QApplication, QWidget, QFileDialog, QPushButton
from PySide2.QtCore import QFile
from PySide2.QtUiTools import QUiLoader


class OCR(QWidget):


    def __init__(self):
        super(OCR, self).__init__()
        self.load_ui()
        self.show()
        self.image = None

    def load_ui(self):
        loader = QUiLoader()
        path = os.path.join(os.path.dirname(__file__), "form.ui")
        ui_file = QFile(path)
        ui_file.open(QFile.ReadOnly)
        loader.load(ui_file, self)
        ui_file.close()

    

if __name__ == "__main__":
    app = QApplication([])
    widget = OCR()
    widget.show()
    sys.exit(app.exec_())

Here, load_ui function load my UI file.

2 Answers 2

1

When you want to access button you just use this in __init__: self.pushButton + action

In your code, your class(OCR) is based on QWidget and later you load this widget from file using load_ui(). In this solution I didn't manage to access pushButton.

If you want to access buttons and other stuff I recommend slightly different project structure. Instead make OCR class based on actual widget.

import sys
import os
from PySide2.QtWidgets import QApplication
from PySide2.QtUiTools import loadUiType

current_dir = os.path.dirname(os.path.abspath(__file__))
Form, Base = loadUiType(os.path.join(current_dir, "form.ui"))


class OCR(Base, Form):
    def __init__(self, parent=None):
        super(self.__class__, self).__init__(parent)
        self.setupUi(self)
        self.image = None
        self.pushButton.clicked.connect(lambda: self.function_called_when_btn_is_clicked())

    def function_called_when_btn_is_clicked(self):
        print("Button clicked!!!!!!")

if __name__ == "__main__":
    app = QApplication([])
    widget = OCR()
    widget.show()
    sys.exit(app.exec_())

In this example ui file is loaded via function build in PySide2 > loadUiType. All of elements in ui file now can be accessed in __init__function via self.name_of_element. When you run code code from above, clicking on button will result printing "Button clicked!!!!!!" on console. If you have more question, feel free to ask :)

Sign up to request clarification or add additional context in comments.

1 Comment

Hey @Hasan, if my answer was helpful and works the way as you intended, can I ask you to mark my answer as answer to this question or upvote it? I want to get 50 reputation to gain privilege of commenting other peoples post :). I will be so glad for your kindness. Have a nice day and :D
1

You can access the button by first registering your button using self.findChild(Class, name). I have added it in your code:

import sys
import os
import cv2
from PySide2.QtGui import QImage, QPixmap

from PySide2.QtWidgets import QApplication, QWidget, QFileDialog, QPushButton
from PySide2.QtCore import QFile
from PySide2.QtUiTools import QUiLoader


class OCR(QWidget):


    def __init__(self):
        super(OCR, self).__init__()
        self.load_ui()
        self.my_push_button = self.findChild(QPushButton, "pushButton")
        self.show()
        self.image = None

    def load_ui(self):
        loader = QUiLoader()
        path = os.path.join(os.path.dirname(__file__), "form.ui")
        ui_file = QFile(path)
        ui_file.open(QFile.ReadOnly)
        loader.load(ui_file, self)
        ui_file.close()


def print_hello_world(self):
    print("Hello world")


if __name__ == "__main__":
    app = QApplication([])
    widget = OCR()
    widget.my_push_button.clicked.connect(print_hello_world)
    widget.show()
    sys.exit(app.exec_())

1 Comment

I do believe this more ought to be the accepted answer, though the accepted answer in this case is more informative... This is the answer to the question.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.