Während ich mich auf verschiedene Informationen im Internet bezog, studierte ich auch GUI und arbeitete an einem GUI-Programm, das Eingabe / Ausgabe + Verarbeitung + Grafik anzeigen kann.
Windows10 Python 3.7.7 Kivy 1.11.1 GUI scheint in den letzten Jahren sehr beliebt zu sein, deshalb habe ich Kivy herausgefordert.
Die obere Zeile ist eine Schaltfläche für die Eingabe / Ausgabe und Verarbeitung von Dateien. Unterhalb der Schaltfläche befindet sich der Grafikanzeigebereich. Das Diagramm wird im Pulldown-Menü links ausgewählt und angezeigt.
Unten finden Sie die Codedetails. Der Code auf der Kivy-Seite beschreibt den Inhalt der GUI (Layout, Dateiauswahl, Funktion, die beim Drücken einer Taste aufgerufen werden soll usw.), und der Code auf der Python-Seite beschreibt die tatsächliche Verarbeitung. Erster Python
main.py
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import openpyxl
import os
from kivy.uix.boxlayout import BoxLayout
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.floatlayout import FloatLayout
from kivy.properties import ObjectProperty
from kivy.uix.popup import Popup
from kivy.garden.matplotlib.backend_kivyagg import FigureCanvasKivyAgg
class LoadDialog(FloatLayout):
load = ObjectProperty(None)
cancel = ObjectProperty(None)
Analysis = ObjectProperty(None)
current_dir = os.path.dirname(os.path.abspath(__file__))
class SaveDialog(FloatLayout):
save = ObjectProperty(None)
text_input = ObjectProperty(None)
cancel = ObjectProperty(None)
current_dir = os.path.dirname(os.path.abspath(__file__))
class MainBoard(BoxLayout):
file_name = ObjectProperty(None)
info = ObjectProperty(None)
bar_graph = ObjectProperty(None)
lbl4spinner = ObjectProperty([])
def __init__(self, **kwargs):
super(MainBoard, self).__init__(**kwargs)
self.master_flg = 0
self.lbl=[]
self.Data=[]
def dismiss_popup(self):
self._popup.dismiss()
def show_load(self):
content = LoadDialog(load=self.load, cancel=self.dismiss_popup, Analysis=self.Analysis)
self._popup = Popup(title="Load file", content=content,size_hint=(0.9, 0.9))
self._popup.open()
def show_save(self):
if self.master_flg==0:
self.info.text = 'Load masterfile first, please'
else:
content = SaveDialog(save=self.save, cancel=self.dismiss_popup)
self._popup = Popup(title="Save file", content=content, size_hint=(0.9, 0.9))
self._popup.open()
def load(self, path, filename, chkflg):
try:
if chkflg==1:
self.file_name.text=str(filename.pop(0))
else:
self.file_name.text=str(filename[0])
except Exception as e:
self.info.text=str(type(e))+' : '+str(e)
Matrix=pd.DataFrame([])
for i in range(len(filename)):
NewData = pd.read_excel(filename[i])
tmp_Data=NewData.iloc[0:,1:]
tmp_Data.index=NewData.iloc[:,0]
Matrix=pd.concat([Matrix,tmp_Data])
self.lbl=list(Matrix.index)
self.Data = Matrix
self.dismiss_popup()
def save(self, path, dirname):
with pd.ExcelWriter(os.path.join(path, dirname)) as writer:
self.Data.to_excel(writer)
self.dismiss_popup()
def Analysis(self):
try:
self.Data=self.Data*2
self.lbl4spinner=map(str,self.lbl)#Liste, die an den Spinner weitergegeben werden soll
self.master_flg=1
self.info.text = 'Analysis completed!'
except Exception as e:
self.info.text=str(type(e))+' : '+str(e)
def on_spinner_select(self,text):
row_no=self.lbl.index(text)
Forgraph=self.Data.iloc[row_no,:]
plt.clf()
bar_plt=plt.bar(Forgraph.index, Forgraph)
self.ids.bar_graph.clear_widgets()
self.ids.bar_graph.add_widget(FigureCanvasKivyAgg(plt.gcf()))
class MainApp(App):
title = 'Analyse'
def build(self):
return MainBoard()
if __name__ == '__main__':
MainApp().run()
Dann Kivy
main.kv
<MainBoard>:
info: info
file_name: file_name
bar_graph: bar_graph
BoxLayout:
orientation: 'vertical'
pos: root.pos
size: root.size
canvas.before:
Color:
rgba: 0.9, 0.9, 0.9, 1
Rectangle:
pos: self.pos
size: self.size
Label:
id : info
text: 'load file first, please'
size_hint_y: 0.1
canvas.before:
Color:
rgba: 0, 0, 0, 1
Rectangle:
pos: self.pos
size: self.size
BoxLayout:
orientation: 'horizontal'
size_hint_y: 0.1
TextInput:
id: file_name
font_size: 12
size_hint_x: 0.7
BoxLayout:
orientation: 'horizontal'
size_hint_y: 0.1
Button:
text: 'Load & Analysis'
size_hint_x: 0.2
on_press: root.show_load()
Button:
text: 'Save data'
size_hint_x: 0.2
on_press: root.show_save()
Button:
text: "Exit"
id: btnExit
size_hint_x: 0.2
on_press: app.root_window.close()
BoxLayout:
orientation: 'horizontal'
size_hint_y: 0.7
Spinner:
text: "No."
values: root.lbl4spinner
size_hint: 0.1, 0.1
pos_hint: {'center_x': .5, 'center_y': .5}
on_text: root.on_spinner_select(self.text)
BoxLayout:
id: bar_graph
<LoadDialog>:
BoxLayout:
size: root.size
pos: root.pos
orientation: "vertical"
FileChooser:
id: filechooser
path:root.current_dir
multiselect: True
filters: ['*.xlsx']
FileChooserIconLayout
BoxLayout:
size_hint_y: None
height: 30
Button:
text: "Load selected file(s)"
on_press: root.load(filechooser.path, filechooser.selection,0)
on_release: root.Analysis()
Button:
text: "Load all files"
on_press: root.load(filechooser.path,filechooser.files,1)
on_release: root.Analysis()
Button:
text: "Cancel"
on_release: root.cancel()
<SaveDialog>:
BoxLayout:
size: root.size
pos: root.pos
orientation: "vertical"
BoxLayout:
size_hint_y: 0.1
Button:
text: 'ListView'
on_release: filechooser.view_mode = 'list'
Button:
text: 'IconView'
on_release: filechooser.view_mode = 'icon'
FileChooser:
id: filechooser
path:root.current_dir
on_selection: dir_name.text = self.selection and self.selection[0] or ''
filters: ['*.xls','*.xlsx']
FileChooserListLayout
TextInput:
id: dir_name
size_hint_y: None
height: 30
multiline: False
BoxLayout:
size_hint_y: None
height: 30
Button:
text: "Save"
on_release: root.save(filechooser.path, dir_name.text)
Button:
text: "Cancel"
on_release: root.cancel()
Das Basisprogramm verwendet Kivys Filechooser. Filechooser selbst hat offizielle Dokumente und Erklärungen vieler Vorfahren, daher wird es weggelassen. Ich werde nur erklären, wo ich gestolpert bin.
Zur Vereinfachung des Ablaufs fließt das Programm nicht von oben, sondern wechselt zwischen dem Kivy-Code und dem Py-Code hin und her, sodass ich den Ablauf erläutern werde.
main.kv
Button:
text: 'Load & Analysis'
size_hint_x: 0.2
on_press: root.show_load()
main.py
def show_load(self):
content = LoadDialog(load=self.load, cancel=self.dismiss_popup, Analysis=self.Analysis)
self._popup = Popup(title="Load file", content=content,size_hint=(0.9, 0.9))
self._popup.open()
--Kivys LoadDialog-Code. Wählen Sie in FileChooser die Datei aus. Dieses Mal wird davon ausgegangen, dass die Originaldaten im xlsx-Format gespeichert sind. Es wird gefiltert, damit Dateien in unnötigen Formaten nicht angezeigt werden. Außerdem wird Multiselect als True angegeben, damit mehrere Dateien ausgewählt werden können. Die ID ist eine Variable namens filechooser, die die Adresse der ausgewählten Datei enthält.
main.kv
FileChooser:
id: filechooser
path:root.current_dir
multiselect: True
filters: ['*.xlsx']
FileChooserIconLayout
main.kv
BoxLayout:
size_hint_y: None
height: 30
Button:
text: "Load selected file(s)"
on_press: root.load(filechooser.path, filechooser.selection,0)
on_release: root.Analysis()
Button:
text: "Load all files"
on_press: root.load(filechooser.path,filechooser.files,1)
on_release: root.Analysis()
Button:
text: "Cancel"
on_release: root.cancel()
main.pv
def load(self, path, filename, chkflg):
try:
if chkflg==1:
self.file_name.text=str(filename.pop(0))
else:
self.file_name.text=str(filename[0])
except Exception as e:
self.info.text=str(type(e))+' : '+str(e)
--Lesen Sie als nächstes die Daten. In diesem xlsx wird der Parametername in Spalte A und die Datennummer in die erste Zeile eingegeben.
self.lbl``` und
`self.Data```.`LoadDialog``` mit`
entlassen_popup () `` `schließen, ist die Ladefunktion beendet.main.pv
Matrix=pd.DataFrame([])
for i in range(len(filename)):
NewData = pd.read_excel(filename[i])
tmp_Data=NewData.iloc[0:,1:]
tmp_Data.index=NewData.iloc[:,0]
Matrix=pd.concat([Matrix,tmp_Data])
self.lbl=list(Matrix.index)
self.Data = Matrix
self.dismiss_popup()
`on_release: root.Analysis ()`
nach der Load-Funktion aufgerufen.`self.lbl4spinner = map (str, self.lbl)`
ist die Liste, die an das Pulldown-Menü zur Grafikauswahl auf der GUI übergeben werden soll.
-- self.master_flg
ist ein Flag, das angibt, ob Daten gelesen wurden. Es wird verwendet, um zu beurteilen, ob gespeichert werden soll oder nicht.main.pv
def Analysis(self):
try:
self.Data=self.Data*2
self.lbl4spinner=map(str,self.lbl)#Liste, die an den Spinner weitergegeben werden soll
self.master_flg=1
self.info.text = 'Analysis completed!'
except Exception as e:
self.info.text=str(type(e))+' : '+str(e)
text: "No." `` `Gibt das Zeichen an, das vor dem Herunterziehen angezeigt werden soll. --`` `values: root.lbl4spinner
zeigt die Liste an, die beim Herunterziehen im Analysebereich erhalten wurde.
-- on_text: root.on_spinner_select (self.text) `` `, rufen Sie die Funktion on_spinner_select auf der Python-Seite mit dem aus dem Pulldown ausgewählten Element als Argument auf (` `` self.text
).main.kv
Spinner:
text: "No."
values: root.lbl4spinner
size_hint: 0.1, 0.1
pos_hint: {'center_x': .5, 'center_y': .5}
on_text: root.on_spinner_select(self.text)
BoxLayout:
id: bar_graph
self.lbl.index (text) `` `Gibt die Reihenfolge (Anzahl der Zeilen) zurück, die mit den im Pulldown-Menü ausgewählten Informationen übereinstimmt. --
Forgraph = self.Data.iloc [row_no ,:] Liest die Anzahl der durch `angegebenen Zeilen --Erstellen Sie ein Diagramm mit
bar_plt = plt.bar (Forgraph.index, Forgraph)
. Diesmal habe ich ein Balkendiagramm erstellt. --``` self.ids.bar_graph.add_widget (FigureCanvasKivyAgg (plt.gcf ()))
, um ein Diagramm auf Kivys
BoxLayout``` zu zeichnen (
id: bar_graph```) .. --``` plt.clf ()
, self.ids.bar_graph.clear_widgets ()
`dient zum Löschen des vorherigen Diagramms beim Umschalten der Pulldown-Auswahl und zum erneuten Anzeigen. ist.main.py
def on_spinner_select(self,text):
row_no=self.lbl.index(text)
Forgraph=self.Data.iloc[row_no,:]
plt.clf()
bar_plt=plt.bar(Forgraph.index, Forgraph)
self.ids.bar_graph.clear_widgets()
self.ids.bar_graph.add_widget(FigureCanvasKivyAgg(plt.gcf()))
5.Save --Save wird weggelassen, da es wie Load verarbeitet wird.
main.py
class MainBoard(BoxLayout):
file_name = ObjectProperty(None)
info = ObjectProperty(None)
bar_graph = ObjectProperty(None)
lbl4spinner = ObjectProperty([])
main.kv
<MainBoard>:
info: info
file_name: file_name
bar_graph: bar_graph
main.py
def __init__(self, **kwargs):
super(MainBoard, self).__init__(**kwargs)
self.master_flg = 0
self.lbl=[]
self.Data=[]
Ich habe insbesondere auf die Informationen zu Kivy auf der folgenden Website verwiesen. offizielles Dokument von kivy: Filechooser Immerhin ist das erste das offizielle Dokument. Sehnsucht nach Freiberuflern Es war hilfreich als Ausgangspunkt. Auf das Layout dieser GUI wird auch hier verwiesen. narito blog Es war sehr hilfreich, um die Beziehung zwischen Kivy und Python zu verstehen. stackoverflow : Python - Kivy framework - Spinner values list Listenanzeige für Spinner, ich glaube, ich wäre ohne diesen Beitrag festgefahren.
Ich verwende IDs zum Zeichnen von Diagrammen, möchte dies jedoch mit Object Propaty beschreiben.
Recommended Posts