I have this code :
class X(object):
def func1(self, arg):
print("Button {0} clicked".format(arg))
return True
class Y(X):
def func2(self):
self.btn = QPushButton()
self.btn.clicked.connect(partial(self.func1 , True ) )
#while func1 ==True :
#do something
When I press the button, the arg parameter will be set to True.
I wish I could call function 1 outside of class, which will only be true if the button is pressed.
CodePudding user response:
If you have to do something when you click button then you should do it directly inside func1
.
But if you want to set some value which will be used later then you should use self.value
to keep this value inside instance of this class - and later other function should get this value - without running function
class X(object):
def __init__(self):
self.value = False # set default value at start
def func1(self, arg):
print("Button {0} clicked".format(arg))
self.value = True # change value when click
class Y(X):
def func2(self):
self.btn = QPushButton()
self.btn.clicked.connect(partial(self.func1, True))
# create instance of class
x = Y()
# access value in instance
while x.value is True:
#do something
But while
-loop may block event-loop in GUI and it may freeze GUI so it may need to run while
-loop inside thread
. Or it may need some timer
to execute function periodically without loop and without thread
.
class X(object):
def __init__(self):
self.value = False # set default value at start
self.thread = None # set default value at start
def func1(self, arg):
print("Button {0} clicked".format(arg))
self.value = True # change value when click
if self.thread != None:
print("thread already running")
else:
self.thread = threading.Thread(taget=self.long_running_loop)
self.thread.start()
def long_running_loop(self):
while self.value is True:
#do something
self.thread = None # inform function that it can run it again
class Y(X):
def func2(self):
self.btn = QPushButton()
self.btn.clicked.connect(partial(self.func1, True))
# create instance of class
x = Y()
I show example with standard Thread
but PyQt
has own class QThread
which you should use.