Python Forum
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Movie Search
#2
Updated version. Still haven't worked on the messages box part. May remove. Not sure yet.

# Do the imports
from imdb import Cinemagoer
import tkinter as tk
from tkinter import ttk
from urllib.request import urlopen
from PIL import ImageTk, Image
import io

class Database:
    def __init__(self):
        self.query = Cinemagoer()

    def search_person(self, name):
        return self.query.search_person(name.strip())[0]
    
    def get_person(self, id):
        return self.query.get_person(id.strip())
    
    def search_movie(self, name):
        return self.query.search_movie(name.strip())
    
    def get_movie(self, id):
        return self.query.get_movie(id.strip())
    

class Window:
    def __init__(self, parent):
        parent.columnconfigure(0, weight=1)
        parent.rowconfigure(0, weight=1)
        parent.minsize(1204, 768)
        parent.title('Movie Search')

        # Containers
        container = tk.Frame(parent, bg='#cecece')
        container.grid(column=0, row=0, sticky='news', padx=5, pady=5)
        container.grid_columnconfigure(0, weight=3)
        container.grid_rowconfigure(3, weight=3)

        # Header
        headerframe = tk.Frame(container, bg='#333333')
        headerframe['highlightbackground'] = '#000000'
        headerframe['highlightcolor'] = '#000000'
        headerframe['highlightthickness'] = 1
        headerframe.grid(column=0, row=0, sticky='new', pady=1)
        headerframe.grid_columnconfigure(0, weight=3)

        # Messages
        msgframe = tk.Frame(container, bg='#333333')
        msgframe['highlightbackground'] = '#000000'
        msgframe['highlightcolor'] = '#000000'
        msgframe['highlightthickness'] = 1
        msgframe.grid(column=0, row=1, sticky='new', pady=1)
        msgframe.grid_columnconfigure(1, weight=3)

        # Search Fields
        searchframe = tk.Frame(container, bg='#555555')
        searchframe.grid(column=0, row=2, sticky='new')
        for i in range(5):
            weight = 4 if i == 3 else 1
            searchframe.columnconfigure(i, weight=weight, uniform='cols')

        dataframe = tk.Frame(container,bg='#555555')
        dataframe.grid(column=0, row=3, sticky='news')
        dataframe.columnconfigure(0, weight=3, uniform='data')
        dataframe.columnconfigure(1, weight=3, uniform='data')
        dataframe.rowconfigure(0, weight=3)

        leftframe = tk.Frame(dataframe, bg='#555555')
        leftframe.grid(column=0, row=0, sticky='news', padx=2)
        leftframe.grid_columnconfigure(0, weight=3)
        leftframe.grid_rowconfigure(0, weight=3)
        
        rightframe = tk.Frame(dataframe, bg='white', padx=10, pady=10)
        rightframe.grid(column=1, row=0, sticky='news')
        rightframe.grid_columnconfigure(0, weight=3)
        rightframe.grid_rowconfigure(0, weight=3)

        footerframe = tk.Frame(container)
        footerframe.grid(column=0, row=4, sticky='new')

        # Label and field widgets
        label = tk.Label(headerframe, text='Movie Search')
        label['bg'] = '#555555'
        label['fg'] = '#ffffff'
        label['font'] = (None, 28, 'bold')
        label.grid(column=0, row=0, sticky='new', ipadx=10, ipady=5)

        label = tk.Label(msgframe, text='MSG: ', bg='#555555', fg='#ffffff')
        label['font'] = (None, 12, 'bold')
        label.grid(column=0, row=0, padx=2, pady=3, ipadx=3, ipady=3)

        self.msg = tk.Label(msgframe, anchor='w', bg='#555555', fg='cyan')
        self.msg['font'] = (None, 12, 'normal')
        self.msg.grid(column=1, row=0, sticky='new', padx=2, pady=3, ipadx=3, ipady=3)

        label = tk.Label(searchframe, text='Searchby:', bg='#555555', fg='#ffffff')
        label['font'] = (None, 12, 'bold')
        label.grid(column=0, row=0, padx=2, pady=4, sticky='new')

        options = ['Person', 'Movie']
        self.term = tk.StringVar()
        self.term.set(options[0])
        option = tk.OptionMenu(searchframe, self.term, *options)
        option['font'] = (None, 10, 'normal')
        option.grid(column=1, row=0, padx=2, sticky='new')

        label = tk.Label(searchframe, text='Search for:', bg='#555555', fg='#ffffff')
        label['font'] = (None, 12, 'bold')
        label.grid(column=2, row=0, padx=4, pady=4, sticky='new')

        self.entry = tk.Entry(searchframe)
        self.entry['font'] = (None, 12, 'normal')
        self.entry.grid(column=3, row=0, padx=4, pady=4, sticky='new')

        self.button = tk.Button(searchframe, text='Search', cursor='hand2')
        self.button.grid(column=4, row=0, padx=2, sticky='new')

 
        self.tree = ttk.Treeview(leftframe, selectmode='browse', show='headings', cursor='hand2')
        self.tree.grid(column=0, row=0, sticky='news')

        tree_scrollbar = tk.Scrollbar(leftframe, orient='vertical', command=self.tree.yview)
        self.tree.configure(yscrollcommand=tree_scrollbar.set)
        tree_scrollbar.configure(bg='#444444', activebackground='#666666', cursor='hand2')
        tree_scrollbar.grid(column=1, row=0, sticky='ns', padx=4)

        self.tree2 = tk.Text(rightframe, wrap=tk.WORD)
        self.tree2['highlightthickness'] = 0
        self.tree2['borderwidth'] = 0

        self.tree2['state'] = 'disabled'
        self.tree2.grid(column=0, row=0, sticky='news')

        tree2_scrollbar = tk.Scrollbar(rightframe, orient='vertical', command=self.tree2.yview)
        self.tree2.configure(yscrollcommand=tree2_scrollbar.set)
        tree2_scrollbar.configure(bg='#444444', activebackground='#666666', cursor='hand2')
        tree2_scrollbar.grid(column=1, row=0, sticky='ns', padx=4)

        footer = tk.Label(footerframe, text='mypython.org', bg='#333333', fg='#ffffff')
        footer['font'] = (None, 12, 'italic bold')
        footer['cursor'] = 'hand2'
        footer.pack(expand=True, fill='x', pady=5, ipady=3)


class Controller:
    def __init__(self, window, database):
        self.window = window
        self.database = database

        # Button Commands
        self.window.button['command'] = self.search
        self.window.entry.bind('<Return>', lambda event: self.search())

        # Clear trees
        self.window.term.trace('w', self.clear)

        # Bind treeview
        self.window.tree.bind('<<TreeviewSelect>>', self.details)     

    def clear(self, write, index, mode):
        self.window.entry.delete(0, 'end')
        self.window.tree.delete(*self.window.tree.get_children())
        self.window.tree2['state'] = 'normal'
        self.window.tree2.delete('1.0', 'end')
        self.window.tree2['state'] = 'disabled'
       
    def search(self):
            name = self.window.entry.get().strip()
            self.clear(None, None, None)
            self.window.tree.tag_configure('oddrow', background='#ccceee')
            self.window.tree.tag_configure('evenrow', background='#eeefff')

            if self.window.term.get() == 'Person':
                if name:
                    person = self.database.search_person(name)
                    data = self.get_person(person.personID)
                    data.sort()

                    self.window.tree['columns'] = ['title', 'id']
                    self.window.tree.column('title', minwidth=0, stretch='yes')
                    self.window.tree.column('id', minwidth=0, width=100, stretch='no')
                    self.window.tree.heading('title', text=f'Title\'s')
                    self.window.tree.heading('id', text=f'Movie ID')
                    for index, movie in enumerate(data):
                        if index % 2 == 0:
                            self.window.tree.insert('', 'end', values=(movie[0], movie[1],), tags=('oddrow',))
                        else:
                            self.window.tree.insert('', 'end', values=(movie[0],movie[1]), tags=('evenrow',))
            
            elif self.window.term.get() == 'Movie':
                if name:
                    data = self.database.search_movie(name)
                    
                    data.sort()

                    self.window.tree['columns'] = ['title', 'id']
                    self.window.tree.column('title', minwidth=0, stretch='yes')
                    self.window.tree.column('id', minwidth=0, width=100, stretch='no')
                    self.window.tree.heading('title', text=f'Title\'s')
                    self.window.tree.heading('id', text=f'Movie ID')
                    for index, movie in enumerate(data):
                        if index % 2 == 0:
                            self.window.tree.insert('', 'end', values=(movie.get('title'), movie.movieID,), tags=('oddrow',))
                        else:
                            self.window.tree.insert('', 'end', values=(movie.get('title'), movie.movieID,), tags=('evenrow',))

    def get_person(self, personid):
        person = self.database.get_person(personid)
        jobs = [job for job in person.get('filmography')]
        movies = [movie for movie in person['filmography'][jobs[0]]]
        titles = []
        for movie in movies:
            titles.append((movie.get('title'), movie.movieID))
        return titles
    
    def search_movie(self, name):
        return self.database.search_movie(name)
    
    def get_movie(self, movieid):
        return self.database.get_movie(str(movieid))

    def details(self, event):

        try:
            item = self.window.tree.focus()
            movieid = self.window.tree.item(item)['values'][1]
            data = self.get_movie(movieid)
        except IndexError:
            pass
        else:
            title = data.get('title')
            year = data.get('production status') if 'production status' in data.keys() else data.get('year')
            cover = data.get('full-size cover url')
            cast = [name.get('name') for name in data.get('cast')]
            plot_outline = data.get('plot outline')
            aired = data.get('original air date')
            rating = data.get('rating')

            img_url = urlopen(cover).read()
            img = Image.open(io.BytesIO(img_url))
            img = img.resize((300,400))
            image = ImageTk.PhotoImage(img)

            alist = [f'Title: {title}', 'img',
                     f'\n\nYear: {year}', f'Aired: {aired}',
                     f'Rating: {rating}', f'Plot Outline:\n{plot_outline}', f'Cast:\n{", ".join(cast)}']
            self.window.tree2['state'] = 'normal'
            self.window.tree2.delete('1.0', 'end')
            for index, data in enumerate(alist):
                    if data == 'img':
                        self.window.tree2.image_create('end', image=image)
                    else:
                        self.window.tree2.insert('end', f'{data}\n\n')
            self.window.tree2['state'] = 'disabled'
            image.bk=image


if __name__ == '__main__':
    root = tk.Tk()
    controller = Controller(Window(root), Database())
    img = urlopen('https://my-python.org/images/png/ratt.png')
    data = img.read()
    image = tk.PhotoImage(data=data)
    root.wm_iconphoto(True, image)
    root.mainloop()
I welcome all feedback.
The only dumb question, is one that doesn't get asked.
My Github
How to post code using bbtags


Reply


Messages In This Thread
Movie Search - by menator01 - Sep-07-2023, 04:36 AM
RE: Movie Search - by menator01 - Sep-10-2023, 09:59 PM
RE: Movie Search - by menator01 - Sep-15-2023, 01:30 AM
RE: Movie Search - by gluke15 - Oct-30-2023, 03:13 PM
RE: Movie Search - by EdwardMatthew - Jan-24-2024, 12:29 PM

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020