PyQT4 wywołanie funkcji z innego modułu

0

To działa tak jak powinno - funkcja strona zadeklarowana w klasie MyForm, a co jak chce funkcje z np. (from funkcje)

import sys
from PyQt4 import QtCore, QtGui, QtWebKit
from forma import Ui_MainWindow

class MyForm(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        QtCore.QObject.connect(self.ui.pushButton,QtCore.SIGNAL("clicked()"), self.strona)

    def strona(self):
        self.ui.webView.setUrl(QtCore.QUrl("http://xxxx.pl"))

##  funkcje.py
def strona():
        self.ui.webView.setUrl(QtCore.QUrl("http://xxxx.pl"))


## run.py
import sys, time, funkcje
from PyQt4 import QtCore, QtGui, QtWebKit
from forma import Ui_MainWindow



class MyForm(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        QtCore.QObject.connect(self.ui.pushButton,QtCore.SIGNAL("clicked()"), funkcje.strona)

To daje błąd.

'Traceback (most recent call last): File "C:\Python33\liczbapierwsza\TribalWarsBot\funkcje.py", line 5, in strona QtGui.QWidget.init(self, parent) NameError: global name 'self' is not defined'

Nie wiem jak to ugryźć... szukam szukam i nic. Proszę o pomoc, może ktoś już się z tym kiedyś męczył?

0

self masz tylko w klasie, nie widać w funkcji obiektu self.

0
Spine napisał(a):

self masz tylko w klasie, nie widać w funkcji obiektu self.

Tj.? Konkretnie wskaż o co chodzi, bo wiele różnych metod próbowałem, self wpisywałem wszedzie gdzie się da.

0

Myślę, że to co chcesz zrobić powinieneś zrobić tak:

##  funkcje.py
def strona(self):
        self.ui.webView.setUrl(QtCore.QUrl("http://xxxx.pl"))
 
 
## run.py
import sys, time, funkcje
from PyQt4 import QtCore, QtGui, QtWebKit
from forma import Ui_MainWindow
 
 
 
class MyForm(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        QtCore.QObject.connect(self.ui.pushButton,QtCore.SIGNAL("clicked()"), lambda:funkcje.strona(self))

Selfa swojej formy przekazujesz do funkcji strona, wtedy funkcja strona widzi selfa. Użyta została lambda, ponieważ tak najłatwiej podać do sygnału funkcję z odpowiednim parametrem :) Mam nadzieję, że zadziała, pisane z palca. BTW. brzydki program, wchodzi na strony XXX :P

0

Działa mistrzu ;] Nie wiem na czym ogólnie polegają te selfy, nie ogarniam tego - może kiedyś zczaje... tylko czy da się zrobić bez użycia lamdy?

0

self to referencja na instancję klasy. Globalny kontener przechowujący zmienne i metody klasy. Każda metoda ("funkcja") klasy musi mieć wpisany self jako pierwszy argument.

Bez lambdy można to zrobić tak:

##  funkcje.py
def strona(self):
        self.ui.webView.setUrl(QtCore.QUrl("http://xxxx.pl"))
 
 
## run.py
import sys, time, funkcje
from PyQt4 import QtCore, QtGui, QtWebKit
from forma import Ui_MainWindow
 
 
 
class MyForm(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        QtCore.QObject.connect(self.ui.pushButton,QtCore.SIGNAL("clicked()"), pushButtonClick)
    def pushButtonClick(self):
        funkcje.strona(self)

Po prostu do connect podajesz referencję na funkcję, którą chcesz wykonać po kliknięciu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1