Gerätedialog in Python mit GTK darstellen

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
TimeMen
User
Beiträge: 34
Registriert: Samstag 24. Dezember 2016, 10:25
Wohnort: Deutschland

Gerätedialog in Python mit GTK darstellen

Beitragvon TimeMen » Samstag 13. Mai 2017, 09:19

Da mir Glade nur Probleme bereitet hat baue ich das ganze nun einfach nur im Editor ohne Glade zu benutzen.
Vorab: Nutze Linux (Ubuntu Mate 16.04 o. Xubuntu 16.04)
Mein Problem:
Wie kann ich mit GTK sozusagen einen Gerätemanager bereitstellen, der sich z.B. auf Knopfdruck öffnet, wo ich dann alle Geräte (USB, CD, SD, HDD, SSD) angezeigt bekomme?
Es muss kein Button sein, es kann auch ein Menubutton oder sonst ein Auswahldialog sein.
Hauptsache ich kann dann das Gerät (in meinem Fall die SD Karte) auswählen.

LG
RouteUS66
Wie poste ich richtig?
Nachdem du Google, die FAQ und die Suchfunktion erfolgreich ignoriert hast, erstellst du zwei bis fünf neue Themen in den falschen Unterforen mit kreativen Titel und undeutlichen Text, unter dem sich jeder etwas anders vorstellen kann.
Benutzeravatar
BigZ
User
Beiträge: 30
Registriert: Mittwoch 1. Juli 2015, 21:18
Wohnort: Hamburg
Kontaktdaten:

Re: Gerätedialog in Python mit GTK darstellen

Beitragvon BigZ » Samstag 13. Mai 2017, 19:24

http://stackoverflow.com/questions/2313 ... -in-python
Versteh deine Frage nicht so ganz, aber ist die zweite Antwort in dem Link das was du suchst?
Sprich so ein Auswahlfenster mit Verzeichnisbaum wo man eine Datei oder ein Verzeichnis auswählen kann?
Und ist doch kein Grund gleich die Schließung des Unterforums zu fordern, nur weil nicht gleich jemand ne Antwort parat hat.
Vielleicht einfach mal deutlicher erklären was man braucht.
Screenshot, Code, etc.
Ansonsten mal auf den Smiley klicken --> Bild
Hoffe das hilft weiter :mrgreen:
"Ist noch λ?"
"Ja, aber das ϕ ist noch ϱ"
TimeMen
User
Beiträge: 34
Registriert: Samstag 24. Dezember 2016, 10:25
Wohnort: Deutschland

Re: Gerätedialog in Python mit GTK darstellen

Beitragvon TimeMen » Samstag 13. Mai 2017, 19:58

Ich meinte ein MenuItem, dass mir alle verfügbaren USB Geräte, SDs und anderes anzeigt.
Hab das jetzt gelöst, allerdings kommt beim Auslesen der MenuItems immer nur None heraus.
Das ist nicht gerade hilfreich, wenn man ein Setup Programm für Raspbian Jessie Lite schreiben will.

LG
TimeMen
Wie poste ich richtig?
Nachdem du Google, die FAQ und die Suchfunktion erfolgreich ignoriert hast, erstellst du zwei bis fünf neue Themen in den falschen Unterforen mit kreativen Titel und undeutlichen Text, unter dem sich jeder etwas anders vorstellen kann.
BlackJack

Re: Gerätedialog in Python mit GTK darstellen

Beitragvon BlackJack » Samstag 13. Mai 2017, 20:18

@TimeMen: Ohne zu wissen wie und was Du genau machst, kann man nicht so gut sagen was das Problem ist. Mir war beim Ausgangsbeitrag auch noch nicht so ganz klar wo genau dort das Problem lag — am ermitteln der Geräte oder an der Anzeige.
TimeMen
User
Beiträge: 34
Registriert: Samstag 24. Dezember 2016, 10:25
Wohnort: Deutschland

Re: Gerätedialog in Python mit GTK darstellen

Beitragvon TimeMen » Sonntag 14. Mai 2017, 09:06

@BlackJack
Ich wusste nicht wie ich das erklären sollte, und hatte gehofft, dass man es vielleicht auch so versteht.
http://i.imgur.com/UgWqcxf.png

So habe ich das jetzt gelöst, allerdings kann ich die MenuItems beim Klicken nicht auslösen, weil die automatisch generiert werden, und ich demnach nie weiß welches jetzt geklickt wurde...
Wie poste ich richtig?
Nachdem du Google, die FAQ und die Suchfunktion erfolgreich ignoriert hast, erstellst du zwei bis fünf neue Themen in den falschen Unterforen mit kreativen Titel und undeutlichen Text, unter dem sich jeder etwas anders vorstellen kann.
Sirius3
User
Beiträge: 6241
Registriert: Sonntag 21. Oktober 2012, 17:20

Re: Gerätedialog in Python mit GTK darstellen

Beitragvon Sirius3 » Sonntag 14. Mai 2017, 09:37

@TimeMen: am Bild kann man nicht erkennen, was Du jetzt beim Anlegen der MenuItems falsch gemacht hast. Code sagt mehr als 1000 Bilder.
TimeMen
User
Beiträge: 34
Registriert: Samstag 24. Dezember 2016, 10:25
Wohnort: Deutschland

Re: Gerätedialog in Python mit GTK darstellen

Beitragvon TimeMen » Sonntag 14. Mai 2017, 09:57

Hallo Sirius

Das Generieren der Einträge (Bin gerade auf der Suche nach einer besseren Methode ^^)
  1. self.menubar = Gtk.MenuBar()
  2.         vbox.pack_start(self.menubar, True, True, 0)
  3.         self.menu = Gtk.Menu()
  4.         self.mb = Gtk.MenuButton(popup=self.menu)
  5.         vbox.add(self.mb)
  6.         basedir = '/dev/disk/by-path/'
  7.         dev_list = {}
  8.         counter = 0
  9.         for d in os.listdir(basedir):
  10.             #Only show usb disks and not partitions
  11.             if 'usb' in d and 'part' not in d:
  12.                 path = os.path.join(basedir, d)
  13.                 link = os.readlink(path)
  14.                 dev_list[counter] = ('/dev/' + os.path.basename(link))
  15.                 counter += 1
  16.         for i in range(counter):
  17.             dev_list[i] = Gtk.MenuItem(label=dev_list[i])
  18.             dev_list[i].connect("activate", self.on_device)
  19.             dev_list[i].show()
  20.             self.menu.append(dev_list[i])


Die Auswertung:
  1. def on_device(self, menu):
  2.         device = self.mb.get_text()
  3.         print(device)
  4.         #device_lbl_str = "Device: <b>" + device + "<b>"
  5.         #self.device_lbl.set_text(device_lbl_str)


Und da klappt eben die Auswertung nicht, da immer nur None rauskommt.
Wie poste ich richtig?
Nachdem du Google, die FAQ und die Suchfunktion erfolgreich ignoriert hast, erstellst du zwei bis fünf neue Themen in den falschen Unterforen mit kreativen Titel und undeutlichen Text, unter dem sich jeder etwas anders vorstellen kann.
Benutzeravatar
__deets__
User
Beiträge: 890
Registriert: Mittwoch 14. Oktober 2015, 14:29

Re: Gerätedialog in Python mit GTK darstelle

Beitragvon __deets__ » Sonntag 14. Mai 2017, 11:04

Wenn du deine Datenstruktur schon "dev_list" nennst, sie aber dann zum Dictionary machst, dessen Schlüssel wiederum aufsteigende zahlen sind... dann ist das murks.

Nimm eine Liste, und gewöhn dir auch gleich ab mit Indizes auf die Daten zuzugreifen, sondern benutze iteration über die Liste um die Element zu bekommen.

  1. for device in devices:
  2.     ...


Und was erwartest du soll denn passieren wenn du in deinem callback auf den einen Button zugreifst, der das popup öffnet? Der ist doch für alles devices gleich. Da musst du schon auf das Argument "menu" des callbacks zugreifen.
TimeMen
User
Beiträge: 34
Registriert: Samstag 24. Dezember 2016, 10:25
Wohnort: Deutschland

Re: Gerätedialog in Python mit GTK darstellen

Beitragvon TimeMen » Sonntag 14. Mai 2017, 11:08

Natürlich ist das Murks,
aber ich habe es anders nicht hinbekommen.

Könntest du vielleicht ein Beispiel nennen, sodass ich das auch verstehe? ^^
Ich versuche mich mal selbst dran, aber wäre nett wenn du dir die Zeit dafür nehmen könntest

LG
Wie poste ich richtig?
Nachdem du Google, die FAQ und die Suchfunktion erfolgreich ignoriert hast, erstellst du zwei bis fünf neue Themen in den falschen Unterforen mit kreativen Titel und undeutlichen Text, unter dem sich jeder etwas anders vorstellen kann.
TimeMen
User
Beiträge: 34
Registriert: Samstag 24. Dezember 2016, 10:25
Wohnort: Deutschland

Re: Gerätedialog in Python mit GTK darstellen

Beitragvon TimeMen » Sonntag 14. Mai 2017, 11:54

Okey, ich glaube ich habs jetzt:

  1. def init_dev_menu(self):
  2.         for widget in self.devmenu.get_children():
  3.             self.devmenu.remove(widget)
  4.  
  5.         basedir = '/dev/disk/by-path/'
  6.         counter = 0
  7.         dev_list = []
  8.         for d in os.listdir(basedir):
  9.             if 'usb' in d and 'part' not in d:
  10.                 path = os.path.join(basedir, d)
  11.                 link = os.readlink(path)
  12.                 dev_list.append('/dev/' + os.path.basename(link))
  13.                 counter += 1
  14.  
  15.         for device in dev_list:
  16.             item = Gtk.MenuItem(device)
  17.             self.devmenu.append(item)
  18.             item.connect("activate", self.on_dev)
  19.         self.devmenu.show_all(


Danke für den Tipp mit dem Iterieren, werde versuchen mich nun daran zu halten
Wie poste ich richtig?
Nachdem du Google, die FAQ und die Suchfunktion erfolgreich ignoriert hast, erstellst du zwei bis fünf neue Themen in den falschen Unterforen mit kreativen Titel und undeutlichen Text, unter dem sich jeder etwas anders vorstellen kann.
Benutzeravatar
__deets__
User
Beiträge: 890
Registriert: Mittwoch 14. Oktober 2015, 14:29

Re: Gerätedialog in Python mit GTK darstellen

Beitragvon __deets__ » Sonntag 14. Mai 2017, 13:19

Jetzt darfst du noch die überflüssige Counter Variable loswerden, und den Menüeintrag gleich erzeugen statt in einer zweiten Schleife ;)
Sirius3
User
Beiträge: 6241
Registriert: Sonntag 21. Oktober 2012, 17:20

Re: Gerätedialog in Python mit GTK darstellen

Beitragvon Sirius3 » Sonntag 14. Mai 2017, 13:39

@__deeds__: besser wäre, das ganze in eine Funktion zu packen:
  1. import os
  2. from glob import iglob
  3.  
  4. def iter_usb_devices():
  5.     for device in iglob('/dev/disk/by-path/*usb*'):
  6.         if 'part' not in os.path.basename(device):
  7.             yield os.path.realpath(device)
BlackJack

Re: Gerätedialog in Python mit GTK darstellen

Beitragvon BlackJack » Sonntag 14. Mai 2017, 15:30

Wobei das filtern nach *usb* problematisch ist, denn nicht alle Laufwerke/SD-Kartenleser sind per USB angeschlossen. Auf meinem Laptop würde der SD-Kartenleser von dem Programm beispielsweise nicht angezeigt werden.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder