Gemeinsamer Bildschirm mit Python Exe App

Einführung

In letzter Zeit wurden zunehmend Lektionen und Konferenzen mit Webkonferenzsystemen wie Zoom abgehalten. Der Hauptnachteil des Online-Unterrichts besteht jedoch darin, dass die auf dem Bildschirm freigegebene Tafelschrift kurz nach dem Notieren abläuft. Um ein solches Problem zu lösen, habe ich versucht, eine exe-Anwendung ** zu erstellen, die als PDF gespeichert werden kann, indem der registrierte Bereich (gemeinsamer Bildschirmteil usw.) mit einem Klick gedrückt wird. (* Nur diejenigen drücken, die die Erlaubnis zum Drücken haben)

Die App und ihre Details finden Sie auf GitHub. Verwenden Sie sie daher und geben Sie uns Ihre Kommentare (Ratschläge usw.). \ <GitHub-Version ↓ >

Dieses Mal werde ich als Memo des Erstellungsvorgangs eine vereinfachte vollständige Screenshot-Anwendung verwenden ** 1. [Grafikdesign (Erscheinungsbild)](# 1-Grafikdesign) 2. [Ereignis- (Aktions-) Einstellungen](# 2-Ereigniseinstellungen) 3. [Symbol erstellen](# 3 - Symbol im Selbststil erstellen) 4. [Ausführung](# 4-exe-Konvertierung) ** Ich werde in der Reihenfolge schreiben. \ <Vereinfachte Version ↓ >

Was du vorbereitet hast

・ Windows10 ・ Python 3.7.9 (bis zu 3.7.X, wenn exe mit py2exe konvertiert wird) ・ WxPython (Phönix) · Power Point ・ Py2exe (Details zur Installation werden später beschrieben) (#Installation))

1. Grafikdesign

Lass deine App mit ** wxpython ** aussehen. Die Standardbibliothek verfügt über tkinter, das einfach zu handhaben ist, aber wxpython verfügt über eine Menge Ereignisverarbeitung und Sie können aufwändige Apps erstellen. Grundsätzlich ist "wx.Panel" (Bedienfeld) in "wx.Frame" (Rahmen, Skelett) verteilt, und Widgets wie "wx.Button" (Schaltfläche) werden darauf platziert. Frames, Panels und Widgets verwenden fast dieselben Argumente, aber wir konzentrieren uns auf diejenigen, die wir dieses Mal verwenden.

Streit Erläuterung
parent Elternteil. Stellen Sie sich auf den Rahmen oder die Platte, die Sie hier einsetzen. Wenn der Elternteil verschwindet, verschwindet auch das Kind selbst.
label / value Stellen Sie die Zeichen ein, die auf sich selbst angezeigt werden sollen, und die Werte, die Sie halten. Welches verwendet werden kann oder nicht, kann für jedes Widget verwendet werden. Wert ist[Widget].GetLabel()/[Widget].GetValue()Reinkommen,[Widget].SetLabel([Wert])/[Widget].SetValue([Wert])Kann mit geändert werden.
pos (x, y)In Form eines Bildschirms oderparentEigenes x gegen-Stellen Sie die y-Koordinate ein. Obere linke Ecke
size (w, h)Stellen Sie Ihre eigene Breite und Höhe in Form von ein.

Es gibt auch eine Möglichkeit, die Widgets mit einem "Sizer" wie "wx.BoxSizer" anzuordnen, ohne "pos" zu verwenden. Wenn der Benutzer dann die Fenstergröße ändert, kann jedes Teil entsprechend der Größe verschoben oder skaliert werden. (Dieses Mal werde ich es nicht verwenden, da die Fenstergröße fest ist.)

Sehen wir uns die spezifische Verwendung unten an.

sample_1.py


# coding: utf-8
import wx                                       #Importieren Sie wxpython
try:                                            # ⏋
    from ctypes import windll                   #| App-Auflösungseinstellung
    windll.shcore.SetProcessDpiAwareness(True)  #| (Verhindert Unschärfe)
except:                                         # |
    pass                                        # ⏌

app = wx.App()  #Schreiben Sie dies am Anfang und starten Sie wx

#GUI-Einstellungen ────────────────────────────────────────────────── ──────────────────────────────────────────────────
frame = wx.Frame(parent=None,            #Erstellen Sie einen Rahmen (äußerer Rahmen)
                 title='Sukusho App',
                 pos=(0, 0),             # pos=(x, y)Ist das x der Rahmenposition mit dem oberen linken Bildschirmrand als Ursprung-y-Koordinate
                 size=(400, 230),        # size=(w, h)Ist die Breite des Rahmens(w)Und Höhe(h)
                 style=wx.DEFAULT_FRAME_STYLE & ~(wx.RESIZE_BORDER | wx.MAXIMIZE_BOX))
                                         #Stil ist jede zusätzliche Einstellung.Deaktivieren Sie diesmal die Fenstergröße

panel = wx.Panel(parent=frame)  #Erstellen Sie ein Panel auf dem Rahmen

wx.StaticText(parent=panel, label='Ziel:',  #Erstellen Sie eine Zeichenfolge im Bedienfeld.pos ist Eltern(panel)Relative Koordinaten auf
              pos=(20, 20))
wx.TextCtrl(parent=panel, value='Nicht ausgewählt',     #Erstellen Sie ein Ordnereingabefeld im Bedienfeld
            pos=(150, 17), size=(160, -1),   #messen"-1"Treten Sie ein und überlassen Sie es wx
            style=wx.TE_READONLY)            # TE_Die Eingabe kann mit READONLY deaktiviert werden
wx.Button(parent=panel, label='...',
          pos=(320, 16), size=(40, 35))

wx.StaticText(parent=panel, label='Letztes Mal:', pos=(20, 70))
wx.StaticText(parent=panel, label='―', pos=(150, 70), size=(210, -1),
              style=wx.TE_CENTER)  # TE_Im Zentrum,Zeichen können innerhalb der durch die Größe angegebenen Breite zentriert werden

wx.Button(parent=panel, label='Sukusho',
          pos=(20, 120), size=(340, 40))
# ───────────────────────────────────────────────────────────────────────────────────────────────────────

frame.Show()    #Zeigen Sie den Rahmen, wenn er aussieht
app.MainLoop()  #Wird durch Akzeptieren von Ereigniseingaben abgeschlossen

Wenn Sie es ausführen, wird es gut aussehen. Da ich kein Ereignis festgelegt habe, erfolgt keine Antwort, selbst wenn ich die Taste drücke.

2. Ereigniseinstellungen

Legen Sie ein Ereignis in der Schaltfläche oder im Eingabefeld fest. Grundsätzlich werden die für jede Operation zu verarbeitenden Inhalte in der Funktion "func_1 (Ereignis, [zweites Argument], ...)" zusammengefasst und mit "[Widget] .Bind ([Ereignistyp], func_1)" verknüpft. Ich werde. Die Ereignistypen reichen von den für jedes Widget spezifischen, z. B. "wx.EVT_BUTTON" (wenn die Schaltfläche gedrückt wird) und "wx.EVT_SLIDER" (wenn sich der Schiebereglerwert ändert) bis "wx.EVT_CLOSE" (Fenster wird geschlossen). Wann) und so weiter.

sample_2.py


# coding: utf-8
import os
import re
from glob import glob
from datetime import date
from PIL import ImageGrab
import wx
try:
    from ctypes import windll
    windll.shcore.SetProcessDpiAwareness(True)
except:
    pass

TODAY = format(date.today())  #Heutiges Datum
last_pic_num = 0              #Fotonummer

#Definition der Ereignisfunktion ───────────────────────────────────────────────── ───────────────────────────────────────────
def open_folder_dialog(event):  #Das erste Argument der im Ereignis verwendeten Funktion"event"Schreiben
    """
Ordner Der Pfad des im Dialogfeld ausgewählten Ordners_Wird in txctrl angezeigt,
Holen Sie sich die letzte Fotonummer in den Ordner, picture_Funktion zum Aktualisieren von Informationsinformationen
    """
    global last_pic_num
    dlg = wx.DirDialog(parent=None, message='Wählen Sie Speicherziel')  #Dialogeinstellungen
    if dlg.ShowModal() == wx.ID_OK:                       # ShowModal()Beginnen mit,Gehen Sie nach der Auswahl wie folgt vor: ↓
        dirpath = dlg.GetPath()                           #Holen Sie sich den Pfad zum ausgewählten Ordner,
        folder_txctrl.SetValue(dirpath)                   #Eingabefeld aktualisieren,
        os.chdir(dirpath)                                 #In diesen Ordner verschieben,
        all_pictures = [p for p in glob(os.path.join(dirpath, '*.png'))  #Erstellen Sie eine Fotoliste mit dem heutigen Datum
                        if re.search('{}_\\d'.format(TODAY), p)]
        if all_pictures:                                                             #Wenn Sie ein Foto haben,
            last_pic_num = max(list(map(lambda x: int(re.findall('_(\\d+)', x)[0]),  #Holen Sie sich die letzte Nummer,
                                        all_pictures)))
            picture_info.SetLabel(str(last_pic_num))                                 #Aktualisieren Sie die Fotoinformationen
        else:
            last_pic_num = 0
            picture_info.SetLabel('─')
        scshot_button.Enable()  #Aktivieren Sie die Squeeze-Taste

def screen_shot(event):
    """
Drücken Sie den Bildschirm,Speichern Sie mit der erweiterten Fotonummer, picture_Funktion zum Aktualisieren von Informationsinformationen
    """
    global last_pic_num
    last_pic_num += 1                                   #Verschieben Sie die Zahl um eins nach oben,
    picture_info.SetLabel(str(last_pic_num))            #Aktualisieren Sie die Fotoinformationen
    screen_picture = ImageGrab.grab()                   #Drücken,
    save_name = TODAY + '_{}.png'.format(last_pic_num)  # "2020-01-23_(Nummer)"Im Format von,
    screen_picture.save(save_name)                      #sparen
# ───────────────────────────────────────────────────────────────────────────────────────────────────────

app = wx.App()

#GUI-Einstellungen ────────────────────────────────────────────────── ──────────────────────────────────────────────────
frame = wx.Frame(parent=None, title='Sukusho App', pos=(0, 0), size=(400, 230),
                 style=wx.DEFAULT_FRAME_STYLE & ~(wx.RESIZE_BORDER | wx.MAXIMIZE_BOX))
panel = wx.Panel(parent=frame)

wx.StaticText(parent=panel, label='Ziel:', pos=(20, 20))
folder_txctrl = wx.TextCtrl(parent=panel, value='Nicht ausgewählt', pos=(100, 17), size=(210, -1),  #Ruf später an
                            style=wx.TE_READONLY)
folder_button = wx.Button(parent=panel, label='...', pos=(320, 16), size=(40, 35))        #Ruf später an
wx.StaticText(parent=panel, label='Die heutige letzte Squash-Nummer:', pos=(20, 70))
picture_info = wx.StaticText(parent=panel, label='―', pos=(200, 70), size=(160, -1),      #Ruf später an
                             style=wx.TE_CENTER)
scshot_button = wx.Button(parent=panel, label='Sukusho', pos=(20, 120), size=(340, 40))  #Ruf später an
# ───────────────────────────────────────────────────────────────────────────────────────────────────────

scshot_button.Disable()  #Deaktivieren Sie die Squeeze-Taste, bis das Speicherziel ausgewählt ist

#Ereigniseinstellung ────────────────────────────────────────────────── ───────────────────────────────────────────────
folder_button.Bind(wx.EVT_BUTTON, open_folder_dialog)  #Wenn Sie die Taste drücken,Führen Sie die Funktion des zweiten Arguments aus
scshot_button.Bind(wx.EVT_BUTTON, screen_shot)         #Hinweis)Am Ende der Funktion"()"Nicht anziehen.
# ───────────────────────────────────────────────────────────────────────────────────────────────────────

frame.SetIcon(wx.Icon('sample_icon.ico'))  #Symboleinstellung (Fehler, wenn der angegebene Pfad nicht vorhanden ist)
frame.Show()
app.MainLoop()

Ich habe kein Symbol erstellt, daher wird beim Ausführen eine Fehlermeldung angezeigt. Wenn ich jedoch die Drucktaste drücke, werden die Fotos im ausgewählten Ordner gespeichert.

3. Symbolerstellung (Selbststil)

Sie benötigen eine Datei mit der Erweiterung ".ico", aber zum Glück gibt es im Internet eine Site, die ".png " → ".ico" konvertieren kann. Erstellen Sie also ein PNG mit Powerpo und konvertieren Sie es. (Es muss nicht Powerpo sein)

  1. Zeichnen Sie zuerst eine große Figur und gruppieren Sie sie
  2. Kopieren Sie die Abbildung → "Einfügeoptionen" → "Abbildung"
  3. Schrumpfen und schneiden Sie es so, dass es in ein Quadrat mit einer Seite von 3,91 cm passt
  4. "Speichern Sie es als Diagramm" Sie können .png mit erstellen. Sie können es mithilfe dieser Konvertierungssite in ".ico" konvertieren. [Https://ao-system.net/alphaicon/) .. Speichern Sie es diesmal als "sample_icon.ico" im selben Verzeichnis ** wie sample_2.py **. (Wenn Sie den entsprechenden Pfad in "wx.Icon ([PATH])" eingeben, ist dies überall in Ordnung.) Wenn Sie "sample_2.py" ausführen, sehen Sie, dass das Symbol oben links im Fenster gesetzt ist.

4. exe Konvertierung

Verwenden Sie ** py2exe **, das eine kurze Startzeit hat.

Installation

Wenn Sie Versionen bis Python 3.4 verwenden

pip install py2exe

Wenn Sie Python 3.5-3.7 (im Folgenden als 3.X bezeichnet) verwenden, gehen Sie zu py2exe release site und py2exe-0.9.3.2-cp3X-none- Laden Sie win_amd64.whl (64-Bit) oder py2exe-0.9.3.2-cp3X-none-win32.whl (32-Bit) und herunter

py -3.X -m pip install 'Pfad der heruntergeladenen Datei'

Vorbereitung

Sie müssen eine Setup-Datei mit dem Namen "setup.py" erstellen. (Kurz gesagt) Legen Sie es erneut in dasselbe Verzeichnis ** wie sample_2.py **.

setup.py


from distutils.core import setup
import py2exe

option = {'compressed': 1, 'optimize': 2 , 'bundle_files': 3, 'excludes': ['email', 'numpy', 'test', 'tkinter']}

setup(
    options={'py2exe': option},
    windows=[{'script': 'sample_2.py', 'icon_resources': [(1, 'sample_icon.ico')]}],
    zipfile='lib\\libs.zip'
)

Ausführung von exe

Starten Sie eine Eingabeaufforderung in dem Verzeichnis, das sample_2.py und setup.py enthält.

py -3.X -m setup py2exe

Dann denke ich, dass ein "dist" -Ordner in dem Ordner erstellt wird, also legen Sie die ".ico" -Datei darin ab (oder legen Sie sie an der Stelle des Beschreibungspfads ab) und fertig! Erstellen Sie auch eine Verknüpfung für ".exe" und legen Sie sie auf Ihrem Desktop ab!

abschließend

Darüber hinaus habe ich gelernt, Threading zu verwenden, um die zeitaufwändige Ereignisverarbeitung in einem separaten Thread zu handhaben. Es werden keine Eingaben akzeptiert, bis die Verarbeitung abgeschlossen ist, und die Anwendung wird eingefroren lol

Referenz

Recommended Posts

Gemeinsamer Bildschirm mit Python Exe App
Screenshot mit Selen (Python Edition)
Holen Sie sich Web-Screen-Capture mit Python
[Entwicklungsumgebung] Python mit Xcode [Mit Bildschirmübergang]
Automatische Update-Methode von Python Pyinstaller exe
Onkel SES modernisiert die VBA-App mit Python
Dämonisieren Sie eine Python-Webanwendung mit Supervisor
Einfache Web-App mit Python + Flask + Heroku
Erstellen Sie eine englische Wort-App mit Python
Erstellen Sie eine Desktop-App mit Python mit Electron
Othello App (iOS App) erstellt mit Python (Kivy)
FizzBuzz in Python3
Scraping mit Python
Erstellen Sie eine App, die Schüler mit Python errät
Scraping mit Python
Python mit Go
Gewinnen Sie die Python + Flask-Web-App mit Jenkins
Twilio mit Python
GUI-Automatisierung mit Python x Windows App Driver
In Python integrieren
Spielen Sie mit 2016-Python
AES256 mit Python
Getestet mit Python
Entwickeln Sie Windows-Apps mit Python 3 + Tkinter (exe-Datei)
Python beginnt mit ()
mit Syntax (Python)
Bingo mit Python
Zundokokiyoshi mit Python
Excel mit Python
Mikrocomputer mit Python
Mit Python besetzen
[Übung] Erstellen Sie eine Watson-App mit Python! # 2 [Übersetzungsfunktion]
Ich habe mit Python eine App für die Benachrichtigung über Netznachrichten erstellt
PIL in Python unter Windows8 (für Google App Engine)
Erste Schritte mit Google App Engine für Python und PHP
PyInstaller-Memorandum Konvertieren Sie Python [.py] in [.exe] mit 2 Zeilen
[Python] [Windows] Speichern Sie einen Screenshot als Bild
Serielle Kommunikation mit Python
Zip, entpacken mit Python
Django 1.11 wurde mit Python3.6 gestartet
Python mit Eclipse + PyDev.
Socket-Kommunikation mit Python
Datenanalyse mit Python 2
Scraping in Python (Vorbereitung)
Versuchen Sie es mit Python.
Python lernen mit ChemTHEATER 03
Sequentielle Suche mit Python
"Objektorientiert" mit Python gelernt
[Python] Machen Sie einen Screenshot
Umgang mit Yaml mit Python
Löse AtCoder 167 mit Python
Serielle Kommunikation mit Python
[Python] Verwenden Sie JSON mit Python
Python lernen mit ChemTHEATER 05-1
Lerne Python mit ChemTHEATER
Führen Sie prepDE.py mit python3 aus
1.1 Erste Schritte mit Python
Tweets mit Python sammeln
Binarisierung mit OpenCV / Python
3. 3. KI-Programmierung mit Python
Kernel-Methode mit Python