Edit detail for NahratiObrazku revision 2 of 1

2
Editor: geon
Time: 2011/10/15 11:30:32 GMT+2
Note: pridavani znacek 2x-3x

changed:
-
<img src="py25.png" align=right>

Výtah z konference

> Ahoj .... mam pygame a porad nechapu nahrani obrazku ze souboru. Poradi mi nekdo jak ho jednoduse nahrat?


PyGame

 Takže to co hledáš, je::

  hrdina = pygame.image.load('hrdina.jpg')

Jen připomínám, ať si dáš pozor na cesty, obrázek by měl ležet ve stejném adresáři nebo musí být s plnou cestou. Obrázek můžeš použít jakýkoliv, nebo si ho stáhnout ze stránky tutoriálu pygame "Posun to":http://geon.wz.cz/pygame/tut/moveit/moveit.html (hlava šelmy)::

  # -*- coding: cp1250 -*-
  
  # import a inicializace
  import pygame, sys
  from pygame.locals import *
  pygame.init()
  
  # nastavení konstant
  REZIM=(640, 480)
  umisteniObrazku=(0,0)

  obrazovka = pygame.display.set_mode(REZIM)
  hrdina = pygame.image.load('hrdina.jpg') #načtení obrázku
  obrazovka.blit(hrdina, umisteniObrazku) # vykreselení na obrazovkku
  
  pokracovat=1
  
  while pokracovat:                 # téměř do nekonečna
     for udalost in pygame.event.get():  # o tomto více v tutoriálu
        if udalost.type ==QUIT:          # ošetření Alt+F4
             pokracovat=0
     pygame.display.update()          # aktualizace obrazovky
     pygame.time.delay(100)           # cekej
  
  
  pygame.quit()
  print "Ted jsi zavrel okno. A to je vse :-)"

Není to moc jednoduché, co? V jiných GUI jde pouhé načtení obrázku daleko jednodušeji. PyGame ale je herní modul, takže následně je zase lehčí ovládat pohyb obrázku a případné střílení (kolize s jinými obrázky),....

[Tkinter]

 Pro názornost přikádám jak by to bylo v Tkinteru::

  import Tkinter
  
  root=Tkinter.Tk()
  
  platno=Tkinter.Canvas()
  platno.pack()
  
  obrazek = Tkinter.PhotoImage(file="hrdina.gif")
  polozka = platno.create_image(100, 100, image=obrazek)
  
  root.mainloop()

Vsimni si, ze jsem predelal jpg na gif, protoze Tkinter bohuzel sám o sobě nepodporuje jpg. Vestavěnou podporu ma pro gif a pgm. Pokud chceš používat i jiné formáty, potřebuješ modul PIL (Image) (nutno stáhnout), což je mimochodem skvělá knihovna na práci s  obrázky (převod mezi formáty a úprava obrázku - třebas u všech obrázků ve složce změníš rozměry nebo hloubku ...). Použití s Tkinterem pak vypadá takto::

  import Tkinter, Image, ImageTk
  
  root=Tkinter.Tk()
  
  platno=Tkinter.Canvas()
  platno.pack()
  
  obrazekRaw = Image.open("hrdina.jpg")
  obrazek = ImageTk.PhotoImage(obrazekRaw)
  polozka = platno.create_image(100, 100, image=obrazek)
  
  root.mainloop()

Python Imaging Library (PIL)

 http://www.pythonware.com/products/pil/ , tak lze obrázek otevřít do programu,
který je v os pro příslušný typ nastaven::

  import Image
  img = Image.open("test.jpg")
  img.show()

[PyGTK]
 
 A takto by to bylo v PyGTK::
  
  import pygtk
  pygtk.require('2.0')
  import gtk

  window = gtk.Window()
  window.set_title("Obrazek")
  window.connect("delete-event", gtk.main_quit)

  image=gtk.Image()
  image.set_from_file("hrdina.jpg")
  window.add(image)

  window.show_all()
  gtk.main()

!PyQt

 ::

  # -*- coding: utf-8 -*-
  
  """ Jednoduchy priklad nahrani obrazku v GUI toolkitu PyQt.
  Funguje jak s http://pythonqt.vanrietpaap.nl/ (Windows)
  tak s http://www.riverbankcomputing.co.uk (Linux)
  
  Qt v soucasnosti podporuje nasledujici formaty:
  PNG, BMP, XBM, XPM a PNM. JPEG, MNG a GIF pomoci podpurnych knihoven pri kompilaci.
  Vice viz dokumentace Qt
  
  Komentare a vyhruzky: petr@yarpen.cz. Ano, je pravdepodobne, ze vas odchyti SpamAssassin.
  Je to milacek.
  """
  
  from qt import *
  # sys je zde potreba pouze k syntatiktickemu predani parametru QApplication
  import sys
  
  class Form(QMainWindow):
      """ Ukazka nacteni obrazku do widgetu na hlavnim okne.
      Konstruktor tridy nastavuje umisteni widgetu v okne. Samotne
      nacteni obrazku provede posledni prikaz. Tohle je pouze
      ukazka, proto zde neni uvedeno zjistovani rozmeru obrazku,
      kontrola nacteni apod. Zde opet odkazuji na skvelou
      dokumentaci Qt (QPixmap.width(), height() apod)."""
      def __init__(self,parent = None,name = None,fl = 0):
          QMainWindow.__init__(self,parent,name,fl)
          formLayout = QGridLayout(self.centralWidget(),1,1,11,6,"formLayout")
          self.pixmapLabel = QLabel(self, "pixmapLabel");
          # velikost okna a widgetu
          self.pixmapLabel.setMinimumSize(800, 600)
          self.setMinimumSize(800, 600)
          formLayout.addWidget(self.pixmapLabel, 0, 0)
          # vlastni nahrani obrazku
          # analogicky lze pouzit
          # setText(QString)
          # setPicture(QPicture)
          # setMovie(QMovie) a setNum()
          self.pixmapLabel.setPixmap(QPixmap('img_2271.jpg'))
  
  
  class FormBackground(QMainWindow):
      """ Predchozi priklad by sel v tomto pripade nahradit
      prostou aplikaci obrazku jako pozadi okna bez dalsich widgetu.
      """
      def __init__(self,parent = None,name = None,fl = 0):
          QMainWindow.__init__(self,parent,name,fl)
          self.setMinimumSize(800, 600)
          self.setPaletteBackgroundPixmap(QPixmap('img_2271.jpg'))
  
  
  """ Zde pouze spustim tzv. event loop """
  a = QApplication(sys.argv)
  w = Form()
  # w = FormBackground()
  a.setMainWidget(w)
  w.show()
  a.exec_loop()

Prosím o doplnění dalších GUI, 

 pokud umíte a chcete a máte čas. Ať můžeme srovnávat.

Výtah z konference

> Ahoj .... mam pygame a porad nechapu nahrani obrazku ze souboru. Poradi mi nekdo jak ho jednoduse nahrat?

PyGame

Takže to co hledáš, je:

  hrdina = pygame.image.load('hrdina.jpg')

Jen připomínám, ať si dáš pozor na cesty, obrázek by měl ležet ve stejném adresáři nebo musí být s plnou cestou. Obrázek můžeš použít jakýkoliv, nebo si ho stáhnout ze stránky tutoriálu pygame Posun to (hlava šelmy):

  # -*- coding: cp1250 -*-

  # import a inicializace
  import pygame, sys
  from pygame.locals import *
  pygame.init()

  # nastavení konstant
  REZIM=(640, 480)
  umisteniObrazku=(0,0)

  obrazovka = pygame.display.set_mode(REZIM)
  hrdina = pygame.image.load('hrdina.jpg') #načtení obrázku
  obrazovka.blit(hrdina, umisteniObrazku) # vykreselení na obrazovkku

  pokracovat=1

  while pokracovat:                 # téměř do nekonečna
     for udalost in pygame.event.get():  # o tomto více v tutoriálu
        if udalost.type ==QUIT:          # ošetření Alt+F4
             pokracovat=0
     pygame.display.update()          # aktualizace obrazovky
     pygame.time.delay(100)           # cekej

  pygame.quit()
  print "Ted jsi zavrel okno. A to je vse :-)"

Není to moc jednoduché, co? V jiných GUI jde pouhé načtení obrázku daleko jednodušeji. PyGame ale je herní modul, takže následně je zase lehčí ovládat pohyb obrázku a případné střílení (kolize s jinými obrázky),....

Tkinter

Pro názornost přikádám jak by to bylo v Tkinteru:

  import Tkinter

  root=Tkinter.Tk()

  platno=Tkinter.Canvas()
  platno.pack()

  obrazek = Tkinter.PhotoImage(file="hrdina.gif")
  polozka = platno.create_image(100, 100, image=obrazek)

  root.mainloop()

