Senin, 16 Maret 2026

PYTHON - Tkinter - The Matrix Effects

 


# Efecto Matrix 

# @autor: Magno Efren

# Youtube: https://www.youtube.com/c/MagnoEfren


from tkinter import Frame, Tk, Canvas

from random import choice 


class Matrix(Frame):

def __init__(self, master):

super().__init__(master)


self.canvas = Canvas(master, bg= 'black')

self.canvas.place(relx=0, rely=0, relwidth=1, relheight=1)


self.velocidad = [i for i in range(0,30,5)]

self.pos = [i for i in range(-200,200,20)]

self.letters = []

self.green = 0

self.caracteres = [

                      "a", "k", "u", "u", "u", "И", "Ч",

                      "b", "l", "v", "v", "v", "Ѳ", "Р",

                      "c", "m", "w", "w", "w", "І", "С",

                      "d", "n", "x", "x", "x", "К", "Т",

                      "e", "o", "y", "y", "y", "Л", "Ѵ",

                      "f", "p", "z", "z", "z", "М", "Ф",

                      "g", "q", "1", "1", "1", "Н", "Х",

                      "h", "r", "2", "2", "2", "Ѯ", "Ѱ",

                      "i", "s", "3", "3", "3", "Ѻ", "Ѿ",

                      "j", "t", "4", "4", "4", "П", "Ц",

                ]


self.draw()

self.update()


def draw(self):

for x in range(0,1600,20):

y = choice(self.pos)

for j in range(0, choice([180,220,280]),20):

self.obj = self.canvas.create_text(20+x, -200+y+j, text= choice(self.caracteres),

fill = 'green2', font= ('Arial', 14))

self.letters.append(self.obj)

def update(self):

for letter in self.letters:

v = choice(self.velocidad)

self.green +=5

color = '#{:02x}{:02x}{:02x}'.format(0,self.green,0)

self.canvas.itemconfig(letter, fill=color)

self.canvas.move(letter, 0, v)

y = self.canvas.coords(self.obj)


if self.green >=250:

self.green = 0

if y[1] >=800:

self.draw()

if y[1]>= 1200:

self.letters.clear()

self.canvas.delete('all')

self.canvas.after(80, self.update)


if __name__ == '__main__':

root = Tk()

root.title('Matrix Animation')

root.config(bg= 'black')

root.attributes('-fullscreen', True)

app = Matrix(root)

app.mainloop()


PYTHON - Tkinter - Flappy Bird Game

 

from PIL import Image, ImageTk

import tkinter as tk 

from pygame import mixer 

import random


mixer.init() 

window = tk.Tk()

window.geometry('1000x600')

window.title('Flappy Bird')


x = 150

y = 300

score = 0

speed = 10

game_over = False


img_bird = Image.open('images/bird.png')

img_bird = ImageTk.PhotoImage(img_bird)


img_pipe_down = Image.open('images/pipe.png')           # 104x900

img_pipe_top = img_pipe_down.rotate(180)


img_pipe_down = ImageTk.PhotoImage(img_pipe_down)

img_pipe_top = ImageTk.PhotoImage(img_pipe_top)


img_reset = Image.open('images/reiniciar.png')

img_reset = ImageTk.PhotoImage(img_reset)


canvas = tk.Canvas(window, highlightthickness=0, bg= '#00bfff')

canvas.place(relwidth = 1, relheight=1)


text_score = canvas.create_text(50,50, text= '0', fill='white', font=('D3 Egoistism outline', 30))


bird = canvas.create_image(x,y, anchor = 'nw', image =img_bird)

pipe_top = canvas.create_image(1200, -550, anchor= 'nw', image = img_pipe_top)

pipe_down = canvas.create_image(1200, 550, anchor= 'nw', image = img_pipe_down)


mixer.music.load('audio/swoosh.wav')

mixer.music.play(loops= 0)


def move_bird_key(event):

global x,y

if not game_over:

y -=30

canvas.coords(bird, x,y)

mixer.music.load('audio/wing.wav')

mixer.music.play(loops= 0)



window.bind( "<space>", move_bird_key)



def move_bird():

global x,y

y +=5

canvas.coords(bird, x,y)

if y<0 or y> window.winfo_height():

game_end()


if not game_over:

window.after(50, move_bird)


def move_pipe():

global score, game_over, speed

canvas.move(pipe_top, -speed, 0)

canvas.move(pipe_down, -speed, 0)

if canvas.coords(pipe_down)[0] < -100:

score += 1

speed += 1

canvas.itemconfigure(text_score, text = str(score))

h = window.winfo_height()

