Cal11 calculator

Python Gui Calculator Without Tkinter

Reviewed by Calculator Editorial Team

Building a Python GUI calculator without Tkinter opens up several modern alternatives that offer better performance, more features, and a more professional look. This guide explores the best options for creating a Python GUI calculator, including PyQt, PySide, and Kivy, with practical examples and comparisons.

Why Avoid Tkinter for Python GUIs

Tkinter is Python's standard GUI library, but it has several limitations that make it less ideal for modern applications:

  • Outdated appearance that doesn't match modern design trends
  • Limited styling options compared to web technologies
  • Performance issues with complex applications
  • Less developer-friendly than modern alternatives

For these reasons, many developers prefer modern GUI frameworks that offer better performance, more features, and a more professional look.

Best Python GUI Libraries Without Tkinter

Several excellent alternatives to Tkinter are available for building Python GUIs:

  1. PyQt: A comprehensive set of Python bindings for Qt, offering a wide range of widgets and tools
  2. PySide: A Python binding for Qt that is more permissively licensed than PyQt
  3. Kivy: An open-source framework for creating multitouch applications with a focus on mobile and desktop
  4. Dear PyGui: A modern, GPU-accelerated GUI framework with a simple API
  5. Toga: A Python native, cross-platform GUI toolkit

Each of these libraries has its strengths and is suitable for different types of applications. The choice depends on your specific needs, such as performance, cross-platform support, or ease of use.

Building a Calculator with PyQt

PyQt is one of the most popular choices for building professional Python GUIs. Here's a simple example of how to create a calculator using PyQt:

To use PyQt, you'll need to install it first: pip install PyQt5

from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QPushButton, QLineEdit

class Calculator(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("PyQt Calculator")
        self.setGeometry(100, 100, 300, 400)

        self.central_widget = QWidget()
        self.setCentralWidget(self.central_widget)

        self.layout = QVBoxLayout()
        self.central_widget.setLayout(self.layout)

        self.display = QLineEdit()
        self.display.setReadOnly(True)
        self.layout.addWidget(self.display)

        buttons = [
            '7', '8', '9', '/',
            '4', '5', '6', '*',
            '1', '2', '3', '-',
            '0', '.', '=', '+'
        ]

        for button_text in buttons:
            button = QPushButton(button_text)
            button.clicked.connect(self.on_button_click)
            self.layout.addWidget(button)

    def on_button_click(self):
        button = self.sender()
        current_text = self.display.text()

        if button.text() == '=':
            try:
                result = str(eval(current_text))
                self.display.setText(result)
            except:
                self.display.setText("Error")
        else:
            self.display.setText(current_text + button.text())

app = QApplication([])
calculator = Calculator()
calculator.show()
app.exec_()

This example creates a basic calculator with numerical buttons and operations. The calculator evaluates expressions when the equals button is pressed.

Creating a Calculator with PySide

PySide is another excellent option that offers similar functionality to PyQt but with a different licensing model. Here's how to create a calculator with PySide:

Install PySide with: pip install PySide6

from PySide6.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QPushButton, QLineEdit

class Calculator(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("PySide Calculator")
        self.setGeometry(100, 100, 300, 400)

        self.central_widget = QWidget()
        self.setCentralWidget(self.central_widget)

        self.layout = QVBoxLayout()
        self.central_widget.setLayout(self.layout)

        self.display = QLineEdit()
        self.display.setReadOnly(True)
        self.layout.addWidget(self.display)

        buttons = [
            '7', '8', '9', '/',
            '4', '5', '6', '*',
            '1', '2', '3', '-',
            '0', '.', '=', '+'
        ]

        for button_text in buttons:
            button = QPushButton(button_text)
            button.clicked.connect(self.on_button_click)
            self.layout.addWidget(button)

    def on_button_click(self):
        button = self.sender()
        current_text = self.display.text()

        if button.text() == '=':
            try:
                result = str(eval(current_text))
                self.display.setText(result)
            except:
                self.display.setText("Error")
        else:
            self.display.setText(current_text + button.text())

app = QApplication([])
calculator = Calculator()
calculator.show()
app.exec()

This PySide calculator is very similar to the PyQt version, demonstrating how both libraries provide similar functionality with slightly different syntax.

Building a Calculator with Kivy

Kivy is a different approach to Python GUIs, focusing on multitouch applications. Here's how to create a calculator with Kivy:

Install Kivy with: pip install kivy

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.textinput import TextInput

class CalculatorApp(App):
    def build(self):
        self.operators = ["/", "*", "+", "-"]
        self.last_was_operator = None
        self.last_button = None

        layout = BoxLayout(orientation='vertical')

        self.solution = TextInput(
            multiline=False, readonly=True, halign="right", font_size=55
        )
        layout.add_widget(self.solution)

        buttons = [
            ['7', '8', '9', '/'],
            ['4', '5', '6', '*'],
            ['1', '2', '3', '-'],
            ['.', '0', 'C', '+'],
            ['=']
        ]

        for row in buttons:
            h_layout = BoxLayout()
            for label in row:
                button = Button(
                    text=label,
                    pos_hint={"center_x": 0.5, "center_y": 0.5},
                )
                button.bind(on_press=self.on_button_press)
                h_layout.add_widget(button)
            layout.add_widget(h_layout)

        return layout

    def on_button_press(self, instance):
        current = self.solution.text
        button_text = instance.text

        if button_text == 'C':
            self.solution.text = ""
        elif button_text == "=":
            try:
                self.solution.text = str(eval(self.solution.text))
            except:
                self.solution.text = "Error"
        else:
            if current and (
                self.last_was_operator and button_text in self.operators):
                return
            elif current == "" and button_text in self.operators:
                return
            else:
                new_text = current + button_text
                self.solution.text = new_text
        self.last_button = button_text
        self.last_was_operator = self.last_button in self.operators

if __name__ == "__main__":
    app = CalculatorApp()
    app.run()

This Kivy calculator provides a more modern look and feel, with better touch support and a more responsive interface.

Comparison of GUI Libraries

Here's a quick comparison of the three main alternatives to Tkinter:

Library Pros Cons
PyQt Mature, feature-rich, good documentation Commercial license required for some uses
PySide More permissive license, similar features Slightly less documentation than PyQt
Kivy Modern look, good for touch interfaces Less traditional desktop GUI feel

Each library has its strengths, and the best choice depends on your specific project requirements.

Frequently Asked Questions

Which Python GUI library is best for beginners?

For beginners, PySide is often the best choice as it provides good documentation and a permissive license. Kivy is also a good option if you're interested in mobile development.

Can I use these libraries for commercial projects?

Yes, all three libraries can be used for commercial projects. PyQt requires a commercial license for some uses, while PySide and Kivy have more permissive licenses.

Which library has the best performance?

PyQt and PySide typically offer the best performance for traditional desktop applications, while Kivy is optimized for touch interfaces and may have slightly different performance characteristics.