Python Forum
[HELP] Nested conditional? double condition followed by another condition.
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[HELP] Nested conditional? double condition followed by another condition.
#1
Im trying to learn python but struggling on this problem. I will be thankfull if anyone give me some help.


while button1_pressed and button2_pressed: #no matter which one is pressed first to me
	do some
	while button3_pressed: #only if it is pressed after button1 and button2 are pressed
		do some2
		if button2_is_not_pressed:
			break
in practice "do some2" activates even when I press button 3 before buttons 1 and 2. Anyone can help me, please?
Reply
#2
button1_pressed and button2_pressed must both be True before you press button 3.
Reply
#3
(May-31-2020, 03:00 PM)Yoriz Wrote: button1_pressed and button2_pressed must both be True before you press button 3.

Thank you for your answer but i do not fully understand. English isnt my first language.

The button1_pressed, button2_pressed and button3_pressed are functions. I forgot to mention that.

def button1_pressed():  # Returns true if the left mouse button is pressed
    button1_state = win32api.GetKeyState(0x01)
    return button1_state < 0

def button2_pressed():  # Returns true if the right mouse button is pressed
    button2_state = win32api.GetKeyState(0x02)
    return  button2_state < 0

def button3_pressed():  # Returns true if the M button is pressed
    button3_state = win32api.GetKeyState(0x4D)
    return button3_state < 0

while button1_pressed() and button2_pressed(): # No matter which one is pressed first to me
    do some
    while button3_pressed(): # Only if it is pressed after button1 and button2 are pressed
        do some2
        if button2_pressed() == 0:
            break
The problem is: if I press button3_pressed even before button1_pressed and button2_pressed do some2 activate. I do not want this..
Reply
#4
button1_pressed = True
button2_pressed = True
button3_pressed = True
button2_is_not_pressed = True

while button1_pressed and button2_pressed:
    print('do some') # this only happens if both the above are True
    while button3_pressed:
        print('do some2') #  theis only happens if button3_pressed is True
        if button2_is_not_pressed:
            break # this only breaks the inner while loop
    break # added an extra break else it would just be stuck in an endless outer loop
Output:
do some do some2
The following conditions nothing will happen
button1_pressed = False
button2_pressed = True
button3_pressed = True
button2_is_not_pressed = True

while button1_pressed and button2_pressed:
    print('do some') # this only happens if both the above are True
    while button3_pressed:
        print('do some2') #  theis only happens if button3_pressed is True
        if button2_is_not_pressed:
            break # this only breaks the inner while loop
    break # added an extra break else it would just be stuck in an endless loop
Output:
button1_pressed and button2_pressed must be returning True even though you think they should not be.
Reply
#5
(May-31-2020, 03:35 PM)Yoriz Wrote:
button1_pressed = True
button2_pressed = True
button3_pressed = True
button2_is_not_pressed = True

while button1_pressed and button2_pressed:
    print('do some') # this only happens if both the above are True
    while button3_pressed:
        print('do some2') #  theis only happens if button3_pressed is True
        if button2_is_not_pressed:
            break # this only breaks the inner while loop
    break # added an extra break else it would just be stuck in an endless outer loop
Output:
do some do some2
The following conditions nothing will happen
button1_pressed = False
button2_pressed = True
button3_pressed = True
button2_is_not_pressed = True

while button1_pressed and button2_pressed:
    print('do some') # this only happens if both the above are True
    while button3_pressed:
        print('do some2') #  theis only happens if button3_pressed is True
        if button2_is_not_pressed:
            break # this only breaks the inner while loop
    break # added an extra break else it would just be stuck in an endless loop
Output:
button1_pressed and button2_pressed must be returning True even though you think they should not be.

I really apreciate your help... but imagine this situation:

1 - user press button1 and button2 then press button3
Its ok to me "do some 2"
2 - user press button2 and button1 then press button3
Its ok to me "do some 2"

but

3 - user press button3 before button1 and button2
Its not ok to "do some2", I need just to "do some"

Mate, I should have mentioned that this whole code is inside a Main loop. Im sorry!!

So.. I Thinks to test should be like this:

button1_pressed = True
button2_pressed = True
button3_pressed = True
button2_is_not_pressed = True

while True:
    while button1_pressed and button2_pressed:
        print('do some') # this only happens if both the above are True
        while button3_pressed:
            print('do some2') #  theis only happens if button3_pressed is True
            if button2_is_not_pressed:
                break # this only breaks the inner while loop
        break # added an extra break else it would just be stuck in an endless outer loop
Reply
#6
In your function, you get the state of the button press. It can be an integer between 1 and 0 (pressed or not pressed).
When you return it, to get a True or False output you check if it is less than 0.

When the key isn't pressed, button_state is going to be 0:
0 < 0 = True.
Meaning when the button isn't pressed the while loop can still run. Surely you would want something like this:
return bool(button1_state)
Since bool(0) returns False, and bool(1) returns True.

Am I missing something here?
Reply
#7
(May-31-2020, 04:22 PM)DreamingInsanity Wrote: In your function, you get the state of the button press. It can be an integer between 1 and 0 (pressed or not pressed).
When you return it, to get a True or False output you check if it is less than 0.

When the key isn't pressed, button_state is going to be 0:
0 < 0 = True.
Meaning when the button isn't pressed the while loop can still run. Surely you would want something like this:
return bool(button1_state)
Since bool(0) returns False, and bool(1) returns True.

