Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » QLineEdit - ввод с разделителями тысяч [RSS Feed]

#1 Сен. 5, 2017 13:01:59

Kyrym
Зарегистрирован: 2016-12-28
Сообщения: 225
Репутация: +  3  -
Профиль   Отправить e-mail  

QLineEdit - ввод с разделителями тысяч

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

Офлайн

#2 Сен. 5, 2017 13:09:07

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

QLineEdit - ввод с разделителями тысяч

Kyrym
Во-вторых, разделить тысяч мог бы быть как PyQt, так и в самом питоне или модуле для него. Есть же в PyQt маски…
Поясните свою мысль. Питон - язык программирования, зачем в нем какие-то бухгалтерские примочки? Каким образом в “модуле для него” возможно реализовать изменение синтаксических правил языка? Еще раз: как по-вашему связаны Qt и питон?



Офлайн

#3 Сен. 5, 2017 15:20:23

Kyrym
Зарегистрирован: 2016-12-28
Сообщения: 225
Репутация: +  3  -
Профиль   Отправить e-mail  

QLineEdit - ввод с разделителями тысяч

FishHook
Поясните свою мысль.
Не хочу продолжать этот пустой диалог.
______________________________

Короче, написал функцию, но работает ппц медленно
 # Python 3. PyQt4
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtGui, QtCore
# ЦВЕТА ПОЛЕЙ
sss_vivod = ("background-color: #456173; color: #f2f2f0; font: 14pt 'Courier New'")
# ГРАФИКА
class Window(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.resize(200, 100) # шир / выс окна         
        # БЛОК РАЗМЕТКИ
        self.vbox = QtGui.QVBoxLayout()
        # ---
        self.pole = QtGui.QLineEdit('')
        self.pole.setStyleSheet(sss_vivod)
        self.pole.textEdited.connect(self.razd) 
        self.vbox.addWidget(self.pole)
        # ---
        self.setLayout(self.vbox)
    # ЛОГИКА
    def razd(self, x):
        x = str(x).replace(' ','')
        if x.find('.') == -1:
            x1 = x
            x2 = ''
        else:
            x1 = x[:x.find('.')]
            x2 = x[x.find('.'):len(x)]
        x1 = list(str(x1))
        x1 = x1[::-1]
        i = 0
        while i < len(x1):
            if i/4 == i//4:
                x1.insert(i,' ')
            i += 1
        x = ''.join(x1[len(x1):0:-1])+x2
        print(x)
        self.pole.setText(x)
# КОНЕЦ
if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    window = Window() # создаёт экземпляр окна из класса   
    window.show() # запускает окно
    sys.exit(app.exec_())

________
Добавлено позже.
М-да, вырубил принт, и заработало как надо.

Отредактировано Kyrym (Сен. 5, 2017 15:29:20)

Офлайн

#4 Сен. 6, 2017 16:25:10

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

QLineEdit - ввод с разделителями тысяч

Kyrym вы опять рвете гланды черех жопу? для начала ваш razd(self, x): можно попроще написать:

 x= 12345678
print('{0:,}'.format(x).replace(',', ' '))
>>> 
12 345 678
ИМХО я бы создал класс наследник QLineEdit и переопределил бы в нем paintEvent. Конечно это нетривиальная задача, но если вы справитесь вы значительно поднимете свой скил.
Ниже приведен простенький пример, без отображения кусора и выделеного текста, но думаю принцип понятен..
 import sys
from PyQt4 import QtGui, QtCore
# ЦВЕТА ПОЛЕЙ
sss_vivod = ("background-color: #456173; color: #f2f2f0; font: 14pt 'Courier New'")
# ГРАФИКА
class LineEditWithTthousands(QtGui.QLineEdit):
    def init(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.textChanged.connect(self.setVisibleText)
    def paintEvent(self, event):
        painter = QtGui.QStylePainter(self)
        option = QtGui.QStyleOptionFrame()
        self.initStyleOption(option)
        painter.drawPrimitive(QtGui.QStyle.PE_PanelLineEdit, option)
        text = self.text()
        try:
            drawedText = int(text)
        except ValueError:
            drawedText = text
        else:
            drawedText = '{0:,}'.format(drawedText).replace(',', ' ')
        finally:
            painter.drawText(self.contentsRect(), QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter, drawedText)
class Window(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.resize(200, 100) # шир / выс окна
        # БЛОК РАЗМЕТКИ
        self.vbox = QtGui.QVBoxLayout()
        # ---
        self.pole = LineEditWithTthousands('')
        self.pole.setStyleSheet(sss_vivod)
        self.pole.textEdited.connect(self.razd)
        self.vbox.addWidget(self.pole)
        # ---
        self.setLayout(self.vbox)
    # ЛОГИКА
    def razd(self, x):
        print(x)
# КОНЕЦ
if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    window = Window() # создаёт экземпляр окна из класса
    window.show() # запускает окно
    sys.exit(app.exec_())



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#5 Сен. 6, 2017 16:26:37

Kyrym
Зарегистрирован: 2016-12-28
Сообщения: 225
Репутация: +  3  -
Профиль   Отправить e-mail  

QLineEdit - ввод с разделителями тысяч

Нашёл вот такой код:

 x = 1234567
y = '{0:,}'.format(x).replace(',', ' ')
print(y)
Переделал свой вариант с GUI:
 # Python 3. PyQt4
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtGui, QtCore
# ЦВЕТА ПОЛЕЙ
sss_vivod = ("background-color: #456173; color: #f2f2f0; font: 14pt 'Courier New'")
# ГРАФИКА
class Window(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.resize(200, 100) # шир / выс окна         
        # БЛОК РАЗМЕТКИ
        self.vbox = QtGui.QVBoxLayout()
        # ---
        self.pole = QtGui.QLineEdit('')
        self.pole.setStyleSheet(sss_vivod)
        self.pole.textEdited.connect(self.razd) 
        self.vbox.addWidget(self.pole)
        # ---
        self.setLayout(self.vbox)
    # ЛОГИКА
    def razd(self):
        x = self.pole.text().replace(' ','')        
        if x.find('.') == -1:
            x1 = x
            x2 = ''
        else:
            x1 = x[:x.find('.')]
            x2 = x[x.find('.'):len(x)]
        x1 = '{0:,}'.format(int(x1)).replace(',', ' ')
        x = ''.join(x1+x2)
        self.pole.setText(x)
        
# КОНЕЦ
if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    window = Window() # создаёт экземпляр окна из класса   
    window.show() # запускает окно
    sys.exit(app.exec_())

Офлайн

#6 Сен. 6, 2017 16:54:05

Kyrym
Зарегистрирован: 2016-12-28
Сообщения: 225
Репутация: +  3  -
Профиль   Отправить e-mail  

QLineEdit - ввод с разделителями тысяч

PEHDOM, как интересно Вы опередили мой пост на 1,5 минуты.

Вашу задачу с классом я решил:

 import sys
from PyQt4 import QtGui, QtCore
# ЦВЕТА ПОЛЕЙ
sss_vivod = ("background-color: #456173; color: #f2f2f0; font: 14pt 'Courier New'")
# ГРАФИКА
class LineEditRazd(QtGui.QLineEdit):
    def init(self, *args, **kwargs):
        super().__init__()
    def razd(self, *args):
        x = self.text().replace(' ','')        
        if x.find('.') == -1:
            x1 = x
            x2 = ''
        else:
            x1 = x[:x.find('.')]
            x2 = x[x.find('.'):len(x)]
        x1 = '{0:,}'.format(int(x1)).replace(',', ' ')
        x = ''.join(x1+x2)
        self.setText(x)
        
class Window(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.resize(200, 100) # шир / выс окна
        # БЛОК РАЗМЕТКИ
        self.vbox = QtGui.QVBoxLayout()
        # ---
        self.pole = LineEditRazd('')
        self.pole.setStyleSheet(sss_vivod)
        self.pole.textEdited.connect(self.pole.razd)
        self.vbox.addWidget(self.pole)
        # ---
        self.setLayout(self.vbox)
# КОНЕЦ
if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    window = Window() # создаёт экземпляр окна из класса
    window.show() # запускает окно
    sys.exit(app.exec_())

Офлайн

#7 Сен. 7, 2017 10:54:48

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

QLineEdit - ввод с разделителями тысяч

Ну скажем так, это решение в лоб самое простое но не самое лучшее. Если вы захотите получить значения из поля(не важно как скопировав содержимое в буфер обмена из GUI или вызвав метод text() из скрипта ), вы и получите “12 345 678” с пробелами.. Что чревато дополнительными движениями, както убирание “лишних” пробелов при получении значения поля. Но в принципе если вас такое поведение программы устраивает то все ОК.
Переопределение paintEvent лишено этих недостатков, вы изменяете только отображаемый в GUI текст, оставляя значение хранимое в виджете неизменным. НО повторюсь, это требует достаточно глубокого знания Qt.Или в вашем случа нужно чтото делать с методом text() и что там отвечает за копирование в буфер… чтобы каждый раз после выхова метода не танцевать с бубном..

PS Если введете букву в поле то получите исклчение…



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Сен. 7, 2017 12:04:01)

Офлайн

  • Начало
  • » GUI
  • » QLineEdit - ввод с разделителями тысяч[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version