num = random.choice([i for i in range(160,h, 160)])

canvas.coords(pipe_down, window.winfo_width(), num+160)

canvas.coords(pipe_top, window.winfo_width(), num-900)


if 0 < canvas.coords(pipe_down)[0]<160:

channel = mixer.Channel(1)

channel.set_volume(1.0)

sound = mixer.Sound('audio/point.wav')

channel.play(sound, loops= 0)


if canvas.coords(pipe_down):

if canvas.bbox(bird)[0] < canvas.bbox(pipe_down)[2] and canvas.bbox(bird)[2]> canvas.bbox(pipe_down)[0]:

if canvas.bbox(bird)[1] < canvas.bbox(pipe_top)[3] or canvas.bbox(bird)[3]> canvas.bbox(pipe_down)[1]:

game_end()

if  not game_over:

window.after(50, move_pipe)



def reset_game():

global x,y,score, speed, game_over

x = 150

y = 300

score = 0

speed = 10

game_over = False

canvas.coords(bird, x,y)

canvas.coords(pipe_top, 1200,-550)

canvas.coords(pipe_down, 1200, 550)

canvas.itemconfigure(text_score, text ="0")

lbl_game_over.place_forget()

bt_reset.place_forget()

move_bird()

move_pipe()

mixer.music.load('audio/swoosh.wav')

mixer.music.play(loops= 0)


def game_end():

global game_over

game_over = True

lbl_game_over.place(relx =0.5, rely =0.5, anchor='center')

bt_reset.place(relx = 0.5, rely = 0.7, anchor ='center')

mixer.music.load('audio/hit.wav')

mixer.music.play(loops= 0)

while mixer.music.get_busy():

continue

mixer.music.load('audio/die.wav')

mixer.music.play(loops= 0)


lbl_game_over = tk.Label(window, text = 'Game Over !', font= ('D3 Egoistism outline', 30), fg='white', bg='#00bfff')

bt_reset = tk.Button(window, border = 0, image= img_reset, activebackground='#00bfff', bg= '#00bfff', command = reset_game)


window.after(50, move_bird)

window.after(50, move_pipe)


window.call('wm', 'iconphoto', window._w, img_bird) 

window.mainloop()







PYTHON - Tkinter - Membuat Notepad

 


# Aplicacion bloc de notas

# @autor: Magno Efren

# Youtube: https://www.youtube.com/c/MagnoEfren

# https://www.youtube.com/watch?v=LPpoReqIqKQ&t=18s


from tkinter import Tk, ttk, Frame, PhotoImage

from tkinter import Button, Entry, Label, Menu, Scrollbar, Text

from tkinter import messagebox, filedialog, Toplevel, colorchooser

from tkinter import font, BooleanVar



class Ventana(Frame):

def __init__(self, master):

super().__init__( master)

self.master.title('Bloc de Notas')

self.master.iconbitmap('icono.ico')

self.master.geometry('700x500+380+20')

self.master.protocol("WM_DELETE_WINDOW", self.salir)

self.señal_ajustes = BooleanVar()

self.info_estado =  BooleanVar()

self.info_estado.set(False)

self.señal_ajustes.set(True)

self.clik_aceptar = False

self.x = 0

self.y = 0

self.n = 12

self.f = 'Arial'

self.widgets()

self.master.columnconfigure(0, weight=1)

self.master.rowconfigure(0, weight=1)

def widgets(self):

menu = Menu(self.master)

self.master.config(menu = menu)

archivo = Menu(menu, tearoff=0)

archivo.add_command(label="Nuevo", command = self.nueva_ventana)

archivo.add_command(label="Ventana Nueva", command = self.segunda_ventana)

archivo.add_command(label="Abrir...", command = self.abrir_archivo)

archivo.add_command(label="Guardar", command = self.guardar_archivo)

archivo.add_separator()

archivo.add_command(label="Salir", command = self.master.quit)

edicion = Menu(menu, tearoff=0)

edicion.add_command(label="Deshacer", command = lambda: self.texto.edit_undo())

edicion.add_separator()


edicion.add_command(label="Cortar", accelerator='Ctrl+X', 

command = lambda: self.master.focus_get().event_generate("<<Cut>>") )

edicion.add_command(label="Copiar", accelerator='Ctrl+C', 

command = lambda: self.master.focus_get().event_generate("<<Copy>>"))

edicion.add_command(label="Pegar", accelerator='Ctrl+V',  

command = lambda: self.master.focus_get().event_generate("<<Paste>>"))

edicion.add_command(label="Eliminar", accelerator= 'Supr', 

command = lambda: self.master.focus_get().event_generate("<<Clear>>"))

