Dialoge schließen sich erst beim zweiten Mal

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Benutzeravatar
hehejo
User
Beiträge: 56
Registriert: Freitag 18. Februar 2005, 18:24
Wohnort: Stein
Kontaktdaten:

Dialoge schließen sich erst beim zweiten Mal

Beitragvon hehejo » Samstag 19. Februar 2005, 18:02

Hi, ich hab grad erst mit pyGTK angefangen bin aber total Feuer und Flamme.

Wenn ich jetzt dieses hier schreibe.

Code: Alles auswählen

def a(widget):
  print 'ok pressed'
dlg = gtk.Dialog("hallo")
label = gtk.Label("hiihi")
dlg.vbox.pack_start(label)
label.show()
button = gtk.Button(stock=gtk.STOCK_OK)
button.connect("clicked", a)
dlg.action_area.add(button)
button.show()
dlg.run()

Dann öffnet sich der Dialog und wenn ich auf "OK" klicke, wird auch 'ok pressed' ausgegeben, aber der Dialog lässt sich nicht schließen?

Was muss ich denn machen, damit ich den Dialog nach einem Klick auf 'OK' weghabe?
Gruß, Johannes
ascii stupid question,
get stupid ansii

http://www.hehejo.de
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Beitragvon mawe » Samstag 19. Februar 2005, 20:24

Hi!

Ich bin auch noch PyGtk-Neuling, aber schreib mal unter dlg.run()

Code: Alles auswählen

dlg.destroy()


Gruß, mawe
Benutzeravatar
hehejo
User
Beiträge: 56
Registriert: Freitag 18. Februar 2005, 18:24
Wohnort: Stein
Kontaktdaten:

Beitragvon hehejo » Samstag 19. Februar 2005, 22:22

Code: Alles auswählen

import pygtk
pygtk.require('2.0')
import gtk

def slg():
   dlg = gtk.Dialog("rock mich")
   button = gtk.Button(stock=gtk.STOCK_CLOSE)
   button.connect('clicked', lambda a: dlg.destroy)
   dlg.action_area.add(button)
   button.show()
   dlg.connect("destroy", lambda a: dlg.destroy)
   dlg.run()
   dlg.destroy()

   
slg()

leider hat das wieder nicht den gewünschten Erfolg gebracht.
Das Fenster friert einfach ein!
Gruß, Johannes

ascii stupid question,
get stupid ansii


http://www.hehejo.de
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Beitragvon mawe » Samstag 19. Februar 2005, 22:34

Hi!

Code: Alles auswählen


def slg():
    dlg = gtk.Dialog(title="rock mich",buttons=(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE))
    dlg.run()

slg()

Kürzer und funktioniert :wink:

Gruß, mawe
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Sonntag 20. Februar 2005, 02:54

Und wenn du noch die Antwort brauchst:

Code: Alles auswählen

def slg():
    dlg = gtk.Dialog(title="rock mich",buttons=(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE))
    return dlg.run()

slg()

Dann kannst du gucken, ob die Antwort RESPONSE_CLOSE war oder was anders (hier geht nur das aber vielleicht später mal).
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
hehejo
User
Beiträge: 56
Registriert: Freitag 18. Februar 2005, 18:24
Wohnort: Stein
Kontaktdaten:

Beitragvon hehejo » Sonntag 20. Februar 2005, 11:33

Diese Kurzform ist schön -
aber leider bleibt bei mir der Dialog wieder hängen!
Als Rückgabewert bekomme ich '-7'.
Gruß, Johannes

ascii stupid question,
get stupid ansii


http://www.hehejo.de
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Sonntag 20. Februar 2005, 12:02

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*-

import gtk

def slg():
    dlg = gtk.Dialog("rock mich", None, 0,
            (gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE))
    return dlg.run()

response = slg()
print response == gtk.RESPONSE_CLOSE

Bleibt er so auch hängen?
-7 sollte gtk.REPONSE_CLOSE sein, das ist schon ok so.

Was hast du für ein GTK+ und PyGTK?
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
hehejo
User
Beiträge: 56
Registriert: Freitag 18. Februar 2005, 18:24
Wohnort: Stein
Kontaktdaten:

Beitragvon hehejo » Montag 21. Februar 2005, 12:57

Ich hab das jetzt mal unter Windows getestet.
Mit dem Code bleibt der Button nach dem Drücken "drinnen" und das Fenster friert ein.

ich schreib ja immer

Code: Alles auswählen

import pygtk; pygtk.require("2.0");
import gtk

also denk ich mal, dass ich Version 2.0 drauf habe
aber ich werde das daheim noch nachprüfen.
Gruß, Johannes

ascii stupid question,
get stupid ansii


http://www.hehejo.de
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Montag 21. Februar 2005, 13:31

hehejo hat geschrieben:Ich hab das jetzt mal unter Windows getestet.
Mit dem Code bleibt der Button nach dem Drücken "drinnen" und das Fenster friert ein.

Besorg dir GTK 2.6.2 und PyGTK 2.4.1 auf Python 2.4, damit geht es einwandfrei.

hehejo hat geschrieben:ich schreib ja immer

Code: Alles auswählen

import pygtk; pygtk.require("2.0");
import gtk

also denk ich mal, dass ich Version 2.0 drauf habe
aber ich werde das daheim noch nachprüfen.

