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 ↓ >
・ 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))
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 oderparent Eigenes 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.
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.
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)
.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.Verwenden Sie ** py2exe **, das eine kurze Startzeit hat.
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'
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'
)
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!
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
Recommended Posts