formato = Menu(menu, tearoff=0)

formato.add_checkbutton(label="Ajustes de linea", variable = self.señal_ajustes, command= self.ajustes_de_linea)

formato.add_command(label="Fuente", command= self.formato_fuente)  

formato.add_command(label="Color de texto", command= self.elegir_color_texto)

formato.add_command(label="Color de fondo", command= self.elegir_color_fondo)

ver = Menu(menu, tearoff=0)

submenu = Menu(menu, tearoff=0)

submenu.add_command(label="Acercar", command= self.zoom_mas)

submenu.add_command(label="Alejar", command= self.zoom_menos) 

submenu.add_command(label="Restaurar Zoom", command= lambda: self.texto.config(font= (self.f, 12)))

ver.add_cascade(label="Zoom", menu = submenu)

ver.add_checkbutton(label="Barra de estado", variable = self.info_estado, command = self.barra_de_estado)

ayuda = Menu(menu, tearoff=0)

ayuda.add_command(label="Ver la ayuda")

ayuda.add_separator()

ayuda.add_command(label="Acerca del Bloc de notas", command= self.acerca_de)

menu.add_cascade(label="Archivo", menu=archivo)

menu.add_cascade(label="Edicion", menu=edicion)

menu.add_cascade(label="Formato", menu=formato)

menu.add_cascade(label="Ver", menu=ver)

menu.add_cascade(label="Ayuda", menu=ayuda)

self.texto = Text(self.master, font= ('Arial', 12), undo= True, insertbackground='red')  

self.texto.grid(column=0, row=0, sticky='nsew')

ladox = Scrollbar(self.master, orient = 'horizontal', command= self.texto.xview)

ladox.grid(column=0, row = 1, sticky='ew')

ladoy = Scrollbar(self.master, orient ='vertical', command = self.texto.yview)

ladoy.grid(column = 1, row = 0, sticky='ns')

self.texto.configure(xscrollcommand = ladox.set, yscrollcommand = ladoy.set)

self.barra_estado = Label(self.master, font = ('Segoe UI Symbol', 10))

#eventos

self.master.bind('<Shift-KeyPress-S>', self.salir)


def ajustes_de_linea(self):

if self.señal_ajustes.get() == True:

self.texto.config(wrap='word')

else:

self.texto.config(wrap= 'none')


def barra_de_estado(self):

if self.info_estado.get() == True:

n = len(self.texto.get('1.0','end'))


self.barra_estado.grid(column=0, row = 2, sticky='ew')

self.barra_estado.config(text = f'Numero de letras: {n}' )


x = self.barra_estado.after(10, self.barra_de_estado)


if self.info_estado.get() == False:

self.barra_estado.after_cancel(x)

self.barra_estado.grid_forget()


def zoom_mas(self):

if self.n <90:

self.n += 2

self.texto.config(font= ( self.f,self.n))

else:

self.n = 12


def zoom_menos(self):

if self.n >6:

self.n -= 2

self.texto.config(font= (self.f, self.n))

else:

self.n = 12


def salir(self, *args):

valor = messagebox.askyesno('Salir', '¿Desea Salir?',parent= self.master)

if valor == True:

self.master.destroy()

self.master.quit()


def abrir_archivo(self):

direcion = filedialog.askopenfilename(initialdir ='/', 

title='Archivo', 

filetype=(('txt files', '*.txt*'),('All files', '*.*')))

if direcion != '':

archivo = open(direcion, 'r')

contenido = archivo.read()

self.texto.delete('1.0', 'end')

self.texto.insert('1.0', contenido)

self.master.title(direcion)



def guardar_archivo(self):

try: 

filename = filedialog.asksaveasfilename(defaultextension='.txt')

archivo = open(filename, 'w')

archivo.write(self.texto.get('1.0', 'end'))

archivo.close()


messagebox.showinfo('Guardar Archivo','Archivo guardado en: ' + str(filename) )

except:

messagebox.showerror('Guardar Archivo', 'Archivo no guardado\n Error')



def nueva_ventana(self):

if self.texto.get !='':

valor = messagebox.askyesno('Bloc de Notas', '¿Desea guardar el archivo?',parent= self.master)

if valor == True:

self.guardar_archivo()

else:

self.texto.delete('1.0', 'end')


def segunda_ventana(self):

segunda_ventana = Toplevel(self.master)

segunda_ventana = Ventana(segunda_ventana)


def acerca_de(self):

vent_info = Toplevel(self.master)

vent_info.config( bg='white')

vent_info.title('')

vent_info.resizable(0,0)

vent_info.iconbitmap('icono.ico')

vent_info.geometry('350x200+200+200')

Label(vent_info, bg='white', 

text= 'Programa realizado en Python \n con la liberia de Tkinter \n\n Autor: Magno Efren').pack(expand=True)


 

def formato_fuente(self):

self.vent_tipo_fuente = Toplevel(self.master)

self.vent_tipo_fuente.overrideredirect(1)

self.vent_tipo_fuente.geometry('390x290+400+200')

self.vent_tipo_fuente.config(bg= 'SeaGreen1', relief ='raised', bd = 3)

self.vent_tipo_fuente.bind("<B1-Motion>", self.mover)

self.vent_tipo_fuente.bind("<ButtonPress-1>", self.start) 


fuente = list(font.families())

tamaño = []

for  i in range(8,73):tamaño.append(i)


Label(self.vent_tipo_fuente, text= 'Fuente:', fg = 'black', bg='SeaGreen1',

font= ('Segoe UI Symbol', 12)).grid(row=0,column=0, padx=5, ipady=6)


Label(self.vent_tipo_fuente, text= 'Tamaño:', fg = 'black', bg='SeaGreen1', 

font= ('Segoe UI Symbol', 12)).grid(row=0,column=1, padx=5, ipady=6)


self.combobox_fuente = ttk.Combobox(self.vent_tipo_fuente, values = fuente, 

justify='center',width='15', font='Arial')

self.combobox_fuente.grid(row=1, column=0, padx =25, pady=5)          #state="readonly"

self.combobox_fuente.current(135)


self.combobox_tamaño = ttk.Combobox(self.vent_tipo_fuente,values = tamaño, 

justify='center',width='12', font='Arial')

self.combobox_tamaño.grid(row=1, column=1, padx =25, pady=15)

self.combobox_tamaño.current(4)


self.preview = Label(self.vent_tipo_fuente,fg = 'black', bg='SeaGreen1', font= ('Arial', 12))

self.preview.grid(columnspan=2, row=2, padx=5, ipady=6)


self.aceptar = Button(self.vent_tipo_fuente, text= 'Aplicar', fg = 'black', bg='white', bd = 2, 

font= ('Arial', 12), command = self.señal_boton)

self.aceptar.grid(columnspan=2, row=3, padx=5, pady=5)


self.aplicar_formato()



def mover(self, event):

    deltax = event.x - self.x

    deltay = event.y - self.y

    self.vent_tipo_fuente.geometry("+%s+%s" % (self.vent_tipo_fuente.winfo_x() + 

        deltax, self.vent_tipo_fuente.winfo_y() + deltay))

    self.vent_tipo_fuente.update()


def start(self, event):

    self.x = event.x

    self.y = event.y


def señal_boton(self):

self.clik_aceptar = True


def aplicar_formato(self):

self.f = str(self.combobox_fuente.get())

self.n = int(self.combobox_tamaño.get())

tipo = (self.f , self.n )

tipo_preview = (self.f, int(self.n*0.7) )


self.preview.config(text = 'AbC 123' , font = (tipo_preview))

x = self.texto.after(10, self.aplicar_formato)

if self.clik_aceptar == True:

self.texto.config(font = tipo)

self.texto.after_cancel(x)

self.clik_aceptar = False

self.vent_tipo_fuente.destroy()


def elegir_color_texto(self):

color = colorchooser.askcolor()[1] 

self.texto.config(fg= color, insertbackground = color)


def elegir_color_fondo(self):

color = colorchooser.askcolor()[1]

self.texto.config(bg= color)



if __name__ == "__main__":

ventana = Tk()

app = Ventana(ventana)

app.mainloop()


Python Tkinter - Transparent Background

 

# https://www.youtube.com/c/MagnoEfren/videos
# Reloj transparente en tkinter

from tkinter import Label, Tk
import time  

ventana = Tk() 
ventana.config(bg='gray')
ventana.wm_attributes('-transparentcolor', 'gray')
# ventana.wm_attributes("-alpha", 0.5) Para linux
# ventana.wait_visibility(ventana)  Para linux
ventana.overrideredirect(1)   # Eliminar barra de titulo

def salir(*args):
    ventana.destroy()
    ventana.quit()

def obtener_tiempo():
hora =  time.strftime('%H:%M:%S')
zona = time.strftime('%Z')
fecha_formatol2 = time.strftime(
        '%A' ' ' '%d' ' ' '%B' ' ' '%Y' )

