[Python]Laadt geen gtk window

Pagina: 1
Acties:

  • mithras
  • Registratie: Maart 2003
  • Niet online
Ik ben net begonnen aan het leren van Python, en heb met Glade een interface in elkaar gestoken, zoals ook staat beschreven in dit blog artikel. Ik heb eerst zelf een python scriptje proberen te maken, maar toen dat niet lukte heb ik de tutorial exact gevolgd, maar nog steeds werkt het niet.
Wat werkt er niet? Nou, ik doe dit in mn terminal:
jurian@karlijn:~/Documents/Python/Test$ python test.py
Maar dan gebeurt er helemaal niets. Ik zie dus geen venster verschijnen, terwijl er wel in mn script een venster gemaakt moet worden. Mijn glade file ziet er zo uit (gemaakt met Glade3 uit de Ubuntu repository's):
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
<!--Generated with glade3 3.0.2 on Sun Oct 22 20:51:59 2006 by jurian@karlijn-->
<glade-interface>
  <widget class="GtkWindow" id="MainWindow">
    <property name="title" translatable="yes">Hello World.... Again!</property>
    <child>
      <widget class="GtkVBox" id="vbox1">
        <property name="visible">True</property>
        <child>
          <widget class="GtkLabel" id="label1">
            <property name="visible">True</property>
            <property name="label" translatable="yes">Please click on the button!</property>
          </widget>
        </child>
        <child>
          <widget class="GtkButton" id="btnHelloWorld">
            <property name="visible">True</property>
            <property name="label" translatable="yes">Click me!</property>
            <signal name="clicked" handler="on_btnHelloWorld_clicked"/>
          </widget>
          <packing>
            <property name="position">1</property>
          </packing>
        </child>
      </widget>
    </child>
  </widget>
</glade-interface>
En dit is mijn python bestandje:
Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/usr/bin/env python

import sys
try:
    import pygtk
    pygtk.require("2.0")
except:
    pass
try:
    import gtk
    import gtk.glade
except:
    sys.exit(1)

class HellowWorldGTK:
    """This is an Hello World GTK application"""

    def __init__(self):
        #Set the Glade file
        self.gladefile = "pyhelloworld.glade"  
        self.wTree = gtk.glade.XML(self.gladefile) 
        
        #Create our dictionay and connect it
        dic = { "on_btnHelloWorld_clicked" : self.btnHelloWorld_clicked,
            "on_MainWindow_destroy" : gtk.main_quit }
        self.wTree.signal_autoconnect(dic)

    def btnHelloWorld_clicked(self, widget):
        print "Hello World!"

if __name__ == "__main__":
    hwg = HellowWorldGTK()
    gtk.main()
Als ik wat debug messages binnen de __init__ van de klasse zet, worden deze allemaal netjes geprint. Ook als ik tussen regel 33 en 34 python iets laat roepen, gaat dat ook goed. Echter blijft python hangen op gtk.main().

Help!? Hoe kan dit, want als ik code letterlijk kopieer van tutorials en howto's, werkt het allemaal niet. Waarschijnlijk zie ik gewoon iets heel stoms over het hoofd, maar hopelijk zien jullie dat.

Ter informatie: verschillende programma's die op python+gtk (met glade files) gebaseerd zijn werken wél (Deluge bijvoorbeeld). Het kan er dus niet aan liggen dat ik een pakketje mis.

  • Daspeed
  • Registratie: Maart 2001
  • Laatst online: 23:17
Ik ben niet zo thuis in python in combinatie met GTK, maar ik weet wel dat je huidige try/catches niet zo veel informatie zullen laten zien in het geval van een exceptie. Dus die zou je weg kunnen halen om te kijken of zich daar misschien een probleem voor doet.

  • mithras
  • Registratie: Maart 2003
  • Niet online
DrClearbottom schreef op zondag 22 oktober 2006 @ 21:15:
Ik ben niet zo thuis in python in combinatie met GTK, maar ik weet wel dat je huidige try/catches niet zo veel informatie zullen laten zien in het geval van een exceptie. Dus die zou je weg kunnen halen om te kijken of zich daar misschien een probleem voor doet.
Die tries zijn nodig om gtk elementen te kunnen bouwen en het glade xml bestand te kunnen lezen. Als ik die weghaal begint python te zeuren dat gtk niet bestaat, dat de global variabele niet bestaat etc.
Wat ik heb afgekeken van broncode van anderen, is dat die regels ook (exact zo) zijn opgenomen in hun scriptje. Verder wordt gtk.main() daar ook gebruikt. En díe programma's werken wel bij mij ;(

  • Daspeed
  • Registratie: Maart 2001
  • Laatst online: 23:17
Een try/except zorgt niet dat iets lukt, maar zorgt ervoor dat je een fout kunt afhandelen die binnen de try/except optreedt. in try/except #1 vang je de fout af en laat je hem niet zien en bij #2 sluit je het programma. Kortom ik zou er toch maar even naar kijken.

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 10-02 17:10

Gerco

Professional Newbie

Mithras86 schreef op zondag 22 oktober 2006 @ 21:22:
Die tries zijn nodig om gtk elementen te kunnen bouwen en het glade xml bestand te kunnen lezen. Als ik die weghaal begint python te zeuren dat gtk niet bestaat
Dan kan Python dus Gtk niet vinden. Door er een try omheen te zetten negeer je de foutmelding, maar de fout blijft zich gewoon voordoen. Installeer dus PyGTK (opnieuw) en dan zal het waarschijnlijk prima werken.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • mithras
  • Registratie: Maart 2003
  • Niet online
DrClearbottom schreef op zondag 22 oktober 2006 @ 21:43:
Een try/except zorgt niet dat iets lukt, maar zorgt ervoor dat je een fout kunt afhandelen die binnen de try/except optreedt. in try/except #1 vang je de fout af en laat je hem niet zien en bij #2 sluit je het programma. Kortom ik zou er toch maar even naar kijken.
Ah, oke. Niet dat ik je wil tegenspreken, ik ben wel hardleers :p Als ik er dit van maak:
Python:
1
2
3
4
5
6
7
8
9
10
11
12
try:
    import pygtk
    pygtk.require("2.0")
except:
    print "Niet geslaagd1"
    pass
try:
    import gtk
    import gtk.glade
except:
    print "Niet geslaagd2"
    sys.exit(1)
Dan krijg ik geen print message te zien.
Verder (ik zei dat ik hardleers was :p) is dit overgenomen zowel uit verschillende tutorials, als uit bestaande, werkende programma's, dus nam (en neem) ik aan dat dit in principe wel goed moet zijn.

Als jij zegt dat ik het anders moet oplossen, wil ik het graag proberen, maar wat bedoel je precies met
Kortom ik zou er toch maar even naar kijken.
Ik zou namelijk niet weten "hoe ik hier naar kan kijken".

Maar wel bedankt natuurlijk :>
Gerco schreef op zondag 22 oktober 2006 @ 21:48:
[...]


Dan kan Python dus Gtk niet vinden. Door er een try omheen te zetten negeer je de foutmelding, maar de fout blijft zich gewoon voordoen. Installeer dus PyGTK (opnieuw) en dan zal het waarschijnlijk prima werken.
Bedankt voor je reactie, maar na herinstallatie van python-gnome2, python-gnome2-extras & python-gtk2 blijf ik met dezelfde rare fout zitten.

Ik heb trouwens de map met het glade bestand en python script online gezet, en is hier te downloaden.

[ Voor 20% gewijzigd door mithras op 22-10-2006 21:59 ]


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 15:05

Robtimus

me Robtimus no like you

Ik heb even in mijn PyGTK code (zonder Glade) van een tijd geleden gekeken, en daar zit de volgende regel:
Python:
1
self.window.show()
Beter nog is show_all() trouwens, die roept show aan voor alle widgets die in je window zitten.

Zonder dit blijft je window mooi invisible, en dat is precies wat er gebeurt: je GUI draait wel (gtk.main()) maar is hidden.

Ik weet niet hoe je aan een reference van je window komt, maar volgens mij zou dit je probleem oplossen.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Daspeed
  • Registratie: Maart 2001
  • Laatst online: 23:17
Met hier naar kijken bedoelde ik idd print statements plaatsen. Een lege except is vooral tijdens het debuggen niet echt aan te raden.

Overigens dat je de code uit tutorials hebt gehaald is nog steeds geen garantie dat het werkt. Buiten code heb je namelijk nog meer zooi waarvan je afhankelijk bent: externe libs, verschillende versies van libs/python, etc.

  • Mr_gadget
  • Registratie: Juni 2004
  • Laatst online: 21:57

Mr_gadget

C8H10N4O2 powered

welke IDE gebruik je hiervoor eigenlijk?

offtopic: geef je je huiscomputers nu ook al vrouwennamen? :D

  • mithras
  • Registratie: Maart 2003
  • Niet online
IceManX schreef op zondag 22 oktober 2006 @ 22:02:
Ik heb even in mijn PyGTK code (zonder Glade) van een tijd geleden gekeken, en daar zit de volgende regel:
Python:
1
self.window.show()
Beter nog is show_all() trouwens, die roept show aan voor alle widgets die in je window zitten.

Zonder dit blijft je window mooi invisible, en dat is precies wat er gebeurt: je GUI draait wel (gtk.main()) maar is hidden.

Ik weet niet hoe je aan een reference van je window komt, maar volgens mij zou dit je probleem oplossen.
d:)b Die combi deed het! Ik had ergens anders al dit gezien:
code:
1
self.window = self.wTree.get_widget("MainWindow")
Dat had ik vervolgens gedaan, maar dat werkte dus mooi niet. Nu met jouw code erbij werkt het wel:
code:
1
2
self.window = self.wTree.get_widget("MainWindow")
self.window.show()
_/-\o_
Mr_gadget schreef op zondag 22 oktober 2006 @ 22:08:
welke IDE gebruik je hiervoor eigenlijk?
Glade
offtopic: geef je je huiscomputers nu ook al vrouwennamen? :D
offtopic:
Ja, en ze beginnen allemaal met een K: Karlijn, Karoline, Karlotte 7(8)7

  • mithras
  • Registratie: Maart 2003
  • Niet online
--> [Python]Password naar terminal zenden

[ Voor 111% gewijzigd door mithras op 23-10-2006 19:56 ]

Pagina: 1