Dialoge schließen sich erst beim zweiten Mal

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

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

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:

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

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
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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

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
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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

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
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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

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:

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
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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

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
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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

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]
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

Funktioniert das eigentlich?

Code: Alles auswählen

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

def a(widget):
    dlg.destroy()

dlg = gtk.Dialog("hallo")
label = gtk.Label("hii")
dlg.vbox.pack_start(label)
button = gtk.Button(stock=gtk.STOCK_OK)
button.connect("clicked", a)
dlg.action_area.add(button)
dlg.show_all()
dlg.run()
Gruß, mawe
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Nun, ich habe jetzt eigentlich auch keine Ideen mehr:

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'
    dlg.connect("delete_event", delete_event)
    chosen = dlg.run()
    print 'run dlg'
    dlg.destroy()
    dlg.hide()
    print 'destroyed dlg'
    return chosen

def delete_event(dialog, event):
    dialog.hide()

response = slg()
print 'left slg'
print response == gtk.RESPONSE_CLOSE
Habe noch das delete_event eingebaut. Aber ich kann halt dein Problem bei mir aus irgendwelchen Gründen nicht nachvollziehen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
hehejo
User
Beiträge: 56
Registriert: Freitag 18. Februar 2005, 18:24
Wohnort: Stein
Kontaktdaten:

Und wieder nicht.
Aber ich danke die für deine Mühe.
Ich glaub wir haben beide das gleiche Problem:
Wir sehen "perfekten" Code aber hier bei mir will er einfach nicht.

Vll. fällt Dookie ja noch was auf.
--
Aber noch eine Frage zum gtk.Window.
Was sind denn die richitgen "Close"-Funktionen. Bisher habe ich das immer so:

Code: Alles auswählen

import pygtk; pygtk.require("2.0")
import gtk
class Fenster:
  def __init__(self):
    self.__window = gtk.Window(gtk.WINDOW_TOPLEVEL)
    #bitte jetzt die richtigen Varianten zeigen
    self.__window.connect("destroy", lambda widget: gtk.main_quit())
    self.__window.connect("delete_event", lambda widget,event:gtk.main_quit())
   #delete_event sollte doch eigentlich "False" zurückgeben, oder?

    self.__btn_quit = gtk.Button(stock=gtk.STOCK_CLOSE)
    self.__btn_quit.connect("clicked", self.__click)
    self.__window.add(self.__btn_quit)
    self.__btn_quit.show()
    self.__window.show()
    gtk.main()

  def __click(self, widget, event=None, data=None):
    if widget = self.__btn_quit:
      self.__window.hide()
      gtk.main_quit()
Und hier funktioniert das Schließen per Button auch nur, wenn ich
self.__window.hide() ausführe.

Wenn ich "self.__window.hide()" weglasse und statt "self.__btn_quit.connect" "self.__btn_quit.connect_after" nutze, bleibt der Dialog auch hängen..

strange
Gruß, Johannes
[b][color=red]ascii stupid question,
get stupid ansii[/color][/b]
[url]http://www.hehejo.de[/url]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Also bei mir geht schon das:

Code: Alles auswählen

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

class Fenster:
    def __init__(self):
        self.__window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.__window.connect("delete_event", lambda widget,event: gtk.main_quit())

        self.__btn_quit = gtk.Button(stock=gtk.STOCK_CLOSE)
        self.__btn_quit.connect("clicked", self.__click)
        self.__window.add(self.__btn_quit)
        self.__window.show_all()
        gtk.main()

    def __click(self, widget, event=None, data=None):
        if widget == self.__btn_quit:
            gtk.main_quit() 

Fenster()
Also irgendwie ist deine GTK+ Installation seltsam. Vielleicht GTK+2, PyGTK neuinstallieren?

EDIT by mawe: Doppelpost gelöscht
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
hehejo
User
Beiträge: 56
Registriert: Freitag 18. Februar 2005, 18:24
Wohnort: Stein
Kontaktdaten:

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'
    dlg.connect("delete_event", delete_event)
    chosen = dlg.run()
    print 'run dlg'
    dlg.destroy()
    dlg.hide()
    print 'destroyed dlg'
    return chosen

def delete_event(dialog, event):
    dialog.hide()

response = slg()
print 'left slg'
print response == gtk.RESPONSE_CLOSE
bringt nun auch bei mir Folgendes:

Code: Alles auswählen

[tmp] python dialog.py 
called slg
created dlg
run dlg
destroyed dlg
left slg
True
[tmp]
Ich habe nichts neu installiert. Beim Update hat sich meine Version von gtk von

Code: Alles auswählen

[~] pacman -Q gtk2
gtk2 2.6.1-5
auf

Code: Alles auswählen

[~] pacman -Q gtk2
gtk2 2.6.4-1
erhöht!

Ich freu mich![/code]
Gruß, Johannes
[b][color=red]ascii stupid question,
get stupid ansii[/color][/b]
[url]http://www.hehejo.de[/url]
Antworten