Beiträge von Pinguin
-
-
-
ich weis schon, wieder ein ...zu void, aber ich möchte mal eure Meinung, ich habe oben ja einzelne "Scripte" um software zu installieren und da dachte ich mir, so etwas wo alles an Software Tool ist doch auch nicht schlecht, nun bitte um eure Meinung, was ist besser? Aufwand ist beides :
unten ist eine Auswahl mit xbps und flatpak das passt noch nicht, wird noch geändert
oben ein suchfeld, dann kategorien, linkes Fenster sind die Programme, das ding da
weden mal icons,rechtes Fenster steht bei der Auswahl vom Programm eine kurze beschreibung,
wenn man dann auf installieren klickt kommt noch eine Bestätigung:
wenn dann ein Programm installiert ist, kann man es auch wieder löschen:
rechts unten steht dann installiert: also wenn es ein Flatpak wird steht auch das hier, also mir gefällt das, ein paar optische anpassungen noch... und dann viel schreib arbeit, jetzt ist mir noch etwas aufgefallen, wenn ein Appimages installiert wird kommt unten nichts
da steht nur installieren, aber ich denke wenn ich das in das rechte Fenster in die Beschreibung angebe sollte das reichen, oder? übrigens die Appimges werden automatisch ausführbar gemacht! da muss ich noch einen festen Ordner definieren wohin -
oh mach mal, ich bin ja am lernen zur Zeit......
-
ich weis das ich da auch ein Video dazu gemacht, aber ......
-
Vielleicht würde es helfen, wenn man bestimmte Themen/Kanäle stumm schalten könnte?
Vielleicht geht das ja schon und ich weiss nur nicht wie. Ich würde zB die Themen
- "Zählen bis ... " und
- "Letzter Buchstabe ..."
gerne stumm schalten. Das interessiert mich nicht aber irgendwie bekomme ich trotzdem bei Aktualisierungen immer einen Hinweis. Wenn ich den verhindern/abschalten könnte, dann würde ich die Aktualisierungen gar nicht mehr mitbekommen.das ist eine gute idee, vielleicht kann man das wirklich machen, Sven hast du eine Idee wie wir das machen könnten?
-
hier ist der Link: https://codeberg.org/pinguin-tv/gui-scripte/src/branch/main
der Fehler ist von start.py, da ich das gestern nicht hinbekommen habe schauch ich das ich das änder und vielleicht sogar eine Art Softwarestore mache,
die ersten versuche sind im gleichen Ordner unter test, das schaut noch nach nix aus, aber wenn ich die Trenne so wie bei webseiten in eine main.py wo das aussehen, installation usw. festgelegt ist und eine xx.json dann wird das viel flexibler und beim starten ist das auch schneller denn es wird ja der ganze code nicht geladen, da kann ich dann angeben als was ein paket installiert wird oder auch eine Auswahl od als xbps (also System) Flatpak oder selbst Appimages gehen dann, so das der Benutzer die Möglichkeit hat,
nur ist das verdammt aufwendig, geschrieben muss es ja werden, ich habe gestern abend (halbe Nacht) noch angefangen, aber das ist ja ich muss ja immer den Pfad angeben also jedes Flatpak oder den Pfad für ein Appimages, das ist bei xbps wesentlich schneller
-
Wer sind die beiden? Ich zumindest störe mich nicht an void. Ich habe nur geschrieben, wie ich es sehe.
egal wer die beiden sind, jeder hat seine Meinung.
-
Es sind einfach zu wenige mit anderen Interessen/ Themen hier unterwegs. Ich gucke hier rein und bin fast nur am Void-weg-klicken, und dann bleibt oft nicht viel über.
das ist vermultich richtig, aber es kann doch jeder schreiben was er will, egal zu welchem Thema, übrigens das mit den Koch Rezepten finde ich nicht mal schlecht
-
Hat er, @juppsupp hat mir das schon vorher geschrieben das er aufhören will, wenn sich das mit void nicht ändert
-
wer kann mir helfen, ich dachte ich habe ein schön designedes Startfenster erstellt,
nur bekomme ich lauter Fehlermeldungen, die einzelnen script laufen alle wenn ich die direkt starte, kann mir jemand helfen?
Python
Alles anzeigen#!/usr/bin/env python3 import gi import subprocess import threading import os import stat import shutil gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, GdkPixbuf # Diese Liste enthält die Programme/Skripte, die gestartet werden sollen. # Jedes Tupel besteht aus: # (Anzeigename, Skriptname, ist_void_installer, Icon-Pfad) PROGRAMS = [ ("Drucker-Treiber und Scanner-Programme installieren", "drucker_installer.py", False, "/usr/local/bin/icons/drucker.png"), ("Grafikkarten-Treiber installieren", "gpu.py", False, "/usr/local/bin/icons/gpu.png"), ("Grafik-Programme installieren", "grafik_installer.py", False, "/usr/local/bin/icons/drawing.jpg"), ("Internet-Programme installieren", "internet_installer.py", False, "/usr/local/bin/icons/internet.png"), ("Multimedia-Programme installieren", "multimedia_installer.py", False, "/usr/local/bin/icons/video.png"), ("Office-Programme installieren", "office_installer.py", False, "/usr/local/bin/icons/office.png"), ("System-Wartungs - Tools", "system.py", False, "/usr/local/bin/icons/system.jpg"), ("Virtuelle-Maschinen installieren", "vm_installer.py", False, "/usr/local/bin/icons/vm.png"), ("Gaming-Tools (Steam, Lutris usw.) installieren", "gaming.py", False, "/usr/local/bin/icons/gaming.png"), ("Void-Installer starten", "void-installer", True, "/usr/local/bin/icons/installer.png"), ] class AllInstallersWindow(Gtk.Window): def __init__(self): super().__init__(title="🛠️ Treiber und Software Installation für Void Community Flavours") self.set_border_width(10) self.set_default_size(750, 550) self.vbox = Gtk.VBox(spacing=10) self.add(self.vbox) self.status_label = Gtk.Label(label="Wähle deine Kategorie aus:") self.vbox.pack_start(self.status_label, False, False, 0) self.select_all_cb = Gtk.CheckButton(label="Alle auswählen / abwählen") self.select_all_cb.connect("toggled", self.on_select_all_toggled) self.vbox.pack_start(self.select_all_cb, False, False, 0) self.dark_mode_switch = Gtk.Switch() self.dark_mode_switch.set_active(False) self.dark_mode_switch.connect("notify::active", self.on_dark_mode_toggled) dark_mode_box = Gtk.HBox(spacing=10) dark_mode_label = Gtk.Label(label="Dunkelmodus") dark_mode_box.pack_start(dark_mode_label, False, False, 0) dark_mode_box.pack_end(self.dark_mode_switch, False, False, 0) self.vbox.pack_start(dark_mode_box, False, False, 0) self.checkbuttons = [] self.program_list = PROGRAMS.copy() for i, (name, script_name, is_void_installer, icon_path) in enumerate(self.program_list): self.add_program_row(name, script_name, is_void_installer, icon_path) if script_name == "void-installer": separator = Gtk.Separator(orientation=Gtk.Orientation.HORIZONTAL) self.vbox.pack_start(separator, False, False, 5) button_box = Gtk.HBox(spacing=10) run_button = Gtk.Button(label="Ausführen") run_button.connect("clicked", self.on_run_clicked) button_box.pack_start(run_button, True, True, 0) self.vbox.pack_start(button_box, False, False, 0) self.output_view = Gtk.TextView() self.output_view.set_editable(False) self.output_view.set_cursor_visible(False) self.output_buffer = self.output_view.get_buffer() scroll = Gtk.ScrolledWindow() scroll.set_min_content_height(200) scroll.add(self.output_view) self.vbox.pack_start(scroll, True, True, 0) self.progress = Gtk.ProgressBar() self.vbox.pack_start(self.progress, False, False, 0) self.css_provider = Gtk.CssProvider() self.style_context = Gtk.StyleContext() self.screen = self.get_screen() self.style_context.add_provider_for_screen(self.screen, self.css_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION) self.update_start_buttons() self.apply_theme(False) def add_program_row(self, name, script_name, is_void_installer, icon_path): hbox = Gtk.HBox(spacing=10) try: if os.path.isfile(icon_path): pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(icon_path, 42, 43, preserve_aspect_ratio=True) icon = Gtk.Image.new_from_pixbuf(pixbuf) else: icon = Gtk.Image.new_from_icon_name("image-missing", Gtk.IconSize.BUTTON) except Exception: icon = Gtk.Image.new_from_icon_name("image-missing", Gtk.IconSize.BUTTON) hbox.pack_start(icon, False, False, 0) check = Gtk.CheckButton(label=f"{name}") start_button = Gtk.Button(label="Ausführen") start_button.set_sensitive(False) start_button.connect("clicked", self.on_start_program, (script_name, is_void_installer)) hbox.pack_start(check, True, True, 0) hbox.pack_start(start_button, False, False, 0) if script_name == "void-installer": remove_button = Gtk.Button(label="Entfernen") remove_button.connect("clicked", self.on_remove_program, (name, script_name, is_void_installer, hbox)) hbox.pack_start(remove_button, False, False, 0) self.vbox.pack_start(hbox, False, False, 0) self.checkbuttons.append((check, script_name, is_void_installer, start_button, hbox)) self.vbox.show_all() def on_remove_program(self, button, data): name, script_name, is_void_installer, hbox = data self.program_list = [p for p in self.program_list if p[:3] != (name, script_name, is_void_installer)] self.checkbuttons = [(c, sn, iv, btn, hb) for c, sn, iv, btn, hb in self.checkbuttons if hb != hbox] self.vbox.remove(hbox) for child in self.vbox.get_children(): if isinstance(child, Gtk.Separator) and script_name == "void-installer": self.vbox.remove(child) break GLib.idle_add(self.append_output, f"Eintrag '{name}' wurde aus der Liste entfernt.") self.vbox.show_all() def on_select_all_toggled(self, widget): active = widget.get_active() for check, *_ in self.checkbuttons: check.set_active(active) def on_run_clicked(self, widget): selected = [(script_name, is_void_installer) for check, script_name, is_void_installer, _, _ in self.checkbuttons if check.get_active()] if selected: threading.Thread(target=self.run_commands, args=(selected,)).start() def make_script_executable(self, script_path): try: if os.path.isfile(script_path): current_mode = os.stat(script_path).st_mode os.chmod(script_path, current_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH) return True return False except Exception as e: GLib.idle_add(self.append_output, f"⚠️ Fehler beim Setzen der Ausführrechte für {script_path}: {e}") return False def run_commands(self, scripts): total = len(scripts) if shutil.which("pkexec") is None: GLib.idle_add(self.append_output, "⚠️ Fehler: 'pkexec' nicht gefunden. Bitte installiere policykit-1.") return for i, (script_name, is_void_installer) in enumerate(scripts): GLib.idle_add(self.progress.set_fraction, i / total) GLib.idle_add(self.append_output, f"Starte {script_name}...") if is_void_installer: cmd = ["pkexec", "void-installer"] else: script_path = os.path.join("/usr/local/bin/", script_name) if self.make_script_executable(script_path): cmd = ["pkexec", "/usr/bin/python3", script_path] else: GLib.idle_add(self.append_output, f"⚠️ Fehler: {script_name} nicht gefunden oder nicht ausführbar in /usr/local/bin/") continue try: subprocess.Popen(cmd) GLib.idle_add(self.append_output, f"✅ '{script_name}' wurde gestartet. Bitte beachte die Passwortabfrage.") except Exception as e: GLib.idle_add(self.append_output, f"⚠️ Fehler beim Starten von {script_name}: {e}") GLib.idle_add(self.progress.set_fraction, 1.0) GLib.idle_add(self.append_output, "\n✅ Alle Aktionen abgeschlossen.") GLib.idle_add(self.show_completion_notification) def show_completion_notification(self): dialog = Gtk.MessageDialog( parent=self, flags=0, message_type=Gtk.MessageType.INFO, buttons=Gtk.ButtonsType.OK, text="Ausführung abgeschlossen", ) dialog.format_secondary_text("Alle ausgewählten Installer wurden gestartet.") dialog.run() dialog.destroy() def append_output(self, text): end_iter = self.output_buffer.get_end_iter() self.output_buffer.insert(end_iter, text + "\n") # Automatisch zur letzten Zeile scrollen scroll_to_end = self.output_view.get_property("parent").get_vadjustment() scroll_to_end.set_value(scroll_to_end.get_upper() - scroll_to_end.get_page_size()) def update_start_buttons(self): for _, script_name, is_void_installer, button, _ in self.checkbuttons: if is_void_installer: button.set_sensitive(shutil.which("void-installer") is not None) else: script_path = os.path.join("/usr/local/bin/", script_name) button.set_sensitive(os.path.isfile(script_path)) def on_start_program(self, button, data): script_name, is_void_installer = data if shutil.which("pkexec") is None: GLib.idle_add(self.append_output, "⚠️ Fehler: 'pkexec' nicht gefunden. Bitte installiere policykit-1.") return GLib.idle_add(self.append_output, f"Starte '{script_name}'...") if is_void_installer: if shutil.which("void-installer") is None: GLib.idle_add(self.append_output, f"⚠️ Fehler: void-installer nicht gefunden") return try: subprocess.Popen(["pkexec", "void-installer"]) GLib.idle_add(self.append_output, f"✅ '{script_name}' wurde gestartet. Bitte beachte die Passwortabfrage.") except Exception as e: GLib.idle_add(self.append_output, f"⚠️ Fehler beim Starten von {script_name}: {e}") else: script_path = os.path.join("/usr/local/bin/", script_name) if not os.path.isfile(script_path): GLib.idle_add(self.append_output, f"⚠️ Fehler: {script_name} nicht gefunden in /usr/local/bin/") return if self.make_script_executable(script_path): try: subprocess.Popen(["pkexec", "/usr/bin/python3", script_path]) GLib.idle_add(self.append_output, f"✅ '{script_name}' wurde gestartet. Bitte beachte die Passwortabfrage.") except Exception as e: GLib.idle_add(self.append_output, f"⚠️ Fehler beim Starten von {script_name}: {e}") else: GLib.idle_add(self.append_output, f"⚠️ Fehler: {script_name} ist nicht ausführbar") def on_dark_mode_toggled(self, switch, *args): self.apply_theme(switch.get_active()) def apply_theme(self, dark_mode): if dark_mode: css = """ window, box, button, label, textview, progressbar { background-color: #2e2e2e; color: #ffffff; } textview text { background-color: #2e2e2e; color: #ffffff; } checkbutton check { background-color: #ffffff; color: #000000; border: 1px solid #ffffff; } checkbutton:checked check { background-color: #4CAF50; color: #ffffff; } checkbutton label { color: #ffffff; } """ self.css_provider.load_from_data(css.encode()) else: self.css_provider.load_from_data(b"") # Starte GUI win = AllInstallersWindow() win.connect("destroy", Gtk.main_quit) win.show_all() Gtk.main() -
Alles anzeigen
Tja Leute,
möchte mich aus diesem Forum verabschieden.
Ich mein jeder so wie er will und kann....aber leider ist das Forum hier zu einem Void Forum geworden. ( ist jetzt nicht böse gemeint...)
Mich hatte damals die Vielseitigkeit dieses Forum`s so angesprochen, das scheint leider vorbei, aber ist ja auch okay.
Ist halt der Wandel der Zeit.....alles verändert sich..
Aber was soll man jetzt meckern oder jammern.....jeder wie er kann und ich kann meinen Account hier kündigen....


Ich wollte aber nicht gehen ohne Tschüss zu sagen.....macht`s gut und bleibt gesund.....war schön mit euch.


