PyQt5 in Kombination mit pyautioGui

Gute Links und Tutorials könnt ihr hier posten.
Antworten
SirTykel
User
Beiträge: 2
Registriert: Montag 3. Januar 2022, 20:32

hey alle zusammen. ich wollte mal fragen, da ich etwas neu bin, ob jemand gute Tipps und Hilfestellungen zum einsetzten eines kleinen Pyautogui skrpits in ein pyQt5 interface hat.

Im Detail:
ich habe über Pycharm ein kleines einfaches interface gebaut was Funtionen aus einem Pyautogui code ausführen soll. Mein Problem ist, dass ist noch Schwierigkeiten habe das eine in das andere zu implimentieren.

Code, interface:
(PyQt5)
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabel


class CustomWidget(QWidget):
def __init__(self):
super().__init__()

self.init_ui()

def init_ui(self):
self.setGeometry(100, 100, 300, 300)
self.setWindowTitle('Buttons and Events')

self.Label = QLabel(self)
self.Label.setText("hello")
self.Label.move(10, 10)

self.btn = QPushButton(self)
self.btn.setText('push Here')
self.btn.move(10, 50)
self.btn.clicked.connect(self.btn_clicked)

self.show()


Code "Skript":
PyautoGui
import pyautogui as pg
import pyperclip as pc
import time


def text (msg):
pc.copy(msg)
pg.hotkey("ctrl","v")
pg.hotkey("enter")


time.sleep(5)

with open("zeile.txt") as f:
zeilen = f.readlines(time.sleep(0.5))

for zeile in zeilen:
text(zeile)


def btn_clicked(self):
self.Label.setText('Thanks for pressing the button')
self.Label.adjustSize()

def run():
app = QApplication([])

cw = CustomWidget()

app.exec_()

if __name__ == '__main__':
run()


freue mich über jede Art der Unterstützung, Diskusionen und tolle Tipps
SirTykel
User
Beiträge: 2
Registriert: Montag 3. Januar 2022, 20:32

Sry ich arbeite auf windows 10 wenns interessiert :D
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@SirTykel: Was heisst das denn genau, das „Schwierigkeiten haben“? Wenn man nur das ”Skript” ausführt bekommt man verständlicherweise eine Ausnahme das `QApplication` undefiniert ist. Woher sollte das auch kommen?

Wenn man den GUI-Code vor das ”Skript” kopiert, dann bekommt man auch eine Ausnahme, die auch nicht weiter überraschend ist.

Importe gehören alle an den Anfang, und ja es gibt welche die werden traditionell mit zwei Buchstaben abgekürzt, das sollte man aber nicht generell mit allem versuchen. Insbesondere wenn man dann `pc` und `pg` als Namen haben, die sich so ähnlich sind.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Also `sleep()` Lesen von Dateien und Einfügen in eine GUI gehört dort nicht hin.

Die readlines()-Methode hat zwar ein Argument, aber `time.sleep()` hat keinen expliziten Rückgabewert, da wird also implizit ein `None` übergeben, was vom Typ nicht zum Defaultwert -1 passt. Dass das läuft ist also eher Glück. Oder ist das die Stelle wo es Probleme gibt?

Die `readlines()`-Methode ist auch in der Regel überflüssig, weil man direkt über das Dateiobjekt iterieren kann.

Funktionen und Methoden werden üblicherweise nach der Tätigkeit benannt die sie durchführen. Damit man sich leicht(er) von eher passiven Werten unterscheiden kann. `text` ist keine Tätigkeit. `insert_line()` wäre eine.

Man sollte neben Modulnamen auch keine anderen Namen kryptisch abkürzen. Also nicht `msg` schreiben wenn `message` gemeint ist, oder `cw` wenn `custom_widget` gemeint ist. Oder `btn` wenn man `button` meint.

Es macht keinen Sinn eine im Grunde leere `__init__()` zu haben um daraus dann eine andere Methode aufzurufen wo die Initialisierung drin steht.

Die Grössen und Positionen von Fenstern und Widgets gibt man nicht in absoluten Pixelzahlen vor. Das funktioniert nicht wirklich bei der Vielfalt von Displaygrössen, -auflösungen, und -einstellungen. Die Grösse ergibt sich automatisch aus dem Fensterinhalt, und die Positionen legt man mittels Layouts fest.

Man kann Widgets Werte für (Qt-)Properties und Signale schon beim erstellen mitgeben. Das muss man nicht alles hinterher mit einzelnen Methodenaufrufen machen.

Der `show()`-Aufruf gehört nicht zur Initialisierung eines Widgets. Das macht keines der Widgets aus der Qt-Bibliothek.

Den `_` bei `exec()` kann und sollte man weg lassen. Der ist in Python 3 nicht mehr nötig und wird in folgenden PyQt-Versionen deshalb auch weg fallen.

Zwischenstand:

Code: Alles auswählen

#!/usr/bin/env python3
import sys
import time

import pyautogui
import pyperclip
from PyQt5.QtWidgets import (
    QApplication,
    QLabel,
    QPushButton,
    QVBoxLayout,
    QWidget,
)


class CustomWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Buttons and Events")

        layout = QVBoxLayout()

        self.label = QLabel("hello", self)
        layout.addWidget(self.label)

        self.button = QPushButton(
            "push Here", self, clicked=self.on_button_clicked
        )
        layout.addWidget(self.button)

        self.setLayout(layout)

    def on_button_clicked(self):
        self.label.setText("Thanks for pressing the button")


def insert_line(message):
    pyperclip.copy(message)
    pyautogui.hotkey("ctrl", "v")
    pyautogui.hotkey("enter")


def main():
    time.sleep(5.5)

    with open("zeile.txt") as zeilen:
        for zeile in zeilen:
            insert_line(zeile)

    app = QApplication(sys.argv)
    window = CustomWidget()
    window.show()
    sys.exit(app.exec())


if __name__ == "__main__":
    main()
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten