Fórum Ubuntu CZ/SK

Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: marc_ramin 13 Listopadu 2009, 19:16:13

Název: pygtk
Přispěvatel: marc_ramin 13 Listopadu 2009, 19:16:13
cus,

potom co me perl nekolikrat zklamal, jsem se rozhodl zkusit novy scriptovaci jazyk (python =)). nejprve to byl celkem divnej pocit, zadne konce radku, zadne zavorky... no ale tedka uz se mi syntax libi a moc. pote, co jsem se prokousal zaklady a vsechno si tak nejak ohmatal, jsem se vrhnul na knihovnu gtk, se kterou mam jiz dobre zkusenosti z c a perl. opsal jsem prvni kod z tutorialu a chyba!!!
Kód: [Vybrat]
#!/usr/bin/env python

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

class Base:
def __init__(self):
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.show()

def main(self):
gtk.main()

print __name__
if __name__ == "__main__":
base = Base()
base.main()

a po spusteni mi konsole vypise:
Kód: [Vybrat]
gtk
__main__
Traceback (most recent call last):
  File "./base.py", line 17, in <module>
    base = Base()
  File "./base.py", line 9, in __init__
    self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
AttributeError: 'module' object has no attribute 'Window'
progooglil jsem cely svet ale nic co by mi pomohlo jsem nenasel. ma nekdo s necim podobnym zkusenost?
btw testoval jsem na ubuntu 9.10

dik
martin
Název: Re: pygtk
Přispěvatel: marc_ramin 14 Listopadu 2009, 11:55:11
jenom dodatek: gtk jsem bez problemu pouzival v c i perl a cely proklad funguje ve fedore 11
Název: Re: pygtk
Přispěvatel: jhrdka 14 Června 2010, 21:24:09
Ahoj, pochybuju, že je tvůj problém ještě aktuální, kdyby jo, tak doporučuju pročíst referenční příručku pygtk, protože pokud vím, tak se konstruktor gtk.Window dá použít pro tvůj účel i bez parametru, např:

Kód: [Vybrat]
win = gtk.Window()
Název: Re: pygtk
Přispěvatel: petrakis 31 Října 2010, 14:14:58
Mas to malinko komplikovane. zde je spravnej postup. porovnej si zpusob volani gtk.main()

Kód: [Vybrat]
#!/usr/bin/env python

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

class Base:
    def __init__(self):
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.show()

print __name__
if __name__ == "__main__":
    base = Base()
    gtk.main()
Název: Re: pygtk
Přispěvatel: GdH 31 Října 2010, 15:14:33
Mas to malinko komplikovane. zde je spravnej postup. porovnej si zpusob volani gtk.main()

Ne, že by se to nedalo napsat lépe, ale ten problém je jinde. Jediný důvod, proč by uvedený kód nefungoval je ten, že nemá odsazenu definici funkce main a tudíž nepatří do třídy Base. Jenže tato chyba by vyvolala jiné chybové hlášení, než které tazatel uvedl, tudíž tato chyba musela vzniknout až při kopírování kódu do fóra. Chybové hlášení jasně píše, že nenašel třídu gtk.Window a přitom byl gtk importován. Tohle vznikne tehdy, když se importuje špatný modul a v tomto případě je to určitě tím, že si tazatel nejprve zkoušel vytvořit skript s názvem gtk.py, jako většina začátečníků - další oblíbený je pygtk.py. Při importu se nejprve prohledá pracovní adresář a pokud nazvete svůj skript stejným jménem, jako se jmenuje kýžená knihovna, můžete hádat, co se stane. Další průšvih je ten, že se při interpretaci vytvořil bajtkód s názvem gtk.pyc a tak i když tazatel spouštěl skript s názvem base a i kdyby smazal původní gtk.py, zbyde v pracovním adresáři gtk.pyc a ten se bude importovat, místo skutečného gtk. Prasárna což? :)