Modul für GUI-Programmierung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
barisoezcan
User
Beiträge: 73
Registriert: Freitag 15. März 2013, 19:38

Kann mir jemand ein Pyton-Modul für GUI-Programmierung empfehlen?

Im Internet habe ich folgende gefunden:
http://wiki.python.org/moin/GuiProgramming

Ich will damit Bilder in dieser Form darstellen:
Bild
Wenn dann auf ein Bild geklickt wird, sollen andere ähnliche Bilder, die unter diese Kategorie fallen, angezeigt werden (habe mir noch nicht überlegt wie genau).

Vielleicht eignet sich ein Modul besonders für mein Problem.

Danke im Vorraus.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

barisoezcan hat geschrieben:Vielleicht eignet sich ein Modul besonders für mein Problem.
Um Bilder in einem Fenster darzustellen kannst Du jedes beliebige GUI-Framework verwenden. Um die Wahl des Frameworks etwas spezieller zu treffen, kannst Du Dich ja mal mit diesen Fragen auseinandersetzen.

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
JonnyDamnnox
User
Beiträge: 68
Registriert: Sonntag 10. März 2013, 21:14

http://en.wikipedia.org/wiki/PyQt

Damit geht alles.

Gruß
barisoezcan
User
Beiträge: 73
Registriert: Freitag 15. März 2013, 19:38

Danke =)

Wie habe ich übrigens ein Bild mit

Code: Alles auswählen

img = Image.fromarray(node, "RGB")
zu erzeugen?

Wenn ich für "node" ein Array mit den Dimensionen 40, 40, 3 übergebe, wird nachher nur Mist angezeigt.
(40 und 40 für die Größe des Bildes und 3 für die einzelnen RGB-Werte)

Bild

Muss das Array vielleicht anders übergeben werden?
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@barisoezcan:
Ehm, da fehlt der Kontext. Welchem Darstellungsobjekt welches GUI-Toolkits übergibst Du jetzt diese Daten?
barisoezcan
User
Beiträge: 73
Registriert: Freitag 15. März 2013, 19:38

Code: Alles auswählen

import tkinter
import numpy
from PIL import Image, ImageTk

#nodes ist ein Array der Groesse 40*40*3
#40 und 40 Groesse des Bildes
#3 für RGB-Werte
nodes = numpy.load("nodes.npy")[0][0]

img = Image.fromarray(nodes, "RGB")


root = tkinter.Tk()

image1 = ImageTk.PhotoImage(img)

label1 = tkinter.Label(root,image=image1)
label1.pack()

root.mainloop()
BlackJack

@barisoezcan: Geh doch mal den Weg anders herum: Lade ein kleines RGB-Bild mit `PIL.Image` und wende dann `numpy.array()` darauf an. Dann vergleiche die Struktur dieses Arrays mit Deinem.
barisoezcan
User
Beiträge: 73
Registriert: Freitag 15. März 2013, 19:38

Das Array hat genau die selbe Struktur.
Aber die einzelnen Unterelemente sind numpy.uint8.

Bei mir im Beispiel sind sie aber numpy.float64.

Könnte es daran liegen?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Ja.
Das Leben ist wie ein Tennisball.
barisoezcan
User
Beiträge: 73
Registriert: Freitag 15. März 2013, 19:38

Okay, hab die Float-Werte in Integer umgewandelt...
Es liegt nicht daran :D

Mir fällt nicht ein, was es sonst sein könnte :K
BlackJack

@barisoezcan: Bist Du sicher dass das Bild nicht ganz einfach so aussieht‽
xeike
User
Beiträge: 83
Registriert: Donnerstag 28. Februar 2013, 09:58

Sollten es drei BYTES statt drei ints/floats sein?

Xe
barisoezcan
User
Beiträge: 73
Registriert: Freitag 15. März 2013, 19:38

BlackJack hat geschrieben:@barisoezcan: Bist Du sicher dass das Bild nicht ganz einfach so aussieht‽
Die Unterelemente des Arrays sind Float-Werte zwischen 0 und 1.

Wenn ich das Array mit

Code: Alles auswählen

plot = plt.imshow(node, interpolation = "nearest")
plotte, sieht es so aus, wie es aussehen sollte.

Wenn ich das selbe Array (unverändert) mit

