Hi everyone, I was hoping someone could help me with the following. I have a button that saves a screenshot PNG to the Downloads folder when you press it.

What I want is for the button to disappear after it is pressed, so the screenshot does not include the two menu buttons called “%SaveReport” and “%BackMainMenu”.

The code for the save button is listed below:

`

func _on_SaveReport_pressed():

$"%SaveReport".visible = false

$"%BackMainMenu".visible = false

print("I've disabled the buttons")
print("That means the screenshot SHOULD be button free")

take_screenshot()

$"%SaveReport".visible = true
$"%BackMainMenu".visible = true

`

As you can see, it calls the take_screenshot() function which is listed above:

`

func take_screenshot(): image = get_viewport().get_texture().get_image()

if OS.get_name() == "Web" or OS.has_feature('JavaScript'):
	print("We're on the web")
	# We're on the web		

	image.clear_mipmaps()

	var buffer = image.save_png_to_buffer()
	JavaScriptBridge.download_buffer(buffer, fileName)

if OS.get_name() != "Web" or !OS.has_feature('JavaScript'):
	# We're not on the web
	print("We're not on the web")
	
	var docs = OS.get_environment("HOME") + "/Documents"
	
	var title = str(docs + "/results",global_ints.observed_person_name, global_ints.observation_minutes,".png")
	
	print(title)
	
	var _saveimage = image.save_png(title)
	
	if OS.get_name() != "OSX":
		print("We're not on MacOS")
		var _openfolder = OS.shell_open(docs)
	
	if OS.get_name() == "OSX":
		print("We're on MacOS")
		
		var _openfolder = OS.shell_open("file://" + docs)

`

The code works. The screenshot is taken and it’s saved to the Downloads folder and MacOS/Windows/Linux open up the Downloads folder straight after.

For the life of me, I can’t figure out why the Back & Screenshot buttons ( “%SaveReport” and “%BackMainMenu”) that I turn invisible BEFORE I call take_screenshot() end up being in the screenshot. Every single time.

Anyone have any ideas?

Thank you!

  • HobbesHK@startrek.websiteOP
    link
    fedilink
    English
    arrow-up
    1
    ·
    1 year ago

    Managed to fix it by using await get_tree().process_frame instead. It seems that idle_frame appears to no longer exist in Godot 4.1?

    So my full code for triggering the screenshot function is:

    func _on_SaveReport_pressed():
    	await get_tree().process_frame
    	$"%SaveReport".visible = false
    	$"%BackMainMenu".visible = false
    	await get_tree().process_frame
    	
    	take_screenshot()
    
    	$"%SaveReport".visible = true
    	$"%BackMainMenu".visible = true
    

    For some reason, I have to await before I turn the interface elements off, and after I’ve turned them off. It now works a treat for my app. Thank you for your assistance!

    • PoolloverNathan
      link
      fedilink
      English
      arrow-up
      1
      ·
      1 year ago

      Oh nice, Godot changed something again. TIL about process_frame, thanks!