Seite 1 von 1
Dialoge schließen sich erst beim zweiten Mal
Verfasst: Samstag 19. Februar 2005, 18:02
von hehejo
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?
Verfasst: Samstag 19. Februar 2005, 20:24
von mawe
Hi!
Ich bin auch noch PyGtk-Neuling, aber schreib mal unter
dlg.run()
Gruß, mawe
Verfasst: Samstag 19. Februar 2005, 22:22
von hehejo
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!
Verfasst: Samstag 19. Februar 2005, 22:34
von mawe
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
Gruß, mawe
Verfasst: Sonntag 20. Februar 2005, 02:54
von Leonidas
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).
Verfasst: Sonntag 20. Februar 2005, 11:33
von hehejo
Diese Kurzform ist schön -
aber leider bleibt bei mir der Dialog wieder hängen!
Als Rückgabewert bekomme ich '-7'.
Verfasst: Sonntag 20. Februar 2005, 12:02
von Leonidas
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?
Verfasst: Montag 21. Februar 2005, 12:57
von hehejo
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
also denk ich mal, dass ich Version 2.0 drauf habe
aber ich werde das daheim noch nachprüfen.
Verfasst: Montag 21. Februar 2005, 13:31
von Leonidas
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
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.
Verfasst: Montag 21. Februar 2005, 16:09
von hehejo
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
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!
Meine Versionen
Verfasst: Montag 21. Februar 2005, 18:00
von hehejo
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!
Verfasst: Montag 21. Februar 2005, 18:11
von Leonidas
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.
:-(
Verfasst: Montag 21. Februar 2005, 18:22
von hehejo
Und wieder muss ich dich enttäuschen.
Nach Klick auf "Schließen" bleibt das Fenster wieder hängen.
Als WM nutze ich "openbox" - falls das wichtig sein sollte.
Verfasst: Montag 21. Februar 2005, 18:33
von Leonidas
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.
An sich perfekt
Verfasst: Montag 21. Februar 2005, 19:15
von hehejo
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.
Verfasst: Montag 21. Februar 2005, 19:23
von mawe
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
Verfasst: Montag 21. Februar 2005, 19:37
von Leonidas
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.
Verfasst: Montag 21. Februar 2005, 20:20
von hehejo
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
Verfasst: Samstag 26. Februar 2005, 23:43
von Leonidas
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
es funktioniert!
Verfasst: Donnerstag 3. März 2005, 22:58
von hehejo
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
auf
erhöht!
Ich freu mich![/code]