Code: Alles auswählen

img = Image.fromarray(node, "RGB")
image1 = ImageTk.PhotoImage(img) 
usw..
anzeigen lasse, kommt Mist raus.

Wenn ich das selbe Array (Werte mit 255 multipliziert und dann in Integer umgewandelt) wieder mit

Code: Alles auswählen

img = Image.fromarray(node, "RGB")
image1 = ImageTk.PhotoImage(img) 
usw..
anzeigen lasse, kommt wieder (ein anderer) Mist raus.


Das merkwürdige ist nur, wenn ich ein Bild mit

Code: Alles auswählen

im = Image.open("TEST10.jpg")
bild = (numpy.array(im))
pix = Image.fromarray(bild, "RGB")
einlese, dann wird das Bild sowohl beim Plotten richtig anzeigt, als auch mit ImageTk.PhotoImage(img) richtig angezeigt...

:K :K :K :K :K
barisoezcan
User
Beiträge: 73
Registriert: Freitag 15. März 2013, 19:38

Ok, ich glaube ich bin auf den Punkt des Problems gekommen...

Code: Alles auswählen

import numpy


a = [23.293920, 34.29, 32.19]

numpy.save("Test123.npy", a)

b = numpy.load("Test123.npy")


for i in range(len(b)):
    b[i] = int(b[i])
        
print(a)
print(b)
Die Ausgabe ist MERKWÜRDIGERWEISE:

[23.29392, 34.29, 32.19]
[ 23. 34. 32.]

Wo zum Teufel kommen die Punkte her, und wieso sind die Elemente nicht durch Kommas getrennt? :?
Zuletzt geändert von barisoezcan am Dienstag 16. April 2013, 20:28, insgesamt 1-mal geändert.
xeike
User
Beiträge: 83
Registriert: Donnerstag 28. Februar 2013, 09:58

barisoezcan hat geschrieben:Es sollten 3 numpy.uint8 sein.
Ist die Reihenfolge richtig?
Also RGBRGB.... und das dann 40 mal 40

Erster Test: Probiere doch mal am Ende der dritten Schleife

Code: Alles auswählen

node[i][j][z] = numpy.uint8(128)
aus und schaue, ob du so ein graues Bild bekommst.

Xe
barisoezcan
User
Beiträge: 73
Registriert: Freitag 15. März 2013, 19:38

@Xe:

Wenn ich es plotte, kommt ein graues Bild..

Wenn ich es aber in der GUI anzeigen lassen will, sieht es so aus:
Bild

Und das Array sieht dann wie folgt aus:

[[ 128. 128. 128.]
[ 128. 128. 128.]
[ 128. 128. 128.]
...,
[ 128. 128. 128.]
[ 128. 128. 128.]
[ 128. 128. 128.]]

...,

Die Punkte und die fehlenden Kommas stören mich (und ich denke, den Interpreter auch :D)
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@barisoezcan: Du wandelst auch nicht den Datentyp um, sondern rechnest nur die Zahlen um.

Code: Alles auswählen

img_bytes = (255*img_float).astype(numpy.uint8)
barisoezcan
User
Beiträge: 73
Registriert: Freitag 15. März 2013, 19:38

Sirius3 hat geschrieben:@barisoezcan: Du wandelst auch nicht den Datentyp um, sondern rechnest nur die Zahlen um.

Code: Alles auswählen

img_bytes = (255*img_float).astype(numpy.uint8)

Es hat sich nichts getan :cry:
xeike
User
Beiträge: 83
Registriert: Donnerstag 28. Februar 2013, 09:58

barisoezcan hat geschrieben:Es hat sich nichts getan :cry:
Sieht so aus, als würdest du immer noch floats haben.

Wie wäre es dann mit

Code: Alles auswählen

punkte = []
for...
    for....
        for ...
            punkte.append( int(node[i][j][z]) )
Vielleicht hat numpy aber selber auch eine Möglichkeit, der float-Falle ( :wink: ) zu umgehen.

Xe
BlackJack

@xeike: Dadurch wäre nichts gewonnen und wie man der „float-Falle” aus dem Weg geht hat Sirius3 schon gezeigt.

@barisoezcan: Zeig doch mal minimalen, lauffähigen Quelltext mit dem man Dein Problem nachvollziehen kann.
Antworten