[Python] Zmienne globalne

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
dhpasta
Piegowaty Guziec
Piegowaty Guziec
Posty: 26
Rejestracja: 18 sie 2011, 21:30
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

[Python] Zmienne globalne

Post autor: dhpasta »

Wymarzyło mi się GUI do mdf2iso z konsoli.
Mam taki kod:

Kod: Zaznacz cały

#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtCore, QtGui
from edytor import Ui_mdf2iso_gui
from subprocess import call


class StartQT4(QtGui.QMainWindow):
	def __init__(self, parent=None):
		QtGui.QWidget.__init__(self, parent)
		self.ui = Ui_mdf2iso_gui()
		self.ui.setupUi(self)
		# tutaj dajemy wlasne polaczenia slotow
		QtCore.QObject.connect(self.ui.zrodlo,QtCore.SIGNAL("clicked()"), self.file_dialog)
		QtCore.QObject.connect(self.ui.wynik,QtCore.SIGNAL("clicked()"), self.file_dialog2)
		QtCore.QObject.connect(self.ui.konwertuj,QtCore.SIGNAL("clicked()"), self.file_dialog3)
		
	def file_dialog(self):
		fd = QtGui.QFileDialog(self)
		self.filename = fd.getOpenFileName()
				
	def file_dialog2(self):
		df = QtGui.QFileDialog(self)
		self.filename2 = df.getOpenFileName()
		
	
	def file_dialog3(self):
			call(["mdf2iso", fd])		
		

if __name__ == "__main__":
	app = QtGui.QApplication(sys.argv)
	myapp = StartQT4()
	myapp.show()
	sys.exit(app.exec_())
W interfejsie są 3 guziki:
zrodlo - pobiera adres pliku do konwertowania
wynik - wybiera folder gdzie ma być plik wynikowy (tutaj muszę jeszcze znaleźć jak pobierać ścieżkę folderu, a nie pliku)
konwertuj - który uruchamia polecenie w konsoli

I w tym poleceniu mam dwie zmienne fd i df.
Musze je nazwać, czy opisać jako globalne, bo terminal zwraca:

Kod: Zaznacz cały

Traceback (most recent call last):
  File "notes.py", line 30, in file_dialog3
    call(["mdf2iso", fd])		
NameError: global name 'fd' is not defined
Ale jak i gdzie?

Znalazłem w dokumentacji polecenie global, ale no nie potrafię się nim obsłużyć...
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: [Python] Zmienne globalne

Post autor: ethanak »

Przykład użycia (chyba lepszy niż teoretyzowanie):

Kod: Zaznacz cały

def hortensja():
  global n
  n=7

def main():
  global n
  n=11
  hortensja()
  print n

main()

dhpasta
Piegowaty Guziec
Piegowaty Guziec
Posty: 26
Rejestracja: 18 sie 2011, 21:30
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Re: [Python] Zmienne globalne

Post autor: dhpasta »

No to teraz woła o stringi w argumentach class...

Kod: Zaznacz cały

Traceback (most recent call last):
  File "notes.py", line 31, in file_dialog3
    call(["mdf2iso", fd, df])	
  File "/usr/lib/python2.7/subprocess.py", line 486, in call
    return Popen(*popenargs, **kwargs).wait()
  File "/usr/lib/python2.7/subprocess.py", line 672, in __init__
    errread, errwrite)
  File "/usr/lib/python2.7/subprocess.py", line 1213, in _execute_child
    raise child_exception
TypeError: execv() arg 2 must contain only strings
Szukałem tego w dokumentacji, ale nic z tego nie rozumiem... Musze zaznaczyć że nie miałem nigdy styczności z takim programowaniem
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: [Python] Zmienne globalne

Post autor: ethanak »

