Verständigungsprobleme? :(

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Automatisatot
User
Beiträge: 7
Registriert: Dienstag 4. März 2014, 13:48

Hallo allerseits,

es geht um diese Tutorial: http://zetcode.com/gui/pyqt4/german/layoutmanagement/

QGridLayout:

Code: Alles auswählen

!/usr/bin/python

# gridlayout.py

import sys
from PyQt4 import QtGui


class GridLayout(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        self.setWindowTitle('grid layout')

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

        grid = QtGui.QGridLayout()

        j = 0
        pos = [(0, 0), (0, 1), (0, 2), (0, 3),
                (1, 0), (1, 1), (1, 2), (1, 3),
                (2, 0), (2, 1), (2, 2), (2, 3),
                (3, 0), (3, 1), (3, 2), (3, 3 ),
                (4, 0), (4, 1), (4, 2), (4, 3)]

        for i in names:
            button = QtGui.QPushButton(i)
            if j == 2:
                grid.addWidget(QtGui.QLabel(''), 0, 2)
            else: grid.addWidget(button, pos[j][0], pos[j][1])
            j = j + 1

        self.setLayout(grid)



app = QtGui.QApplication(sys.argv)
qb = GridLayout()
qb.show()
sys.exit(app.exec_())
was ich jetzt nicht verstehe, wie bringt man es bei nun wirklich zu rechnen?

Danke im voraus für Antwort!

Automatisatot
BlackJack

@Automatisatot: Man würde sich eine Klasse für den Taschenrechner schreiben, welche die ganze nötige Logik enthält und mit der GUI nichts zu tun hat, und die dann mit der GUI verbinden.

Das ist zwar keine Raketenwissenschaft, aber ganz so trivial wie man vielleicht denkt auch nicht, denn Anwender erwarten von jedem noch so billigen physischen Taschenrechner das die Tastenfolge '1', '+', '2', '*', '3', '=' zu dem Ergebnis 7 führt und nicht etwa zu 9. Man wird also so etwas wie einen Stapel für Werte und Operatoren im inneren Zustand des Objektes haben müssen. Und da die Operatoren damit auch Eigenschaften haben, wie zum Beispiel das sie einen Wert haben der den Operatorvorrang beschreibt, macht es vielleicht Sinn die auch als Objekte eines eigenen Typs zu modellieren.

Code: Alles auswählen

class Operator(object):
    def __init__(self, function, precedence_level, symbol):
        pass

    def __call__(self, operand_a, operand_b):
        pass

    def __cmp__(self, other):
        pass
Beispiel wie die API eines `Calculator`-Exemplars in der Verwendung aussehen könnte:

Code: Alles auswählen

plus = Operator(add, 0, '+')
times = Operator(mul, 1, '*')
calculator = Calculator()
calculator.enter_digit('1')
calculator.enter_operator(plus)
calculator.enter_digit('2')
calculator.enter_operator(times)
calculator.enter_digit('3')
calculator.evaluate()
print calculator.display_value  # -> 7
Worüber man sich auch Gedanken machen muss ist das der Benutzer sich nicht an eine sinnvolle Reihenfolge beim drücken der Tasten halten muss. Das Objekt muss sich also auch bei allen unsinnigen Tastenfolgen sinnvoll und definiert verhalten.
Antworten