2016-06-17 16 views
0

Mein Ziel ist, wenn ich eine Zeichenfolge QLineEdit.setText(string), möchte ich sehen, dass die Buchstaben der Zeichenfolge Buchstabe für Buchstabe erscheinen, wie dort ist ein Intervall zwischen jedem Buchstaben.Qt-PyQt5 ist es möglich, ein Intervall zwischen jedem Buchstaben zu setzen, wenn ein Text gesetzt QLineEdit.setText()

Ich habe versucht, pyautogui.typewrite(string,interval = 0.25) zu verwenden, aber es hat nicht funktioniert. Ich habe auch eine for-Schleife an der Saite ausprobiert;

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

Aber es schrieb nur das letzte Zeichen, das t ist. Ich frage mich, ob es möglich ist, dies in PyQt5 zu machen?

Edit: Ist es mindestens in Qt möglich? vielleicht kann ich es in PyQt umwandeln?

+0

Dies sollte mit einem Timer relativ einfach sein. Zwischenspeichern Sie die letzte Textzeichenfolge und eine ganze Zahl, die die Position in der Zeichenfolge darstellt. Jedes Mal, wenn der Timer ausgelöst wird, fügen Sie ein weiteres Zeichen hinzu. –

+0

@JonHarper könnten Sie bitte ein funktionierendes Beispiel zeigen? – GLHF

Antwort

-2

Versuchen:

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

Änderung 2 jedoch viele Sekunden die Verzögerung möchten.

bearbeitet * Lösung mit ekhumoro der Bearbeitung aktualisiert

+0

Sie können nicht 'time.sleep()' in PyQt verwenden, es hat seine eigene Schleife, so dass Programm einfriert. Ich habe es vorher getestet. Wenn "time.sleep" verwendet wird, funktioniert der Haupt-Loop von Windows nicht, also friert das Programm ein. – GLHF

+1

@GLHF. Eigentlich wird das funktionieren. Sie müssen nur 'QApplication.processEvents()' vor 'time.sleep' setzen. (Und natürlich sollte es 'self.line_edit.setText (text)') sein. – ekhumoro

+0

@Echhumoro gut Einstellung eines Timers ist sehr elegant. – GLHF

0

In C++ Pseudo-Code und Kommentaren (mein Python ist zu rostig, nützlich zu sein):

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 
} 

Es ist ziemlich einfach. Wenn setTextDelayed() aufgerufen wird, rufen Sie setText() mit dem ersten Zeichen in der Zeichenfolge und starten Sie einen Timer. Verwenden Sie die Positionsvariable, um die Anzahl der angehängten Zeichen zu verfolgen. Legen Sie sie also auf 1 fest. Wenn der Timer ausgelöst wird, wird updateText() aufgerufen. Inkrement currentTextPos und setText() mit dem neuen Teilstring finalText aufrufen. Wenn Sie das Ende der Zeichenfolge erreicht haben, stoppen Sie den Timer.

0

Ich löste dieses Problem mit einem Timer, überprüfen Sie es. Kümmern Sie sich nicht um die Module, die ich importierte, zu faul, um nutzlose zu löschen.

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_())