Sabtu, 21 Maret 2026
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
Minggu, 15 Maret 2026
My 2nd JAVA - GTGE
Sabtu, 14 Maret 2026
My First Java - GTGE
GTGE
https://github.com/dveag/naveGame
https://janbakerblogs899.blogspot.com/2013/03/animated-sprite-2-dimensions-with-gtge.html?m=1
https://nwcourses.github.io/oop/topic5.html
// Conceptual example of animation in a GTGE game
// Note: This requires the GTGE library to run
import com.golden.gamedev.Game;
import com.golden.gamedev.object.Animation;
import com.golden.gamedev.object.Sprite;
import java.awt.Graphics2D;
public class MyGame extends Game {
Animation anim;
Sprite sprite;
public void initResources() {
// Load sprite sheet
BufferedImage[] images = getImages("resources/player.png", 4, 1);
// Create animation (4 frames, 100ms delay)
anim = new Animation(images, 100);
// Create sprite
sprite = new Sprite(anim, 100, 100);
}
public void update(long elapsedTime) {
// Update animation and sprite
anim.update(elapsedTime);
sprite.update(elapsedTime);
}
public void render(Graphics2D g) {
// Draw sprite
sprite.render(g);
}
}
import com.golden.gamedev.Game;
import com.golden.gamedev.GameLoader;
import com.golden.gamedev.object.AnimatedSprite;
import com.golden.gamedev.object.SpriteGroup;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
public class AnimasiGTGE extends Game {
AnimatedSprite player;
SpriteGroup playerGroup;
@Override
public void initResources() {
// 1. Muat gambar animasi (contoh: walk1.png, walk2.png, walk3.png)
BufferedImage[] images = new BufferedImage[]{
getImage("images/walk1.png"),
getImage("images/walk2.png"),
getImage("images/walk3.png")
};
// 2. Buat AnimatedSprite dengan array gambar
player = new AnimatedSprite(images, 100, 100);
// 3. Atur kecepatan animasi (frame per detik)
player.setAnimationTimer(100);
player.setLoopAnim(true); // Animasi berulang
playerGroup = new SpriteGroup("Player Group");
playerGroup.add(player);
}
@Override
public void update(long elapsedTime) {
// Update animasi
player.update(elapsedTime);
}
@Override
public void render(Graphics2D g) {
// Gambar sprite
playerGroup.render(g);
}
public static void main(String[] args) {
GameLoader game = new GameLoader();
game.setup(new AnimasiGTGE(), new java.awt.Dimension(640, 480), false);
game.start();
}
}









































