2016-06-17 1 views
0

Моя цель, когда я устанавливаю строку QLineEdit.setText(string), я хочу видеть, что буквы этой строки появляются буквами, как там является интервалом между каждой буквой.Qt-PyQt5 можно установить интервал между каждой буквой при установке текста в QLineEdit.setText()

Я попытался использовать pyautogui.typewrite(string,interval = 0.25), но это не сработало. Также я попробовал цикл for в строке, например;

tt = "Test" 
for x in tt: 
    QLineEdit.setText(x) 

Но он написал только последний символ, который является t. Мне интересно, возможно ли это сделать в PyQt5?

Редактировать: Возможно ли, по крайней мере, в Qt? возможно, я могу преобразовать его в PyQt?

+0

Это должно быть относительно легко с помощью таймера. Кэш конечной текстовой строки и целое число, представляющее позицию в строке. Каждый раз, когда срабатывает таймер, добавьте еще один символ. –

+0

@JonHarper Вы могли бы показать рабочий пример, пожалуйста? – GLHF

ответ

-2

Try:

import time 
tt = "Test" 
for idx in range(len(tt)+1): 
    text = tt[:idx] 
    self.line_edit.setText(text) 
    QApplication.processEvents() 
    time.sleep(2) 

изменение 2 к однако количество секунд вы хотите задержку.

Edit * Решение обновляется редактировать ekhumoro в

+0

Вы не можете использовать 'time.sleep()' в PyQt, у него есть собственный цикл, поэтому программа замерзнет. Я тестировал его раньше. Если вы используете 'time.sleep', mainloop окон не работает, поэтому программа замораживает. – GLHF

+1

@ GLHF. Собственно, это сработает. Вам просто нужно поставить 'QApplication.processEvents()' перед 'time.sleep'. (И, очевидно, это должно быть 'self.line_edit.setText (text)'). – ekhumoro

+0

@ekhumoro колодец настройка таймер очень элегантный. – GLHF

0

В C++ псевдокоде и комментарии (мой Python слишком ржавый, чтобы быть полезным):

class DelayedLineEdit : public QLineEdit 
{ 
    ... 
public Q_SLOTS: 
    void setTextDelayed(const QString &txt); 
protected Q_SLOTS: 
    void updateText(); 
private: 
    QTimer textTimer; 
    QString finalText; 
    int currentTextPos; 
} 

void DelayedLineEdit::setTextDelayed(const QString &txt) 
{ 
    finalText = txt; 
    currentTextPos = 1; 
    setText(finalText.left(currentTextPos); 
    //connect the timer to updateText() 
    //start your timer 
} 

void DelayedLineEdit::updateText() 
{ 
    //increment currentTextPos and check if it's equal to the length of finalText 
    //call setText with finalText.left(currentTextPos) 
    //stop the timer if needed 
} 

Это довольно просто. Когда вызывается setTextDelayed(), вы вызываете setText() с первым символом в строке и запускаете таймер. Используйте переменную положения, чтобы отслеживать количество добавленных вами символов, поэтому установите ее на 1.

Когда срабатывает таймер, вызывается updateText(). Приращение currentTextPos и вызовите setText() с новой подстрокой finalText. Когда вы дойдете до конца строки, остановите таймер.

0

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

from PyQt5.QtWidgets import (QMessageBox,QApplication, QWidget, QToolTip, QPushButton, 
          QDesktopWidget, QMainWindow, QAction, qApp, QToolBar, QVBoxLayout, 
          QComboBox,QLabel,QLineEdit,QGridLayout,QMenuBar,QMenu,QStatusBar, 
          QTextEdit,QDialog,QFrame,QProgressBar,QHBoxLayout,QGraphicsDropShadowEffect, 
          QCheckBox 
          ) 
from PyQt5 import QtCore, QtWidgets, QtGui 
from PyQt5.QtGui import QIcon,QFont,QPixmap,QPalette,QWindow 
from PyQt5.QtCore import QCoreApplication, Qt,QBasicTimer, QTimer,QPoint,QSize 

import PyQt5.QtWidgets,PyQt5.QtCore 


class Settings(QMainWindow): 
    def __init__(self): 
     super().__init__() 

     self.set_widget = QMainWindow(self) 
     self.setWindowFlags(QtCore.Qt.FramelessWindowHint) 

     #size 
     self.setFixedSize(900,423) 

     #line 
     self.line_edit = QLineEdit(self) 
     self.line_edit.setGeometry(100,100,400,35) 
     self.line_edit.setStyleSheet("color: white;" 
            "background-color: rgb(0,0,0);" 
            "border: 1px solid white;" 
            "border-radius: 10px;" 
            "font: bold 15pt 'Comic Sans MS'") 

     self.timer26 = QTimer(self) 
     self.timer26.timeout.connect(self.timergo) 
     self.timer26.start(90) 
     self.cnt = 0 
     self.lst = "" 

    def timergo(self): 
     text = "I'm a text has interval between the letters" 
     try: 
      self.lst += text[self.cnt] 
      self.line_edit.setText("".join(str(self.lst[::]))) 
      self.cnt+=1 
     except: 
      print ("index error") 
      #or just pass 

     self.show() 



app1 = QApplication(sys.argv) 
app1.setStyleSheet("QMainWindow{background-color: rgb(0,0,0);border: 2px solid rgb(20,20,20)}") 

ex1 = Settings() 

sys.exit(app1.exec_())