wrzuć gdzieś kod (cały!) tego twojego arcydzieła :) Z chęcią pomogę, ale wróżyć z tracebacka mnie jeszcze nie nauczyli :( Domyślam się gdzie masz błąd, ale bez kodu nic nie zrobię.
Przy okazji - zrozumiałeś jak działają zmienne globalne?
dhpasta
Piegowaty Guziec
Piegowaty Guziec
Posty: 26
Rejestracja: 18 sie 2011, 21:30
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Re: [Python] Zmienne globalne

Post autor: dhpasta »

Myślę, że zrozumiałem. Jeśli ustawimy ją w def jeden, to potem dajmy na to w def dwa trzeba ją wywołać jeden().
I o tych stringach wyczytałem, że chyba coś trzeba będzie w tym nawiasie dopisać...

Kod: Zaznacz cały

#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtCore, QtGui
from edytor import Ui_mdf2iso_gui
from subprocess import call


class StartQT4(QtGui.QMainWindow):
	def __init__(self, parent=None):
		QtGui.QWidget.__init__(self, parent)
		self.ui = Ui_mdf2iso_gui()
		self.ui.setupUi(self)
		QtCore.QObject.connect(self.ui.zrodlo,QtCore.SIGNAL("clicked()"), self.file_dialog)
		QtCore.QObject.connect(self.ui.wynik,QtCore.SIGNAL("clicked()"), self.file_dialog2)
		QtCore.QObject.connect(self.ui.konwertuj,QtCore.SIGNAL("clicked()"), self.file_dialog3)
		
	def file_dialog(self):
		global fd
		fd = QtGui.QFileDialog(self)
		self.filename = fd.getOpenFileName()
				
	def file_dialog2(self):
		global df
		df = QtGui.QFileDialog(self)
		self.filename2 = df.getOpenFileName()
		
		
	
	def file_dialog3(self):
		file_dialog()
		file_dialog2()
		call(["mdf2iso", fd, df])	
		
		

if __name__ == "__main__":
	app = QtGui.QApplication(sys.argv)
	myapp = StartQT4()
	myapp.show()
	sys.exit(app.exec_())
Nadal tylko nie mogę znaleźć jak pobierać ściężkę (dla zmiennej df) folderu, a nie pliku. Zacząłem próbować z tym: http://pl.wikibooks.org/wiki/Zanurkuj_w ... ie%C5%BCki
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: [Python] Zmienne globalne

Post autor: ethanak »

dhpasta pisze:wyczytałem, że chyba coś trzeba będzie w tym nawiasie dopisać...

Kod: Zaznacz cały

#!/usr/bin/python
# -*- coding: utf-8 -*-
...
		call(["mdf2iso", fd, df])	
Tu masz błąd: przekazujesz do call nie ścieżki do plików (stringi) a obiekty dialogów. W Twoim przypadku to by chyba były self.filename i self.filename2.
Nadal tylko nie mogę znaleźć jak pobierać ściężkę (dla zmiennej df) folderu, a nie pliku. Zacząłem próbować z tym: http://pl.wikibooks.org/wiki/Zanurkuj_w ... ie%C5%BCki
Tu nie pomogę bezpośrednio (ja piszę w GTK a nie Qt), ale pewnie jest jakaś metoda typu "getFolder" albo podobna.
A w ogóle to przeczytaj oficjalną dokumentację do PyQT - tam znajdziesz odpowiedź.
dhpasta
Piegowaty Guziec
Piegowaty Guziec
Posty: 26
Rejestracja: 18 sie 2011, 21:30
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Re: [Python] Zmienne globalne

Post autor: dhpasta »

Ok, mam.
Jest to polecenie getExistingDirectory, znalazłem tu: http://www.pyside.org/docs/pyside/PySid ... ialog.html

Poprawiłem na:

Kod: Zaznacz cały

...
def file_dialog2(self):
		global df
		df = QtGui.QFileDialog(self)
		self.filename2 = df.getExistingDirectory()
...
Działa, ale znów woła o stringa...

Kod: Zaznacz cały

kuba@Laptop:~/Pulpit/mdf2iso/notatnik$ python notes.py
mdf2iso v0.3.1 by Salvatore Santagati
Licensed under GPL v2 or later
Unable to open /media/sda9/Gry for output: Is a directory
Próbowałem uzywać opcji:

Kod: Zaznacz cały

def getExistingDirectory ([parent=None[, caption=”“[, dir=”“[, options=QFileDialog.ShowDirsOnly]]]])
ale tego jeszcze nie rozumiem w ogóle... Z dokumentacji wynika że to będzie directory, więc pewnie trzeba to jakos przerobić na stringa...
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: [Python] Zmienne globalne

Post autor: ethanak »

wiesz... trochę głupio mi robić za interfejs do dokumentacji, czytaj ją w całości a nie po kawałku.
Znalazłeś coś na temat fileMode? Jak nie to poszukaj. I proszę, zanim zadasz następne pytanie upewnij się, że odpowiedzi w dokumentacji nie ma albo nie potrafisz jej znaleźć. Bo to że Ci się szukać/czytać nie chce to nie wymówka.
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 6 gości