Im looking for help on a script. I want the user to be able to able to drag and resize the windows in the interface as well as when the window goes full screen the backgound image fills the window.
class YouTubeJukebox(tk.Tk):
def __init__(self):
super().__init__()
self.title("YouTube Jukebox by Littch")
self.geometry("800x600")
# Load background image
self.bg_image = Image.open(r"C:\Users\Jack\Desktop\dj-8562307.jpg")
self.bg_image = self.bg_image.resize((800, 600), Image.LANCZOS)
self.bg_photo = ImageTk.PhotoImage(self.bg_image)
# Create a canvas and set the background image
self.canvas = tk.Canvas(self, width=800, height=600)
self.canvas.pack(fill="both", expand=True)
self.canvas.create_image(0, 0, image=self.bg_photo, anchor="nw")
# VLC Instance and Player Setup
self.vlc_instance = vlc.Instance()
self.player = self.vlc_instance.media_player_new()
self.player.event_manager().event_attach(vlc.EventType.MediaPlayerEndReached, self.on_song_end)
# Styling
style = ttk.Style(self)
style.configure('TButton', font=('Arial', 7), padding=5)
style.map('TButton', foreground=[('pressed', 'white'), ('active', 'white')],
background=[('pressed', '#3498DB'), ('active', '#3498DB')])
self.playlist_id_entry_style = {"bg": "#ECF0F1", "fg": "#34495E", "insertbackground": "#34495E"}
self.playlist_id_label_style = {"bg": "#2C3E50", "fg": "#FFFFFF"}
# Add widgets to the canvas
self.label = tk.Label(self, text="Enter YouTube Playlist ID:", **self.playlist_id_label_style)
self.label_window = self.canvas.create_window(400, 50, anchor="center", window=self.label)
self.playlist_id_entry = tk.Entry(self, width=50, **self.playlist_id_entry_style)
self.entry_window = self.canvas.create_window(400, 100, anchor="center", window=self.playlist_id_entry)
self.load_button = ttk.Button(self, text="Load Playlist", command=self.load_playlist)
self.load_button_window = self.canvas.create_window(400, 150, anchor="center", window=self.load_button)
self.listbox = tk.Listbox(self, width=80, height=15, bg="#424242", fg="#FFFFFF", selectbackground="#FF5722")
self.listbox_window = self.canvas.create_window(400, 300, anchor="center", window=self.listbox)
self.controls_frame = tk.Frame(self, bg="#212121")
self.controls_frame_window = self.canvas.create_window(400, 450, anchor="center", window=self.controls_frame)
button_style = {'width': 6, 'height': 1}
self.play_button = ttk.Button(self.controls_frame, text="Play", command=self.play_selected)
self.play_button.pack(side=tk.LEFT, padx=5, pady=5)
self.pause_button = ttk.Button(self.controls_frame, text="Pause", command=self.pause_audio)
self.pause_button.pack(side=tk.LEFT, padx=5, pady=5)
self.play_all_button = ttk.Button(self.controls_frame, text="Play All", command=self.play_all)
self.play_all_button.pack(side=tk.LEFT, padx=5, pady=5)
self.skip_back_button = ttk.Button(self.controls_frame, text="Skip Back", command=self.skip_back)
self.skip_back_button.pack(side=tk.LEFT, padx=5, pady=5)
self.skip_forward_button = ttk.Button(self.controls_frame, text="Skip Forward", command=self.skip_forward)
self.skip_forward_button.pack(side=tk.LEFT, padx=5, pady=5)
self.shuffle_button = ttk.Button(self.controls_frame, text="Shuffle", command=self.shuffle_playlist)
self.shuffle_button.pack(side=tk.LEFT, padx=5, pady=5)
self.save_button = ttk.Button(self.controls_frame, text="Save Playlist", command=self.save_playlist)
self.save_button.pack(side=tk.LEFT, padx=5, pady=5)
self.load_playlist_button = ttk.Button(self.controls_frame, text="Load Playlist", command=self.load_saved_playlist)
self.load_playlist_button.pack(side=tk.LEFT, padx=5, pady=5)
self.volume_label = tk.Label(self, text="Volume:", fg="#FFFFFF", bg="#212121")
self.volume_label_window = self.canvas.create_window(200, 500, anchor="center", window=self.volume_label)
self.volume_slider = tk.Scale(self, from_=0, to=100, orient=tk.HORIZONTAL, command=self.set_volume, length=300)
self.volume_slider.set(50)
self.volume_slider_window = self.canvas.create_window(400, 550, anchor="center", window=self.volume_slider)
self.equalizer_frame = tk.Frame(self, bg="#212121")
self.equalizer_frame_window = self.canvas.create_window(400, 600, anchor="center", window=self.equalizer_frame)
self.equalizer = vlc.AudioEqualizer()
self.create_equalizer_controls()
self.playlist = None
self.current_index = None
self.audio_urls = []
self.media_list = None
self.media_player = None
self.last_playlists_file = "last_playlists.json"
self.last_playlists = []
# Bindings for moving and resizing
self.bind_events()
def bind_events(self):
for widget in [self.label, self.playlist_id_entry, self.load_button, self.listbox, self.controls_frame, self.volume_label, self.volume_slider, self.equalizer_frame]:
widget.bind("<Button-1>", self.on_widget_click)
widget.bind("<B1-Motion>", self.on_drag)
widget.bind("<ButtonRelease-1>", self.on_release)
widget.bind("<Enter>", self.on_enter)
widget.bind("<Leave>", self.on_leave)
self.drag_data = {"x": 0, "y": 0, "widget": None}
self.resize_data = {"resizing": False, "widget": None, "direction": None}
def on_widget_click(self, event):
widget = event.widget
self.drag_data["widget"] = widget
self.drag_data["x"] = event.x
self.drag_data["y"] = event.y
if self.resize_data["resizing"]:
self.resize_data["widget"] = widget
def on_drag(self, event):
widget = self.drag_data["widget"]
if widget and not self.resize_data["resizing"]:
x = widget.winfo_x() + event.x - self.drag_data["x"]
y = widget.winfo_y() + event.y - self.drag_data["y"]
widget.place(x=x, y=y)
elif self.resize_data["resizing"]:
self.resize_widget(event)
def on_release(self, event):
self.drag_data["widget"] = None
self.resize_data["resizing"] = False
def on_enter(self, event):
widget = event.widget
widget.update_idletasks()
bbox = widget.winfo_geometry().split('+')[0].split('x')
width = int(bbox[0])
height = int(bbox[1])
if abs(event.x - width) < 5 or abs(event.y - height) < 5:
self.canvas.config(cursor="sizing")
self.resize_data["resizing"] = True
else:
self.canvas.config(cursor="")
def on_leave(self, event):
self.canvas.config(cursor="")
def resize_widget(self, event):
widget = self.resize_data["widget"]
widget.update_idletasks()
width = widget.winfo_width()
height = widget.winfo_height()
if abs(event.x - width) < 5:
widget.config(width=event.x)
elif abs(event.y - height) < 5:
widget.config(height=event.y)