anderes Fenster mit gtk anzeigen

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
NOTZE
User
Beiträge: 106
Registriert: Mittwoch 21. Januar 2004, 20:28

Montag 14. Juni 2004, 15:47

Hi,

ich habe ein gtk Projekt mit glade erstellt und ein fileselection fenster hinzugefügt.
Ich will nun dass diese Fenster durch einen klick auf "öffnen" aufgeht.
Ich habe nun ein Problem damit das Fenster anzeigen zu lassen.
Ich habe es schon mit:

Code: Alles auswählen

self.foo.show()
versucht.
Aber dabei wird das andere Fenster geschlossen und der Fileseletor wird auch nicht angezeigt.
Ich hoffe ihr könnt mir helfen.

mfg NOTZE
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Dienstag 15. Juni 2004, 22:29

Hallo!

Ich habe mal ein kleines Beispiel zusammengestrickt. Es öffnet einen normalen Dialog und zeigt an, welcher Button geklickt wurde. Vieleicht hilft es dir ja weiter.

gladetest.glade

Code: Alles auswählen

<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">

<glade-interface>

<widget class="GtkWindow" id="window1">
  <property name="border_width">10</property>
  <property name="title" translatable="yes">window1</property>
  <property name="type">GTK_WINDOW_TOPLEVEL</property>
  <property name="window_position">GTK_WIN_POS_CENTER</property>
  <property name="modal">False</property>
  <property name="resizable">True</property>
  <property name="destroy_with_parent">False</property>
  <property name="decorated">True</property>
  <property name="skip_taskbar_hint">False</property>
  <property name="skip_pager_hint">False</property>
  <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
  <signal name="destroy" handler="on_window1_destroy" last_modification_time="Tue, 15 Jun 2004 20:53:18 GMT"/>

  <child>
    <widget class="GtkButton" id="button1">
      <property name="visible">True</property>
      <property name="can_focus">True</property>
      <property name="label" translatable="yes">button1</property>
      <property name="use_underline">True</property>
      <property name="relief">GTK_RELIEF_NORMAL</property>
      <property name="focus_on_click">True</property>
      <signal name="clicked" handler="on_button1_clicked" last_modification_time="Tue, 15 Jun 2004 20:38:04 GMT"/>
    </widget>
  </child>
</widget>

<widget class="GtkDialog" id="dialog1">
  <property name="title" translatable="yes">dialog1</property>
  <property name="type">GTK_WINDOW_TOPLEVEL</property>
  <property name="window_position">GTK_WIN_POS_CENTER_ON_PARENT</property>
  <property name="modal">True</property>
  <property name="resizable">True</property>
  <property name="destroy_with_parent">False</property>
  <property name="decorated">True</property>
  <property name="skip_taskbar_hint">False</property>
  <property name="skip_pager_hint">False</property>
  <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
  <property name="has_separator">True</property>
  <signal name="response" handler="on_dialog1_response" last_modification_time="Tue, 15 Jun 2004 21:00:13 GMT"/>

  <child internal-child="vbox">
    <widget class="GtkVBox" id="dialog-vbox1">
      <property name="visible">True</property>
      <property name="homogeneous">False</property>
      <property name="spacing">0</property>

      <child internal-child="action_area">
	<widget class="GtkHButtonBox" id="dialog-action_area1">
	  <property name="visible">True</property>
	  <property name="layout_style">GTK_BUTTONBOX_END</property>

	  <child>
	    <widget class="GtkButton" id="cancelbutton1">
	      <property name="visible">True</property>
	      <property name="can_default">True</property>
	      <property name="can_focus">True</property>
	      <property name="label">gtk-cancel</property>
	      <property name="use_stock">True</property>
	      <property name="relief">GTK_RELIEF_NORMAL</property>
	      <property name="focus_on_click">True</property>
	      <property name="response_id">-6</property>
	    </widget>
	  </child>

	  <child>
	    <widget class="GtkButton" id="applybutton1">
	      <property name="visible">True</property>
	      <property name="can_default">True</property>
	      <property name="can_focus">True</property>
	      <property name="label">gtk-apply</property>
	      <property name="use_stock">True</property>
	      <property name="relief">GTK_RELIEF_NORMAL</property>
	      <property name="focus_on_click">True</property>
	      <property name="response_id">-10</property>
	    </widget>
	  </child>

	  <child>
	    <widget class="GtkButton" id="okbutton1">
	      <property name="visible">True</property>
	      <property name="can_default">True</property>
	      <property name="can_focus">True</property>
	      <property name="label">gtk-ok</property>
	      <property name="use_stock">True</property>
	      <property name="relief">GTK_RELIEF_NORMAL</property>
	      <property name="focus_on_click">True</property>
	      <property name="response_id">-5</property>
	    </widget>
	  </child>
	</widget>
	<packing>
	  <property name="padding">0</property>
	  <property name="expand">False</property>
	  <property name="fill">True</property>
	  <property name="pack_type">GTK_PACK_END</property>
	</packing>
      </child>

      <child>
	<widget class="GtkLabel" id="label5">
	  <property name="visible">True</property>
	  <property name="label" translatable="yes">Hier koennte
der Meldungstext stehen</property>
	  <property name="use_underline">False</property>
	  <property name="use_markup">False</property>
	  <property name="justify">GTK_JUSTIFY_CENTER</property>
	  <property name="wrap">False</property>
	  <property name="selectable">False</property>
	  <property name="xalign">0.5</property>
	  <property name="yalign">0.5</property>
	  <property name="xpad">10</property>
	  <property name="ypad">10</property>
	</widget>
	<packing>
	  <property name="padding">0</property>
	  <property name="expand">True</property>
	  <property name="fill">True</property>
	</packing>
      </child>
    </widget>
  </child>
</widget>

</glade-interface>
gladetest.py

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

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


class Dialog1(object):

    def on_dialog1_response(self, widget, data = None):
        self.window.destroy()
        print data
        if data == gtk.RESPONSE_OK:
            print "OK"
        elif data == gtk.RESPONSE_APPLY:
            print "Apply"
        elif data == gtk.RESPONSE_CANCEL:
            print "Cancel"

    def __init__(self, parent = None):
        self.wTree = gtk.glade.XML("gladetest.glade", "dialog1")
        self.window = self.wTree.get_widget("dialog1")

        dic = {}
        for key in dir(self.__class__):
            dic[key] = getattr(self, key)
        self.wTree.signal_autoconnect(dic)

        if parent:
            self.window.set_transient_for(parent)

        self.window.show()


class Window1(object):

    def on_button1_clicked(self, widget, data = None):
        diag = Dialog1(self.window)

    def on_window1_destroy(self, widget, data = None):
        gtk.main_quit()

    def __init__(self):
        self.wTree = gtk.glade.XML("gladetest.glade", "window1")
        self.window = self.wTree.get_widget("window1")

        dic = {}
        for key in dir(self.__class__):
            dic[key] = getattr(self, key)
        self.wTree.signal_autoconnect(dic)

        self.window.show()


def main():
    win1 = Window1()
    gtk.main()
    return 0


if __name__ == "__main__":
    main()
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
NOTZE
User
Beiträge: 106
Registriert: Mittwoch 21. Januar 2004, 20:28

Mittwoch 16. Juni 2004, 13:18

Danke das hat mir sehr geholfen.
Aber wie kriege ich bei einem fileselection heraus welches file gewhält wurde,
Ich kann das Entry irgendwie nicht ansteuern
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Mittwoch 16. Juni 2004, 14:38

Hallo!

Und hier ein Beispiel mit dem FileSelection-Widget. :)
Vorsicht: der "gtk.FileChooserDialog" funktioniert erste ab GTK2.4.

gladetest2.glade

Code: Alles auswählen

<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">

<glade-interface>

<widget class="GtkWindow" id="window1">
  <property name="border_width">10</property>
  <property name="title" translatable="yes">window1</property>
  <property name="type">GTK_WINDOW_TOPLEVEL</property>
  <property name="window_position">GTK_WIN_POS_CENTER</property>
  <property name="modal">False</property>
  <property name="resizable">True</property>
  <property name="destroy_with_parent">False</property>
  <property name="decorated">True</property>
  <property name="skip_taskbar_hint">False</property>
  <property name="skip_pager_hint">False</property>
  <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
  <signal name="destroy" handler="on_window1_destroy" last_modification_time="Tue, 15 Jun 2004 20:53:18 GMT"/>

  <child>
    <widget class="GtkButton" id="button1">
      <property name="visible">True</property>
      <property name="can_focus">True</property>
      <property name="label" translatable="yes">button1</property>
      <property name="use_underline">True</property>
      <property name="relief">GTK_RELIEF_NORMAL</property>
      <property name="focus_on_click">True</property>
      <signal name="clicked" handler="on_button1_clicked" last_modification_time="Tue, 15 Jun 2004 20:38:04 GMT"/>
    </widget>
  </child>
</widget>