Das muss nicht sein: denn PyGTK 2.x wird immer als require("2.0") angesprochen, das würde auch mit PyGTK 2.4.1 und GTK 2.6 gehen. Das ist nur deswegen drin, da die PyGTK 0.6 (GTK 1.x) API anders ist als die PyGTK 2.x API und damit man beide gleichzeitig installiert haben kann und wählen kann, was man nimmt.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
hehejo
User
Beiträge: 56
Registriert: Freitag 18. Februar 2005, 18:24
Wohnort: Stein
Kontaktdaten:

Beitragvon hehejo » Montag 21. Februar 2005, 16:09

Leonidas hat geschrieben:
hehejo hat geschrieben:Ich hab das jetzt mal unter Windows getestet.
Mit dem Code bleibt der Button nach dem Drücken "drinnen" und das Fenster friert ein.

Besorg dir GTK 2.6.2 und PyGTK 2.4.1 auf Python 2.4, damit geht es einwandfrei.

Ich werde heute abend gleich nachsehen, was ich für Versionen auf meinem Rechner habe.
Leonidas hat geschrieben:
hehejo hat geschrieben:ich schreib ja immer

Code: Alles auswählen

import pygtk; pygtk.require("2.0");
import gtk

also denk ich mal, dass ich Version 2.0 drauf habe
aber ich werde das daheim noch nachprüfen.

Das muss nicht sein: denn PyGTK 2.x wird immer als require("2.0") angesprochen, das würde auch mit PyGTK 2.4.1 und GTK 2.6 gehen. Das ist nur deswegen drin, da die PyGTK 0.6 (GTK 1.x) API anders ist als die PyGTK 2.x API und damit man beide gleichzeitig installiert haben kann und wählen kann, was man nimmt.

Und schon wieder etwas gelernt; Danke!
Zuletzt geändert von hehejo am Sonntag 6. März 2005, 19:14, insgesamt 1-mal geändert.
Gruß, Johannes

ascii stupid question,
get stupid ansii


http://www.hehejo.de
Benutzeravatar
hehejo
User
Beiträge: 56
Registriert: Freitag 18. Februar 2005, 18:24
Wohnort: Stein
Kontaktdaten:

Meine Versionen

Beitragvon hehejo » Montag 21. Februar 2005, 18:00

Hallo,
hier meine Versionen

Code: Alles auswählen

pacman -Q python
python 2.4-2
[~] pacman -Q pygtk
pygtk 2.4.1-2
[~] pacman -Q gtk2
gtk2 2.6.1-5
[~] pacman -Q gtk
gtk 1.2.10-4
[~]

gtk habe ich nur zur Vollständigkeit aufgelistet.
[pacman? -> ich nutze ArchLinux]

Hier zuhause bleibt der unten gepostete Code

Code: Alles auswählen

import pygtk    # testweise eingefügt
pygtk.require("2.0")    # testweise eingefügt
import gtk

def slg():
    dlg = gtk.Dialog("rock mich", None, 0,
            (gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE))
    return dlg.run()

response = slg()
print response == gtk.RESPONSE_CLOSE


leider nach Click auf "schließen" auch hängen!
Gruß, Johannes

ascii stupid question,
get stupid ansii


http://www.hehejo.de
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Montag 21. Februar 2005, 18:11

Mhh, schön aktuelle Versionen, das ist schonmal sehr gut.

Zu den Versionen gebe ich dir auch mal einen Quellcode, der hoffentlich durchläuft:

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*-
import pygtk
pygtk.require("2.0")
import gtk

def slg():
    dlg = gtk.Dialog("rock mich", None, 0,
            (gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE))
    chosen = dlg.run()
    dlg.destroy()
    return chosen

response = slg()
print response == gtk.RESPONSE_CLOSE

run() gibt die Auswahl zurück, destroy() sollte den Dialog wegmachen.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
hehejo
User
Beiträge: 56
Registriert: Freitag 18. Februar 2005, 18:24
Wohnort: Stein
Kontaktdaten:

:-(

Beitragvon hehejo » Montag 21. Februar 2005, 18:22

Und wieder muss ich dich enttäuschen.
Nach Klick auf "Schließen" bleibt das Fenster wieder hängen. :x


Als WM nutze ich "openbox" - falls das wichtig sein sollte.
Gruß, Johannes

ascii stupid question,
get stupid ansii


http://www.hehejo.de
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Montag 21. Februar 2005, 18:33

Na dann guck mal bis wie weit dies durchläuft:

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*-
import pygtk
pygtk.require("2.0")
import gtk

def slg():
    print 'called slg'
    dlg = gtk.Dialog("rock mich", None, 0,
            (gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE))
    print 'created dlg'
    chosen = dlg.run()
    print 'run dlg'
    dlg.destroy()
    print 'destroyed dlg'
    return chosen

response = slg()
print 'left slg'
print response == gtk.RESPONSE_CLOSE


Aber keine Angst, wenn Dookie wiederkommt, wird er alles heile machen. Das hat er zumindest immer bei meinen Programmen geschafft.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
hehejo
User
Beiträge: 56
Registriert: Freitag 18. Februar 2005, 18:24
Wohnort: Stein
Kontaktdaten:

An sich perfekt

Beitragvon hehejo » Montag 21. Februar 2005, 19:15

An sich läuft das Programm genau richtig ab:

Code: Alles auswählen

called slg
created dlg
run dlg
destroyed dlg
left slg
True

Aber der Button bleibt gedrückt und das Fenster reagiert nicht mehr.
Auch wenn ich zum Schließen nur das "x" nutze, hängt sich das Programm auf.
Gruß, Johannes

ascii stupid question,
get stupid ansii


http://www.hehejo.de

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder