Skip to content

Instantly share code, notes, and snippets.

@HeIIow2
Created July 26, 2021 22:22
Show Gist options
  • Save HeIIow2/089cd8d702fcbb2408742cddf54df3d6 to your computer and use it in GitHub Desktop.
Save HeIIow2/089cd8d702fcbb2408742cddf54df3d6 to your computer and use it in GitHub Desktop.
uhm the source code so u can trust me
import tkinter
from PIL import Image, ImageSequence
from PIL.ImageTk import PhotoImage
class Gif:
def __init__(self, master, rowspan=1, size=(200, 200), bg='#666', padx=5, pady=5):
gif_path = 'anime_girl_asking.gif'
# self.frames = [PhotoImage(file=gif_path, format='gif -index %i' % i) for i in range(self.frameCnt)]
frames_pil = self.unpack_gif(gif_path)
for i in range(len(frames_pil)):
frames_pil[i].thumbnail(size)
self.frames = [PhotoImage(frames_pil[i]) for i in range(len(frames_pil))]
self.index = 0
self.gif_label = tkinter.Label(master, image=self.frames[self.index], bg=bg)
self.gif_label.grid(row=0, column=0, rowspan=rowspan, padx=padx, pady=pady)
@staticmethod
def unpack_gif(src):
# Load Gif
image = Image.open(src)
# Get frames and disposal method for each frame
frames = []
disposal = []
for gifFrame in ImageSequence.Iterator(image):
disposal.append(gifFrame.disposal_method)
frames.append(gifFrame.convert('P'))
# Loop through frames, and edit them based on their disposal method
output = []
lastFrame = None
thisFrame = None
for i, loadedFrame in enumerate(frames):
# Update thisFrame
thisFrame = loadedFrame
# If the disposal method is 2
if disposal[i] == 2:
# Check that this is not the first frame
if i != 0:
# Pastes thisFrames opaque pixels over lastFrame and appends lastFrame to output
lastFrame.paste(thisFrame, mask=thisFrame.convert('RGBA'))
output.append(lastFrame)
else:
output.append(thisFrame)
# If the disposal method is 1 or 0
elif disposal[i] == 1 or disposal[i] == 0:
# Appends thisFrame to output
output.append(thisFrame)
# If disposal method if anything other than 2, 1, or 0
else:
raise ValueError(
'Disposal Methods other than 2:Restore to Background, 1:Do Not Dispose, and 0:No Disposal are supported at this time')
# Update lastFrame
lastFrame = loadedFrame
return output
def update(self):
self.index += 1
self.index = self.index % len(self.frames)
self.gif_label.configure(image=self.frames[self.index])
class Label:
def __init__(self, master, text, row=0, column=1, bg='#666', font='#eee', padx=5, pady=5):
label = tkinter.Label(master, text=text, bg=bg, fg=font, padx=padx, pady=pady)
label.grid(row=row, column=column)
class Entry:
def __init__(self, master, row=0, column=1, padx=8, pady=3):
self.entry = tkinter.Entry(master)
self.entry.grid(row=row, column=column, padx=padx, pady=pady)
def clear_entry(self):
self.entry.delete(0, 'end')
class Entries:
def __init__(self, master, row=0, column=1, bg='#666', font='#eee'):
frame = tkinter.Frame(master, bg=bg)
frame.grid(row=row, column=column)
card_number_label = Label(frame, 'Card number: ', row=0, column=0)
self.card_number_entry = Entry(frame, row=0, column=1)
expiry_date_label = Label(frame, 'Expiry date: ', row=1, column=0)
self.expiry_date_entry = Entry(frame, row=1, column=1)
security_code_label = Label(frame, 'Security code: ', row=2, column=0)
self.security_code_entry = Entry(frame, row=2, column=1)
def clear_entries(self):
self.card_number_entry.clear_entry()
self.expiry_date_entry.clear_entry()
self.security_code_entry.clear_entry()
class Input:
def __init__(self, master, bg='#666', font='#eee', button_color='#777', on_press_color='#888'):
master.rowconfigure(2, weight=1)
self.question = Label(master, 'H-hi there...\n'
'Do you th-think I could have your\n'
'credit card information, p-please?',
row=0, column=0, pady=7)
self.entries = Entries(master, row=1, column=0)
self.button = tkinter.Button(master, text='Th-thanks', command=self.submit, bg=button_color, fg=font, bd=0, activebackground=on_press_color, activeforeground=font)
self.button.grid(row=2, column=0, padx=5, pady=5, sticky='nsew')
def submit(self):
self.entries.clear_entries()
class Asking:
def __init__(self, master, bg='#444', fg='#666', font='#eee'):
master.configure(bg=bg)
master.title('pweaaaaase Senpai')
master.resizable(width=False, height=False)
self.frame = tkinter.Frame(master, bg=bg)
self.frame.grid(row=0, column=0)
self.gif = Gif(self.frame, rowspan=3, bg=bg)
self.input_frame = tkinter.Frame(master, bg=fg)
self.input_frame.grid(row=0, column=1, padx=10, sticky='ns', pady=7)
self.input = Input(self.input_frame, bg=fg, font=font)
def update(self):
self.gif.update()
root.after(100, self.update)
root = tkinter.Tk()
asking = Asking(root)
root.after(0, asking.update)
root.mainloop()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment