Seite 1 von 3

Modul für GUI-Programmierung

Verfasst: Sonntag 14. April 2013, 22:21
von barisoezcan
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.

Re: Modul für GUI-Programmierung

Verfasst: Montag 15. April 2013, 13:44
von mutetella
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

Re: Modul für GUI-Programmierung

Verfasst: Montag 15. April 2013, 15:56
von JonnyDamnnox
http://en.wikipedia.org/wiki/PyQt

Damit geht alles.

Gruß

Re: Modul für GUI-Programmierung

Verfasst: Dienstag 16. April 2013, 00:15
von barisoezcan
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?

Re: Modul für GUI-Programmierung

Verfasst: Dienstag 16. April 2013, 00:22
von jerch
@barisoezcan:
Ehm, da fehlt der Kontext. Welchem Darstellungsobjekt welches GUI-Toolkits übergibst Du jetzt diese Daten?

Re: Modul für GUI-Programmierung

Verfasst: Dienstag 16. April 2013, 00:26
von barisoezcan

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()

Re: Modul für GUI-Programmierung

Verfasst: Dienstag 16. April 2013, 07:54
von 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.

Re: Modul für GUI-Programmierung

Verfasst: Dienstag 16. April 2013, 09:58
von barisoezcan
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?

Re: Modul für GUI-Programmierung

Verfasst: Dienstag 16. April 2013, 10:15
von EyDu
Ja.

Re: Modul für GUI-Programmierung

Verfasst: Dienstag 16. April 2013, 18:44
von barisoezcan
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

Re: Modul für GUI-Programmierung

Verfasst: Dienstag 16. April 2013, 19:12
von BlackJack
@barisoezcan: Bist Du sicher dass das Bild nicht ganz einfach so aussieht‽

Re: Modul für GUI-Programmierung

Verfasst: Dienstag 16. April 2013, 19:24
von xeike
Sollten es drei BYTES statt drei ints/floats sein?

Xe

Re: Modul für GUI-Programmierung

Verfasst: Dienstag 16. April 2013, 19:29
von barisoezcan
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

Re: Modul für GUI-Programmierung

Verfasst: Dienstag 16. April 2013, 19:54
von barisoezcan
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? :?

Re: Modul für GUI-Programmierung

Verfasst: Dienstag 16. April 2013, 20:13
von xeike
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

Re: Modul für GUI-Programmierung

Verfasst: Dienstag 16. April 2013, 20:34
von barisoezcan
@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)

Re: Modul für GUI-Programmierung

Verfasst: Dienstag 16. April 2013, 20:35
von Sirius3
@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)

Re: Modul für GUI-Programmierung

Verfasst: Dienstag 16. April 2013, 20:41
von barisoezcan
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:

Re: Modul für GUI-Programmierung

Verfasst: Dienstag 16. April 2013, 20:58
von xeike
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

Re: Modul für GUI-Programmierung

Verfasst: Dienstag 16. April 2013, 21:10
von 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.