<widget class="GtkFileSelection" id="fileselection1">
  <property name="border_width">10</property>
  <property name="title" translatable="yes">Select File</property>
  <property name="type">GTK_WINDOW_TOPLEVEL</property>
  <property name="window_position">GTK_WIN_POS_CENTER_ON_PARENT</property>
  <property name="modal">True</property>
  <property name="resizable">True</property>
  <property name="destroy_with_parent">False</property>
  <property name="decorated">True</property>
  <property name="skip_taskbar_hint">False</property>
  <property name="skip_pager_hint">False</property>
  <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
  <property name="show_fileops">True</property>
  <signal name="response" handler="on_fileselection1_response" last_modification_time="Wed, 16 Jun 2004 13:27:46 GMT"/>

  <child internal-child="cancel_button">
    <widget class="GtkButton" id="cancel_button1">
      <property name="visible">True</property>
      <property name="can_default">True</property>
      <property name="can_focus">True</property>
      <property name="relief">GTK_RELIEF_NORMAL</property>
      <property name="focus_on_click">True</property>
    </widget>
  </child>

  <child internal-child="ok_button">
    <widget class="GtkButton" id="ok_button1">
      <property name="visible">True</property>
      <property name="can_default">True</property>
      <property name="can_focus">True</property>
      <property name="relief">GTK_RELIEF_NORMAL</property>
      <property name="focus_on_click">True</property>
    </widget>
  </child>
</widget>

</glade-interface>
gladetest2.py

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

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


class Dialog1(object):

    def on_fileselection1_response(self, widget, data = None):
        if data == gtk.RESPONSE_OK:
            print "Dateiauswahl:", widget.get_filename()
        else:
            print "Abbruch"

        self.window.destroy()

    def __init__(self, parent = None):
        self.wTree = gtk.glade.XML("gladetest2.glade", "fileselection1")
        self.window = self.wTree.get_widget("fileselection1")

        dic = {}
        for key in dir(self.__class__):
            dic[key] = getattr(self, key)
        self.wTree.signal_autoconnect(dic)

        if parent:
            self.window.set_transient_for(parent)

        self.window.show()


class Window1(object):
    def on_button1_clicked(self, widget, data = None):
        diag = Dialog1(self.window)

    def on_window1_destroy(self, widget, data = None):
        gtk.main_quit()

    def __init__(self):
        self.wTree = gtk.glade.XML("gladetest2.glade", "window1")
        self.window = self.wTree.get_widget("window1")

        dic = {}
        for key in dir(self.__class__):
            dic[key] = getattr(self, key)
        self.wTree.signal_autoconnect(dic)

        self.window.show()


def main():
    win1 = Window1()
    gtk.main()
    return 0


if __name__ == "__main__":
    main()
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
NOTZE
User
Beiträge: 106
Registriert: Mittwoch 21. Januar 2004, 20:28

Mittwoch 16. Juni 2004, 14:52

Ah danke für die hilfe das hat mir seh geholfen :) :)

€dit:
Ich habe jetzt:

Code: Alles auswählen

		 fselect = FileSelector(self.window) 
		 self.fopen(fselect.file)
Wie schaffe ich ess dass self.fopen erst ausgeführt wird wenn eine datei ausgewählt wird?
Muss ich da ne while schleife machen oder gibt es ne bessere lösung?
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Mittwoch 16. Juni 2004, 20:42

Hi NOTZE,

Code: Alles auswählen

       fselect = FileSelector(self.window)
       if fselect.file: # eventuell wenn zum lesen mit os.path.exists(fselect.file) testen
           self.fopen(fselect.file)
           ...

Gruß

Dookie
NOTZE
User
Beiträge: 106
Registriert: Mittwoch 21. Januar 2004, 20:28

Donnerstag 17. Juni 2004, 12:23

Die idee ist sehr gut doch irgendwie hapert es bei mir bei der Umsetzung:
In der Fileselector klasse habe ich folgende methode:

Code: Alles auswählen

	def getFile(self, widget):
		self.file = self.window.get_filename()
		print self.file
		self.window.destroy()
un in der methode die die fopen methode ausgibt habe ich folgendes stehen:

Code: Alles auswählen

	def getFile(self, widget):
		fselect = FileSelector(self.window) 
		
		print fselect.file
		if fselect.file != "":				
			self.fopen(fselect.file) 
print fselect.file wird immer zuerst ausgeführt.
Ich wüsste nicht wie ich die sache handlen soll.
Man könnte den umweg über eine globale variable nehmen aber
ich finde dass unschön.
Gibt es nicht eine bessere Variante?
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Donnerstag 17. Juni 2004, 12:58

Hi NOTZE,
print fselect.file wird immer zuerst ausgeführt.
Ich wüsste nicht wie ich die sache handlen soll.
Man könnte den umweg über eine globale variable nehmen aber
ich finde dass unschön.
Gibt es nicht eine bessere Variante?
das versteh ich jetzt nicht so ganz???


Gruß