Am I missing something here?

Thank you for your answer.

I made some mistakes editing the posts..

Could you give a look a it:

def button1_pressed():  # Returns true if the left mouse button is pressed
    button1_state = win32api.GetKeyState(0x01)
    return button1_state < 0
 
def button2_pressed():  # Returns true if the right mouse button is pressed
    button2_state = win32api.GetKeyState(0x02)
    return  button2_state < 0
 
def button3_pressed():  # Returns true if the M button is pressed
    button3_state = win32api.GetKeyState(0x4D)
    return button3_state < 0
 
while True:
    while button1_pressed() and button2_pressed(): # No matter which one is pressed first to me
        print("do some")
        while button3_pressed(): # Only if it is pressed after button1 and button2 are pressed
            print("do some2")
            if button2_pressed() == 0:
                break # this only breaks the inner while loop
        break # added an extra break else it would just be stuck in an endless loop
I forgot to mention this whole code is inside a main loop.
Reply
#8
@penahuse

Try this:
def button1_pressed():  # Returns true if the left mouse button is pressed
    button1_state = win32api.GetKeyState(0x01)
    return bool(button1_state)
  
def button2_pressed():  # Returns true if the right mouse button is pressed
    button2_state = win32api.GetKeyState(0x02)
    return  bool(button2_state)
  
def button3_pressed():  # Returns true if the M button is pressed
    button3_state = win32api.GetKeyState(0x4D)
    return bool(button3_state)
  
while True:
    while button1_pressed() and button2_pressed(): # No matter which one is pressed first to me
        print("do some")
        while button3_pressed(): # Only if it is pressed after button1 and button2 are pressed
            print("do some2")
            if button2_pressed() == 0:
                break # this only breaks the inner while loop
        break # added an extra break else it would just be stuck in an endless loop
Reply
#9
(May-31-2020, 04:52 PM)DreamingInsanity Wrote: @penahuse

Try this:
def button1_pressed():  # Returns true if the left mouse button is pressed
    button1_state = win32api.GetKeyState(0x01)
    return bool(button1_state)
  
def button2_pressed():  # Returns true if the right mouse button is pressed
    button2_state = win32api.GetKeyState(0x02)
    return  bool(button2_state)
  
def button3_pressed():  # Returns true if the M button is pressed
    button3_state = win32api.GetKeyState(0x4D)
    return bool(button3_state)
  
while True:
    while button1_pressed() and button2_pressed(): # No matter which one is pressed first to me
        print("do some")
        while button3_pressed(): # Only if it is pressed after button1 and button2 are pressed
            print("do some2")
            if button2_pressed() == 0:
                break # this only breaks the inner while loop
        break # added an extra break else it would just be stuck in an endless loop

Did not work well. Printed infinite "do some" until I click again any mouse button again (to return False) but I need it to work only if the buttons are pressed at same time.

I apreciate your try anyway!
Reply
#10
I did some testing. If you use 'GetAsyncKeyState' it should work. 'GetAsyncKeyState' is basically 'isKeyPressed' so the moment you let go of a button, it will no longer return true.

def button1_pressed():  # Returns true if the left mouse button is pressed
    button1_state = win32api.GetAsyncKeyState(0x01)
    return bool(button1_state)
   
def button2_pressed():  # Returns true if the right mouse button is pressed
    button2_state = win32api.GetAsyncKeyState(0x02)
    return  bool(button2_state)
   
def button3_pressed():  # Returns true if the M button is pressed
    button3_state = win32api.GetAsyncKeyState(0x4D)
    return bool(button3_state)
   
while True:
	while button1_pressed() and button2_pressed(): # No matter which one is pressed first to me
		print("do some")
		while button3_pressed(): # Only if it is pressed after button1 and button2 are pressed
			print("do some2")
			if button2_pressed() == 0:
				break # this only breaks the inner while loop
		break # added an extra break else it would just be stuck in an endless loop
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Get an average of the unique values of a column with group by condition and assign it klllmmm 0 223 Feb-17-2024, 05:53 PM
Last Post: klllmmm
  unable to remove all elements from list based on a condition sg_python 3 377 Jan-27-2024, 04:03 PM
Last Post: deanhystad
  Python Alteryx QS-Passing pandas dataframe column inside SQL query where condition sanky1990 0 690 Dec-04-2023, 09:48 PM
Last Post: sanky1990
  Sent email based on if condition stewietopg 1 805 Mar-15-2023, 08:54 AM
Last Post: menator01
  Replacing values ​​in Mysql with a condition stsxbel 0 607 Mar-05-2023, 08:20 PM
Last Post: stsxbel
  create new column based on condition arvin 12 2,134 Dec-13-2022, 04:53 PM
Last Post: jefsummers
Question Running an action only if time condition is met alexbca 5 1,262 Oct-27-2022, 02:15 PM
Last Post: alexbca
  How to assign a value to pandas dataframe column rows based on a condition klllmmm 0 799 Sep-08-2022, 06:32 AM
Last Post: klllmmm
  How to write the condition for deleting multiple lines? Lky 3 1,100 Jul-10-2022, 02:28 PM
Last Post: Lky
  Can I check multi condition for 1 item in a easy way? korenron 4 1,537 May-01-2022, 12:43 PM
Last Post: deanhystad

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020