Vsimni si, ze jsem predelal jpg na gif, protoze Tkinter bohuzel sám o sobě nepodporuje jpg. Vestavěnou podporu ma pro gif a pgm. Pokud chceš používat i jiné formáty, potřebuješ modul PIL (Image) (nutno stáhnout), což je mimochodem skvělá knihovna na práci s obrázky (převod mezi formáty a úprava obrázku - třebas u všech obrázků ve složce změníš rozměry nebo hloubku ...). Použití s Tkinterem pak vypadá takto:

  import Tkinter, Image, ImageTk

  root=Tkinter.Tk()

  platno=Tkinter.Canvas()
  platno.pack()

  obrazekRaw = Image.open("hrdina.jpg")
  obrazek = ImageTk.PhotoImage(obrazekRaw)
  polozka = platno.create_image(100, 100, image=obrazek)

  root.mainloop()

Python Imaging Library (PIL)

http://www.pythonware.com/products/pil/ , tak lze obrázek otevřít do programu, který je v os pro příslušný typ nastaven:

  import Image
  img = Image.open("test.jpg")
  img.show()

PyGTK

A takto by to bylo v PyGTK:

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

  window = gtk.Window()
  window.set_title("Obrazek")
  window.connect("delete-event", gtk.main_quit)

  image=gtk.Image()
  image.set_from_file("hrdina.jpg")
  window.add(image)

  window.show_all()
  gtk.main()

PyQt

  # -*- coding: utf-8 -*-

  """ Jednoduchy priklad nahrani obrazku v GUI toolkitu PyQt.
  Funguje jak s http://pythonqt.vanrietpaap.nl/ (Windows)
  tak s http://www.riverbankcomputing.co.uk (Linux)

  Qt v soucasnosti podporuje nasledujici formaty:
  PNG, BMP, XBM, XPM a PNM. JPEG, MNG a GIF pomoci podpurnych knihoven pri kompilaci.
  Vice viz dokumentace Qt

  Komentare a vyhruzky: petr@yarpen.cz. Ano, je pravdepodobne, ze vas odchyti SpamAssassin.
  Je to milacek.
  """

  from qt import *
  # sys je zde potreba pouze k syntatiktickemu predani parametru QApplication
  import sys

  class Form(QMainWindow):
      """ Ukazka nacteni obrazku do widgetu na hlavnim okne.
      Konstruktor tridy nastavuje umisteni widgetu v okne. Samotne
      nacteni obrazku provede posledni prikaz. Tohle je pouze
      ukazka, proto zde neni uvedeno zjistovani rozmeru obrazku,
      kontrola nacteni apod. Zde opet odkazuji na skvelou
      dokumentaci Qt (QPixmap.width(), height() apod)."""
      def __init__(self,parent = None,name = None,fl = 0):
          QMainWindow.__init__(self,parent,name,fl)
          formLayout = QGridLayout(self.centralWidget(),1,1,11,6,"formLayout")
          self.pixmapLabel = QLabel(self, "pixmapLabel");
          # velikost okna a widgetu
          self.pixmapLabel.setMinimumSize(800, 600)
          self.setMinimumSize(800, 600)
          formLayout.addWidget(self.pixmapLabel, 0, 0)
          # vlastni nahrani obrazku
          # analogicky lze pouzit
          # setText(QString)
          # setPicture(QPicture)
          # setMovie(QMovie) a setNum()
          self.pixmapLabel.setPixmap(QPixmap('img_2271.jpg'))

  class FormBackground(QMainWindow):
      """ Predchozi priklad by sel v tomto pripade nahradit
      prostou aplikaci obrazku jako pozadi okna bez dalsich widgetu.
      """
      def __init__(self,parent = None,name = None,fl = 0):
          QMainWindow.__init__(self,parent,name,fl)
          self.setMinimumSize(800, 600)
          self.setPaletteBackgroundPixmap(QPixmap('img_2271.jpg'))

  """ Zde pouze spustim tzv. event loop """
  a = QApplication(sys.argv)
  w = Form()
  # w = FormBackground()
  a.setMainWidget(w)
  w.show()
  a.exec_loop()

Prosím o doplnění dalších GUI,

pokud umíte a chcete a máte čas. Ať můžeme srovnávat.