I try to build a short of captha app that must run on desktop and emulated on Android, so far I have success with the example "simple calculator" that use TK and Buttons.
I success to load the first row of pictures inside the buttons, but as soon as I try to update the images, buttons disapear
here my code (resumed for two buttons, but same the same)
#!/usr/bin/env python3
# Python program to create a simple GUI
# calculator using Tkinter
from tkinter import *
import os
from PIL import ImageTk,Image, ImageFilter, ImageFont , ImageDraw , ImageOps, ImageFile
# checkea que el script corre en display0, si no, configura el output grafico a este
if os.environ.get('DISPLAY','') == '':
os.environ.__setitem__('DISPLAY', ':0.0')
# globally declare the ThisInstanceImages variable
ThisInstanceImages = []
# Function to update each button is pressed
def press(num):
reloadImages()
def reloadImages():
global ThisInstanceImages
...
aux_IMG = actualImage.crop((10,10,110,110)).resize((250,250))
if len(ThisInstanceImages) == 0:
ThisInstanceImages.append(ImageTk.PhotoImage(aux_IMG))
else:
ThisInstanceImages[0] = ImageTk.PhotoImage(aux_IMG)
aux_IMG = actualImage.crop((110,110,210,210)).resize((250,250))
if len(ThisInstanceImages) == 1:
ThisInstanceImages.append(ImageTk.PhotoImage(aux_IMG))
else:
ThisInstanceImages[1] = ImageTk.PhotoImage(aux_IMG)
# Driver code
if __name__ == "__main__":
# create a GUI window
gui = Tk()
# set the background colour of GUI window
gui.configure(background="light green")
# set the title of GUI window
gui.title("Simple Calculator")
# set the configuration of GUI window
gui.geometry("640x480")
## fisrt run - aux
reloadImages()
# create a Buttons and place at a particular
# location inside the root window .
# when user press the button, the command or
# function affiliated to that button is executed .
button1 = Button(gui, text='', image = ThisInstanceImages[0], fg='black', bg='black',
command=lambda: press(1), height=250, width=250, borderwidth=0)
button1.grid(row=2, column=0)
button2 = Button(gui, text=' 2 ', image = ThisInstanceImages[1], fg='black', bg='black',
command=lambda: press(2), height=250, width=250, borderwidth=0)
button2.grid(row=2, column=1)
...
# start the GUI
gui.mainloop()
the first call [on ## fisrt run - aux] works ok, but as soon as button is pressed, and jump for second time on reloadImages() and hit the seventh line (ThisInstanceImages[0] = ImageTk.PhotoImage(aux_IMG)) app buttons disapear. I try with a little trick to do not delete any image, (really change), same result
here the trick:
def reloadImages():
global ThisInstanceImages
...
aux_IMG = actualImage.crop((10,10,110,110)).resize((250,250))
ThisInstanceImages.append(ImageTk.PhotoImage(aux_IMG))
aux_IMG = actualImage.crop((110,110,210,210)).resize((250,250))
ThisInstanceImages.append(ImageTk.PhotoImage(aux_IMG))
if len(ThisInstanceImages) > 2:
ThisInstanceImages[0] = ThisInstanceImages[2]
is that achivable ??