texto_hora['text'] = hora
texto_fecha12['text']= fecha_formatol2
zona_horaria['text'] = zona
texto_hora.after(1000, obtener_tiempo)


def start(event):
    global x, y
    x = event.x
    y = event.y
 
def stop(event):
    global x, y
    x = None
    y = None
 
def mover(event):
    global x, y
    deltax = event.x - x
    deltay = event.y - y
    ventana.geometry("+%s+%s" % (ventana.winfo_x() + 
        deltax, ventana.winfo_y() + deltay))
    ventana.update()

ventana.bind("<ButtonPress-1>", start)                                      
ventana.bind("<ButtonRelease-1>", stop)                                      
ventana.bind("<B1-Motion>", mover)                                              
ventana.bind("<KeyPress-Escape>", salir)                                         # salir 

lbl = Label(ventana, text="SMA INFORMATIKA CIAMIS", fg='blue', bg='gray', font=('Arial',20,'bold'))
lbl.grid(column=0, row=0)
texto_hora = Label(ventana,  fg = 'white', bg='gray', 
font = ('Star Jedi Hollow', 40, 'bold'), width=10)                                #Star Jedi Hollow  #SolsticeOfSuffering
texto_hora.grid(column=0, row=1, ipadx=1, ipady=1)

texto_fecha12 = Label(ventana,  fg = 'white',  
    bg='gray', font = ('Helvetica',20, 'bold'))
texto_fecha12.grid(column= 0, row=2)

zona_horaria = Label(ventana,  fg = 'white',  
    bg='gray', font = ('Lucida Sans',12)) 
zona_horaria.grid(column = 0, row=3)

obtener_tiempo()
ventana.mainloop() 


Minggu, 15 Maret 2026

My 2nd JAVA - GTGE

 


/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package gtge1;
import com.golden.gamedev.Game;
import com.golden.gamedev.GameLoader;
import com.golden.gamedev.object.Sprite;
import com.golden.gamedev.object.AnimatedSprite;
import java.awt.Dimension;
//import java.awt.color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import com.golden.gamedev.object.font.SystemFont;
import com.golden.gamedev.gui.TLabel;
import com.golden.gamedev.gui.toolkit.FrameWork;
import java.awt.Color;
public class AnimasiGame extends Game {

public static void main(String[] args) {
        GameLoader loader = new GameLoader();
        loader.setup(new AnimasiGame(), new Dimension(300,200), false);
        loader.start();
    }

// Di dalam kelas Game
private FrameWork f;
private TLabel l;
//private color c;
long timer;

public void initResources() {
    f=new FrameWork(bsInput,getWidth(),getHeight());
    //c=new Color(255,255,255);
    l = new TLabel("MENU UTAMA", 10,20,300,20);
    f.add(l);
    l.setLocation(100, 100);
}

public void update(long elapsedTime) {
    timer += elapsedTime;
    
    // Animasi teks berkedip setiap 500ms
    if (timer > 500) {
        if (l.getText().equals("")) {
            l.setText("MENU UTAMA");
        } else {
            l.setText("");
        }
        timer = 0;
    }
}

public void render(Graphics2D g) {
    l.render(g);
}
}


Sabtu, 14 Maret 2026

My First Java - GTGE

 


/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package gtge_test;
import com.golden.gamedev.Game;
import com.golden.gamedev.GameLoader;
import com.golden.gamedev.gui.TLabel;
import com.golden.gamedev.gui.toolkit.FrameWork;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.Color;
import java.awt.Dimension;



public class SimpleGTGEGame extends Game {

    // Main entry point for the game
    public static void main(String[] args) {
        GameLoader loader = new GameLoader();
        loader.setup(new SimpleGTGEGame(), new Dimension(300,200), false);
        loader.start();
    }

    // Initialize game resources (images, sounds, etc.)
    @Override
    public void initResources() {
        // Load an image, for example:
        // playerImage = bsLoader.get  Image("assets/player.png"); 
        // This is where you would load all your assets using bsLoader
        System.out.println("Initializing resources...");
    }

    // Update game logic (runs in a loop)
    @Override
    public void update(long elapsedTime) {
        // Handle input, move objects, check collisions here
        if (bsInput.isKeyDown(KeyEvent.VK_SPACE)) {
            System.out.println("Space key pressed!");
        }
    }

    // Render game elements to the screen
    @Override
    public void render(Graphics2D g) {
        // Draw the background
        g.setColor(Color.BLACK);
        g.fillRect(0, 0, getWidth(), getHeight());

        // Draw game objects
        g.setColor(Color.WHITE);
        g.drawString("Welcome to GTGE!", 100, 100);
    }
}