Dialoge schließen sich erst beim zweiten Mal

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

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
[b][color=red]ascii stupid question,
get stupid ansii[/color][/b]
[url]http://www.hehejo.de[/url]
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

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
hehejo
User
Beiträge: 56
Registriert: Freitag 18. Februar 2005, 18:24
Wohnort: Stein
Kontaktdaten:

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
[b][color=red]ascii stupid question,
get stupid ansii[/color][/b]
[url]http://www.hehejo.de[/url]
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

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
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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
hehejo
User
Beiträge: 56
Registriert: Freitag 18. Februar 2005, 18:24
Wohnort: Stein
Kontaktdaten:

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
[b][color=red]ascii stupid question,
get stupid ansii[/color][/b]
[url]http://www.hehejo.de[/url]
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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
hehejo
User
Beiträge: 56
Registriert: Freitag 18. Februar 2005, 18:24
Wohnort: Stein
Kontaktdaten:

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
[b][color=red]ascii stupid question,
get stupid ansii[/color][/b]
[url]http://www.hehejo.de[/url]
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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
hehejo
User
Beiträge: 56
Registriert: Freitag 18. Februar 2005, 18:24
Wohnort: Stein
Kontaktdaten:

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
[b][color=red]ascii stupid question,
get stupid ansii[/color][/b]
[url]http://www.hehejo.de[/url]
hehejo
User
Beiträge: 56
Registriert: Freitag 18. Februar 2005, 18:24
Wohnort: Stein
Kontaktdaten:

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
[b][color=red]ascii stupid question,
get stupid ansii[/color][/b]
[url]http://www.hehejo.de[/url]
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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
hehejo
User
Beiträge: 56
Registriert: Freitag 18. Februar 2005, 18:24
Wohnort: Stein
Kontaktdaten:

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
[b][color=red]ascii stupid question,
get stupid ansii[/color][/b]
[url]http://www.hehejo.de[/url]
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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
hehejo
User
Beiträge: 56
Registriert: Freitag 18. Februar 2005, 18:24
Wohnort: Stein
Kontaktdaten:

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
[b][color=red]ascii stupid question,
get stupid ansii[/color][/b]
[url]http://www.hehejo.de[/url]
Antworten