QTreeWidget/Vew + Liste von Pools!

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
AngelusNoctis
User
Beiträge: 92
Registriert: Sonntag 16. Dezember 2007, 20:03

Hi

Ich hab ein kleines Problem weil ich komplett aus der Übung bin mit PyQt

Und zwar würde ich gerne ein TreeView generien mit einer Liste von zPools.

Code: Alles auswählen

    def create_tree_entries(self):
        for i in OUTPUT:
            current_line = i.split('\t')
            print(current_line)

Code: Alles auswählen

['deadpool', '2.34T', '4.72T', '208K', '/deadpool']
['deadpool/Backup', '315G', '4.72T', '314G', '/deadpool/Backup']
['deadpool/Movies', '1.21T', '4.72T', '1.21T', '/deadpool/Movies']
['deadpool/Nextcloud', '31.0M', '4.72T', '21.9M', '/deadpool/Nextcloud']
['deadpool/Photos', '223G', '4.72T', '223G', '/deadpool/Photos']
['deadpool/Transmission', '289G', '4.72T', '289G', '/deadpool/Transmission']
['deadpool/Urbackup', '327G', '4.72T', '326G', '/deadpool/Urbackup']
['deadpool/VM', '4.52G', '4.72T', '176K', '/deadpool/VM']
['deadpool/VM/docker', '4.52G', '4.72T', '1.50G', '/deadpool/VM/docker']
Sollte sein ala:

Code: Alles auswählen

deadpool|-+
                   |- Backup
		   |- Movies
                   |- Nextcloud
		   |- Photos
		   |- Transmission
		   |- Urbackup
		   |- VM-+
                              |-docker

So aber nun wie weiter?

Ich bekomme es danach nicht gebacken mit QtWidgets.QTreeWidgetItem() und .addChild() so zu sortieren das die Einträge stimmen und ein Verzeichnisbaum sind.

Ich hab auch schon versucht die Listen nochmals zu splitten i[0].split('/').

Aber irgendwie mach ich nur murks und hab mittweiles den kompletten block gelöscht.

Kann mir jemand ein einfaches Beispiel machen mit Pfaden in einer Liste, wie man die sortiert parten / child und dann einfügt in TreeWidget?
Benutzeravatar
__blackjack__
User
Beiträge: 14004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@AngelusNoctis: Was denn nun, TreeWidget oder TreeView?
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
AngelusNoctis
User
Beiträge: 92
Registriert: Sonntag 16. Dezember 2007, 20:03

__blackjack__ hat geschrieben: Donnerstag 16. Januar 2020, 11:15 @AngelusNoctis: Was denn nun, TreeWidget oder TreeView?
Sorry, war übermüdet :D

---> QTreeWidget

Ich muss das Teil irgendwie so hinbekommen damit ich das QTreeWidget füllen kann

Code: Alles auswählen

OUTPUT = [u'deadpool\t2.34T\t4.72T\t208K\t/deadpool', u'deadpool/Backup\t315G\t4.72T\t314G\t/deadpool/Backup', u'deadpool/Movies\t1.21T\t4.72T\t1.21T\t/deadpool/Movies', u'deadpool/VM\t4.52G\t4.72T\t176K\t/deadpool/VM', u'deadpool/VM/docker\t4.52G\t4.72T\t1.50G\t/deadpool/VM/docker',u'deadpool/VM/docker/3821923823932\t4.52G\t4.72T\t1.50G\t/deadpool/VM/docker',u'deadpool/VM/docker/95064869456846\t4.52G\t4.72T\t1.50G\t/deadpool/VM/docker']
Der Code ist bisher wie folgt:

Code: Alles auswählen

    def create_tree_entries(self):
        for i in range(len(OUTPUT)):
            line = OUTPUT[i].split('\t')[0].split('/')
            print(line)
Ausgabe:

Code: Alles auswählen

['deadpool']
['deadpool', 'Backup']
['deadpool', 'Movies']
['deadpool', 'VM']
['deadpool', 'VM', 'docker']
['deadpool', 'VM', 'docker', '3821923823932']
['deadpool', 'VM', 'docker', '95064869456846']
Nur wie füge ich das jetzt mit der Korrekten Position und Tiefe in das QTreeWidget?

Wollte erst mit x,y koordinaten und habs vermurkst, dann wollte ich eine Struktur die nicht so will wie ich möchte.


Für Beispiel Code wäre ich dankbar... Was einfaches.. ^^


Blödes ZoL hat keine Json ausgabe, wie unter Solaris und BSD :(
Benutzeravatar
__blackjack__
User
Beiträge: 14004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@AngelusNoctis: Probleme in Teilprobleme aufteilen. Im ersten Schritt die Daten in eine passende Struktur bringen, also beispielsweise ein verschachteltes Wörterbuch (vor CPython 3.6 ein `collections.OrderedDict`) und dann eine rekursive Funktion/Methode schreiben die damit dann ein `QTreeWidget` füllt.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
AngelusNoctis
User
Beiträge: 92
Registriert: Sonntag 16. Dezember 2007, 20:03

__blackjack__ hat geschrieben: Freitag 17. Januar 2020, 13:44 @AngelusNoctis: Probleme in Teilprobleme aufteilen. Im ersten Schritt die Daten in eine passende Struktur bringen, also beispielsweise ein verschachteltes Wörterbuch (vor CPython 3.6 ein `collections.OrderedDict`) und dann eine rekursive Funktion/Methode schreiben die damit dann ein `QTreeWidget` füllt.
Hi
Danke für die Antwort aber --->
Für Beispiel Code wäre ich dankbar... Was einfaches.. ^^
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

So etwa geht es. Die Adaption auf Qt ist dem geneigten Leser als Hausaufgaben anheimgestellt.

Code: Alles auswählen

import itertools

DATA = [['deadpool'],
['deadpool', 'Backup'],
['deadpool', 'Movies'],
['deadpool', 'VM'],
['deadpool', 'VM', 'docker'],
['deadpool', 'VM', 'docker', '3821923823932'],
['deadpool', 'VM', 'docker', '95064869456846']]

class Item:
	
	def __init__(self, name):
		self.name = name
		self.children = []
		

def print_item_tree(item, level=0):
	print(' ' * level, item.name)
	for child in item.children:
		print_item_tree(child, level + 2)
		

def create_item_tree(root, entries):
	for subgroup, items in itertools.groupby(
		entries,
		lambda l: l[0]
		):
			subitem = Item(subgroup)
			root.children.append(subitem)
			create_item_tree(
				subitem,
				(v[1:] for v in items if v[1:])
			)
			
root = Item('ROOT')
create_item_tree(root, DATA)
print_item_tree(root)
AngelusNoctis
User
Beiträge: 92
Registriert: Sonntag 16. Dezember 2007, 20:03

Danke schön euch beiden :)

Hab bei stackoverflow auch ne Antwort erhalten und poste den Link mal hier zur Vervollständigung.

https://stackoverflow.com/questions/597 ... 5#59791455

PS. Krass wie viel man "verlernt" wenn man nicht am Ball bleibt. :(
Antworten