Рубрики
Без рубрики

Писид: Создание конвертера валют

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: Mike Driscoll.

Я сейчас читаю через книгу Марка Найбльфилда на Pyqt, Rapid GUI Программирование с Python и Qt И думал, что было бы удовольствием взять некоторые из примеров приложений в нем и преобразовать их в Pyside. Поэтому я буду создавать серию статей, где я покажу оригинальные примеры PYQT из книги, а затем преобразуете их в Pyside и, вероятно, добавляете что-то в своем отношении к коду. Книга на самом деле не попадает в QT GUI кодировку до главы 4, где автор создает забавный международный конвертер валют. Приходите и наслаждайтесь весельем!

Вот в основном оригинальный код:

import sys
import urllib2
from PyQt4.QtCore import SIGNAL
from PyQt4.QtGui import QComboBox, QDialog, QDoubleSpinBox, QLabel
from PyQt4.QtGui import QApplication, QGridLayout

########################################################################
class CurrencyDlg(QDialog):
    """"""

    #----------------------------------------------------------------------
    def __init__(self, parent=None):
        """Constructor"""
        super(CurrencyDlg, self).__init__(parent)
        
        date = self.getdata()
        rates = sorted(self.rates.keys())
        
        dateLabel = QLabel(date)
        self.fromComboBox = QComboBox()
        self.fromComboBox.addItems(rates)
        
        self.fromSpinBox = QDoubleSpinBox()
        self.fromSpinBox.setRange(0.01, 10000000.00)
        self.fromSpinBox.setValue(1.00)
        
        self.toComboBox = QComboBox()
        self.toComboBox.addItems(rates)
        self.toLabel = QLabel("1.00")
        
        # layout the controls
        grid = QGridLayout()
        grid.addWidget(dateLabel, 0, 0)
        grid.addWidget(self.fromComboBox, 1, 0)
        grid.addWidget(self.fromSpinBox, 1, 1)
        grid.addWidget(self.toComboBox, 2, 0)
        grid.addWidget(self.toLabel, 2, 1)
        self.setLayout(grid)
        
        # set up the event handlers
        self.connect(self.fromComboBox, SIGNAL("currentIndexChanged(int)"),
                     self.updateUi)
        self.connect(self.toComboBox, SIGNAL("currentIndexChanged(int)"),
                     self.updateUi)
        self.connect(self.fromSpinBox, SIGNAL("valueChanged(double)"),
                     self.updateUi)
        
        self.setWindowTitle("Currency")
        
    #----------------------------------------------------------------------
    def getdata(self):
        """
        """
        self.rates = {}
        url = "http://www.bankofcanada.ca/en/markets/csv/exchange_eng.csv"
        try:
            date = None
            fh = urllib2.urlopen(url)
            for line in fh:
                line = line.rstrip()
                if not line or line.startswith(("#", "Closing ")):
                    continue
                fields = line.split(",")
                if line.startswith("Date "):
                    date = fields[-1]
                else:
                    try:
                        value = float(fields[-1])
                        self.rates[unicode(fields[0])] = value
                    except ValueError:
                        pass
            return "Exchange Rates Date: " + date
        except Exception, e:
            return "Failed to download: \n%s" % e
    
    #----------------------------------------------------------------------
    def updateUi(self):
        """
        Update the user interface
        """
        to = unicode(self.toComboBox.currentText())
        frum = unicode(self.fromComboBox.currentText())
        amount = ( self.rates[frum] / self.rates[to] ) 
        amount *= self.fromSpinBox.value()
        self.toLabel.setText("%0.2f" % amount)
    
#----------------------------------------------------------------------
if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = CurrencyDlg()
    form.show()
    app.exec_()

Если вы действительно хотите узнать, как работает этот код, я рекомендую получить вышеупомянутую книгу или изучаю код. Ведь питон.

Портирование к писийде

Теперь нам нужно «порт» это на Писид , версия LGPL привязки QT для Python. К счастью, в этом примере это за его пределами. Все, что вам нужно сделать, это изменить следующий импорт

к

Если вы сделаете это и сохраните его, вы будете готовы портировать, и код теперь будет работать в землецелевой. Однако я думаю, что нам нужно немного дальше и сделать этот код немного умнее. Вы заметите в оригинале, что каждый раз, когда вы запускаете его, приложение будет выходить в интернет и загрузить данные обменного курса. Это, кажется, немного изготена, поэтому давайте добавим чек, чтобы увидеть, если он уже загружен и менее чем в день. Только если он старше дня, мы хотим скачать новую копию. И вместо использования Urllib2, давайте будем использовать новичок Запросы Вместо этого библиотека.

Вот новый код:

Хорошо, давайте проведем немного времени, глядя на код. Мы не будем все объяснить, но мы пойдем за то, что было изменено. Во-первых, мы импортировали еще несколько модулей: datetime , ОС , Запросы и sys Отказ Мы также импортировали сам писсид, чтобы мы могли легко добавить свою информацию о версии в строку заголовка диалогового окна. Далее мы добавили пару новых методов: DownloadFile и Обработка линии Отказ Но сначала нам нужно посмотреть на то, что было изменено в getdata Отказ Здесь мы снимаем путь, в котором работает скрипт и использует, что для создания полностью квалифицированного пути к файлу ставок. Затем мы проверяем, существует ли она. Если это не существует, мы называем DownloadFile Метод, который использует Запросы Библиотека для загрузки файла. Мы также используем Python’s с Контекстная менеджерная конструкция, которая автоматически закроет файл, когда мы закончим, написав его.

Если файл существует, то мы падаем до конца оператора, в которой мы проверяем, если последняя модифицированная дата файла старше сегодняшней даты. Если это так, то мы загружаем файл и перезаписываем оригинал. Затем мы двигаемся к обработке файла. Для обработки мы перемещаем большую часть кода в отдельный метод под названием Обработка линии Отказ Основной причиной для этого является то, что если мы этого не сделаем, мы в конечном итоге с очень сложной вложенной структурой, которая может быть трудно следовать. Мы также добавляем проверку, чтобы увидеть, была ли дата возвращена из обработчика PECLINGLE, и если она имеет, мы устанавливаем переменную даты. Остальная часть кода осталась прежней.

Упаковка

На данный момент вы должны знать, как создать очень простое приложение Pyside, которое действительно может сделать что-то полезное. Не только это, но у вас также есть очень общая идея о том, как портировать свой код PYQT в Pyside. Вы также были подвержены двум различным способам загрузки файлов из сети. Я надеюсь, что это открыло ваши глаза на силу Python и веселье программирования.

Примечание. Код в этой статье был протестирован на Windows 7 Professional с Python 2.6.6, Pyside 1.2.2 и PYQT4

Связанные ссылки

Скачать источник

  • pyqt-side-currence.zip.