Denkt bitte daran in der nächsten Zeit den Com. Ordner nochmal unter die Lupe zu nehmen ob dieser noch wichtige Sachen enthält die ihr benötigt.......
Ich möchte mich von ganzem Herzen für deinen Einsatz in den letzten Jahren bedanken und wünsche Dir für die Zukunft alles GUTE! und falls du mal wieder Lust hast mit ein paar "Linux-Spinner" ........ oder vielleicht schaust du ja mal wieder vorbei

-
OK, da muss ich ganz alleine mir die Schuld dafür geben

-
das von mir war allgemein, warum Fedora x11 bei cinnamon hat
-
Mein lieber Pinguin, ich zolle dir wieder grossen Respekt und Anerkennung für deine Arbeit und was du da auf die Beine stellst. Tiefer Respekt!
nein noch nicht, jetzt sind zwar alle geschrieben, und jetzt muss ich aber alles noch richtig testen. Das dauert, nur jetzt sind es eigentlich überall aber nur kleine fehler wie Berechtigungen usw,
-
Ich habe ja angekündigt und schon begonnen Scripte für Void Linux zu erstellen,
unter dem Link findet ihr alle, die sind jetzt alle mit einer GUI, einem light und dark Modus
hier mal ein paar Bilder:
unter start.py sind dann alle anderen ausführbar
-
in Cinnamon funktioniert Wayland nocht nicht, ist noch in Entwicklung
-
XFCE gefällt mir, Thunar ist mittlerweile ein richtig guter Dateibrowser, das einzige was ich vermisse (aber nicht brauche) sind die Spielereien wie wacklige Fenster

usw.XFCE ist oder wäre mir jetzt lieber als KDE, aber das ist vermutlich Geschmackssache, nachdem ich auch einiges mit Cinnamon mache, setze ich beide fast gleich
-
Du könntest einen KI automatischen Email-Antworter erstellen. Geht ganz einfach in make.com und dann erledigt sich so einiges.
super, aber woher weis der dann was ich lesen will und was nicht? wäre super wenn so etwas ginge
-
alles gut, ich habe mich auch schon mit einem Youtuber darüber unterhalten wie er das macht, (ist fast 10 mal größer wie mein Kanal) er ignoriert einfach, gibt keine Antworten auf so etwas oder auf die meisten kommentare, nur das mit den mails ist ein Problem wo ich noch nicht weis wie ich das löse, manchmal sind ja gut dabei nur muss ich ja erst lesen...