Dookie
NOTZE
User
Beiträge: 106
Registriert: Mittwoch 21. Januar 2004, 20:28

Donnerstag 17. Juni 2004, 14:00

Also ich habe diese beiden prints reingebracht um halt auf fehler zu überprüfen.
Als erstes Print wird immer dass in der 2 methode aufgerufen.
Aber die variable fselect.file ist dann immer noch leer.
Und dann wird das print aus der ersten methode aufgerufen.
Jetzt besser verstanden?
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Donnerstag 17. Juni 2004, 15:14

wundert mich, daß das print aus der ersten Methode überhaupt aufgerufen wird getFile von fselect wird ja auch bei der 2. Methode nicht aufgerufen.

Code: Alles auswählen

   def getFile(self, widget):
      fselect = FileSelector(self.window)
      fselect.getFile(None) # widget wird eh ned verwendet oder?
      print fselect.file
      if fselect.file != "":            
         self.fopen(fselect.file)
Gruß

Dookie
NOTZE
User
Beiträge: 106
Registriert: Mittwoch 21. Januar 2004, 20:28

Donnerstag 17. Juni 2004, 16:35

Dookie hat geschrieben:wundert mich, daß das print aus der ersten Methode überhaupt aufgerufen wird getFile von fselect wird ja auch bei der 2. Methode nicht aufgerufen.

Code: Alles auswählen

   def getFile(self, widget):
      fselect = FileSelector(self.window)
      fselect.getFile(None) # widget wird eh ned verwendet oder?
      print fselect.file
      if fselect.file != "":            
         self.fopen(fselect.file)
Gruß

Dookie
Also wenn ich None eingebe wird bei fselect.getFile einfach nur das verzeichnis als fselect.file genommen.
Das Window wird sofort zerstört ohne dass der User auswählen kann.
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Donnerstag 17. Juni 2004, 16:38

naja, ich weiss ja nicht, was deine Klassen sonst noch so aufführen da Du ja nur Ausschnitte presentierst.


Gruß

Dookie
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Donnerstag 17. Juni 2004, 18:22

Hallo!

Der Befehl run() löst wahrscheinlich dein Problem.

Hier habe ich mal ein Modul, welches den FileSelect-Dialog anzeigt und die ausgewählte Datei zurück gibt. :wink:

Code: Alles auswählen

# !/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
******************************************************************************
* Description:  Zugriff auf den GTK-FileSelection-Dialog
*               (Öffnen, Speichern)
* Version:      0.2 (noch nicht ausgereift)
* Copyright:    2004 by Gerold Penz - gerold.penz(at)aon.at
* Created:      2004-06-17 by Gerold
* Modified:     2004-06-17 by Gerold
* License:      free
* Requirements: Python2.3:  http://www.python.org
*               GTK+ 2.0:   http://www.gtk.org
*               pyGtk:      http://www.pygtk.org/downloads.html
******************************************************************************
"""

def gtk_select_file(str_title = None, str_basepath = None, wid_parent = None):
    """
    Zeigt den FileSelection-Dialog an und wartet bis dieser geschlossen wird.
    Gibt bei Abbruch "", und bei Auswahl den Pfad und Dateinamen zurück.
    
    Parameter: str_titel =     Fenstertitel
               str_basepath =  Basispfad
               wid_parent =    Widget, über welchem der Dialog
                               modal angezeigt wird
    """

    import gtk
    
    #FileSelection laden
    window = gtk.FileSelection(title = str_title)

    #Basispfad angeben
    if str_basepath:
        window.set_filename(str_basepath)

    #Falls ein Parent-Fenster zugewiesen wurde --> setzen
    if wid_parent:
        window.set_modal(gtk.TRUE)
        window.set_transient_for(wid_parent)
        window.set_position(gtk.IN_POS_CENTER_ON_PARENT)
    else:
        window.set_position(gtk.WIN_POS_CENTER)
        
    #Anzeigen
    if window.run() == gtk.RESPONSE_OK:
        file = window.get_filename()
    else:
        file = ""

    #Fenster zerstören
    window.destroy()
    
    #Rückgabe
    return file
    
    
def main():
    """Test des Dateidialogs"""

    #Dialog anzeigen
    file = gtk_select_file("Nudlaugen leben länger")

    #Rückgabe auswerten
    if file:
        print "Datei: ", file
    else:
        print "Abbruch"

    #Pause
    raw_input("Press Enter")
    
    
if __name__ == "__main__":
    main()
Vieleicht hilft dir das weiter.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
NOTZE
User
Beiträge: 106
Registriert: Mittwoch 21. Januar 2004, 20:28

Donnerstag 17. Juni 2004, 18:57

Vielen danke Gerold.
Das mit run() hats gebraucht :)
Antworten