Найти - Пользователи
Полная версия: QLineEdit - ввод с разделителями тысяч
Начало » GUI » QLineEdit - ввод с разделителями тысяч
1 2
Kyrym
Во-первых, нет никакой истерики.
Во-вторых, разделить тысяч мог бы быть как PyQt, так и в самом питоне или модуле для него. Есть же в PyQt маски…
FishHook
Kyrym
Во-вторых, разделить тысяч мог бы быть как PyQt, так и в самом питоне или модуле для него. Есть же в PyQt маски…
Поясните свою мысль. Питон - язык программирования, зачем в нем какие-то бухгалтерские примочки? Каким образом в “модуле для него” возможно реализовать изменение синтаксических правил языка? Еще раз: как по-вашему связаны Qt и питон?
Kyrym
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_())

________
Добавлено позже.
М-да, вырубил принт, и заработало как надо.
PEHDOM
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_())
Kyrym
Нашёл вот такой код:
 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_())
Kyrym
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_())
PEHDOM
Ну скажем так, это решение в лоб самое простое но не самое лучшее. Если вы захотите получить значения из поля(не важно как скопировав содержимое в буфер обмена из GUI или вызвав метод text() из скрипта ), вы и получите “12 345 678” с пробелами.. Что чревато дополнительными движениями, както убирание “лишних” пробелов при получении значения поля. Но в принципе если вас такое поведение программы устраивает то все ОК.
Переопределение paintEvent лишено этих недостатков, вы изменяете только отображаемый в GUI текст, оставляя значение хранимое в виджете неизменным. НО повторюсь, это требует достаточно глубокого знания Qt.Или в вашем случа нужно чтото делать с методом text() и что там отвечает за копирование в буфер… чтобы каждый раз после выхова метода не танцевать с бубном..

PS Если введете букву в поле то получите исклчение…
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB