Programmieren besteht zu einem riesigen Anteil aus Denken und Überdenken. Der Rest ist Copy&Paste von StackOverflow. Das ist jetzt ausnahmsweise mal nicht klamaukig gemeint.
Ich habe den Code vom ersten Teil noch einmal gelesen und gemerkt, dass die Rahmenorganisation, wenn alles fertig ist, nicht so toll ist. Außerdem soll der Code ja einfach verständlich für Neulinge sein.
Deshalb benennen wir den button_frame in update_button_frame um, was auch bedeutet, dass dieser auch in den beiden Buttons geändert werden muss. Außerdem habe ich einen Fehler bemerkt. Ich habe den Button nur kopiert und eingefügt, den "Text" in "Upgrade" geändert habe.
Im Code ist jetzt 2x update_button
. Dass so etwas geht, ist tatsächlich ein Feature und kein Bug. Variablen können so oft im Code auftauchen, wie sie wollen, denn wenn eine neue Zeile gelesen wird, bekommt die Variable einfach einen neuen Wert. Ja, das ist zu kompliziert. Wir benennen den Zweiten einfach in upgrade_button
um. Um alles noch einsteiger-freundlicher zu machen, tauschen wir .grid()
jetzt mit .pack(side=LEFT)
aus. Das sagt Python einfach dass alles von links nach rechts angeordnet werden soll.
Als Nächstes fügen wir noch einen neuen Frame hinzu, und zwar direkt über terminal_frame. Die Platzierung mit .pack()
ist total unkompliziert; ge-packte Widgets werden ohne Parameter einfach in der geschriebenen Reihenfolge gezeichnet.
installer_frame = Frame(main,background="yellow")
installer_frame.pack(fill="both",expand=True)
Das war es mit der Korrektur, und wir machen etwas Neues.
Der Installer/Uninstaller
Was brauchen wir:
- Ein Label (Schriftzug), das "apt" sagt.
- Zwei Buttons mit den Texten: "install" und "remove" (der Befehl wird vorerst weggelassen)
- und eine Entry-Box, in die wir schreiben können.
installer_frame = Frame(main,background="yellow")
installer_frame.pack(fill="both",expand=True)
apt_label = Label(installer_frame,text="apt")
apt_label.pack(side=LEFT)
install_button = Button(installer_frame, text="install")
install_button.pack(side=LEFT)
remove_button = Button(installer_frame, text="remove")
remove_button.pack(side=LEFT)
enrty_box = Entry(installer_frame)
enrty_box.pack(side=LEFT)
Alles anzeigen
Jetzt müssen wir die Buttons mit dem Entry verbinden und eine Funktion ausführen lassen. Dazu nehmen wir uns jetzt up_action() und kopieren es zweimal. Wir benennen beide in install_action und remove_action um.
Jetzt kommen wir endlich zu den f-Strings. Wenn man ein "f" vor einen quotierten Code setzt und inf"irgenwas" {}...Klammern einfügt... kann alles, was sich darin befindet, "alles Mögliche" sein.
Beispiel:
Wir wollen etwas installieren: . Wie bekommen wir das jetzt in den Code?
z.B. sudo apt install neofetch -y
Über os.popen
legen wir neue Variablen an. get_entry = entry_box.get(). Das "get" holt sich die Information aus entry_box
und speichert sie. Da wir die Entry-Box für "install" und "remove" benutzen wollen, können wir in os.popen
diese Strings nicht direkt benutzen, also müssen wir sie woanders unterbringen.
So haben wir für diese Funktion install
mit dem, was in entry_box
steht, zusammengekleistert. Nun können wir inst_plus_entry
in den f-String einfügen.
def install_action():
get_entry = enrty_box.get()
inst_plus_entry = f"install {get_entry}"
os.popen(f'xterm -into %d -bg Grey11 -geometry 1000x50 -e "pkexec apt {inst_plus_entry} -y && sleep 5 && exit; exec bash"'% wid)
Das Gleiche machen wir jetzt für remove_action(), nur eben mit "remove". Vor das "&& exit" im Kommando setzen wir noch "-y", damit es automatisch passiert, und "&& sleep 5", damit wir sehen, was da überhaupt passiert ist.
Im Code seht ihr jetzt, das ich die Buttons verknüpft habe mit dem Parameter command=. Das verweist auf die jeweilige Funktion
from tkinter import *
import os
# Zeichnet das Fensters
main = Tk()
main.title('Software Manager')
main.geometry("600x600")
def up_action():
os.popen(f'xterm -into %d -bg Grey11 -geometry 1000x50 -e "pkexec apt update -y && sleep 5 && exit ; exec bash"'% wid)
def upg_action():
os.popen(f'xterm -into %d -bg Grey11 -geometry 1000x50 -e "pkexec apt upgrade -y && sleep 5 && exit ; exec bash"'% wid)
def install_action():
get_entry = enrty_box.get()
inst_plus_entry = f"install {get_entry}"
os.popen(f'xterm -into %d -bg Grey11 -geometry 1000x50 -e "pkexec apt {inst_plus_entry} -y && sleep 5 && exit; exec bash"'% wid)
def remove_action():
get_entry = enrty_box.get()
remove_plus_entry = f"remove {get_entry}"
os.popen(f'xterm -into %d -bg Grey11 -geometry 1000x50 -e "pkexec apt {remove_plus_entry} -y && sleep 5 && exit; exec bash"'% wid)
button_frame = Frame(main,background="red")
button_frame.pack(fill="both",expand=True)
update_button = Button(button_frame, text="Update",command=up_action)
update_button.pack(side=LEFT)
upgrade_button = Button(button_frame, text="Upgrade",command=upg_action)
upgrade_button.pack(side=LEFT)
installer_frame = Frame(main,background="yellow")
installer_frame.pack(fill="both",expand=True)
apt_label = Label(installer_frame,text="apt")
apt_label.pack(side=LEFT)
install_button = Button(installer_frame, text="install",command=install_action)
install_button.pack(side=LEFT)
remove_button = Button(installer_frame, text="remove",command=remove_action)
remove_button.pack(side=LEFT)
enrty_box = Entry(installer_frame)
enrty_box.pack(side=LEFT)
terminal_frame = Frame(main,background="blue")
terminal_frame.pack(fill="both",expand=True)
wid = terminal_frame.winfo_id()
# Startet das Fenser
main.mainloop()
Alles anzeigen
Unser Programm ist, was die Funktionalität angeht, fertig. Aber um das nochmal klar zustellen:
Dies ist eine ganz rudimentäre Idee, wie man so etwas angehen kann. Wenn man ein Programm installieren will, das es nicht gibt, oder man verschreibt sich, bleibt das Terminal unten geöffnet, und man muss es mit dem Befehl exit manuell schließen. Will man es richtig machen, so kann man sich die verfügbaren Programme, die installiert oder deinstalliert werden können, auslesen lassen, sie in einer Python-Liste speichern und mit einem IF/ELSE-Statement bestimmen, dass es nicht weitergeht, wenn der eingegebene Begriff nicht in einer der Listen auftaucht. Man könnte auch, wie in synaptic, diese Programme in einer List-Box grafisch darstellen und per Doppelklick die Funktion starten. Anstatt das OS-Modul zu nutzen, können wir auch alles über python-apt laufen lassen und das Skript direkt mit sudo oder pkexec ausführen. Dann hättet Ihr aber nicht gelernt, wie man über Python ein externes Programm öffnet.
Wie hier:
Das geht alles, man muss nur wissen wie! In Teil 3 machen wir das hässliche Ding hübsch!
Vorschau Teil 3
PS: Software-Manager ist ein langweiliger Ich glaube ich benenne das teil um in Debian-Assistent . Ach wisst Ihr was, nach Teil 3 mache ich daraus wirklich einen Debian-Assistenten...
Kommentare 2