“My Mini Pokédex” is an application built in Python made to mimic a Pokédex.
Upon launch, the user can scroll through each of the entries with the arrows at the bottom, or use the list widget on the right.
You can search the list of entries by name with the search bar, or filter them by type with the drop-down menu.
To get its data, the application accesses an online database I made that contains the first original 151 Pokémon. The UI was created with Qt Designer, and imported into the main Python file. The sprites are official Pokémon sprites, but the rest of the artwork I did myself in Aseprite. The font is “Alterebro” by Jorge Moreno.
Below is all the code I wrote for the main application.
from PyQt5 import QtWidgets, uic, QtGui
import resources
from PyQt5.QtWidgets import QApplication, QMainWindow
import sys, os
import pymysql
class MyWindow(QMainWindow):
def __init__(self):
super(MyWindow, self).__init__()
uic.loadUi(os.path.join(os.path.dirname(os.path.abspath(__file__)), "pokedexUI.ui"), self)
# UI Connections
self.leftBtn.clicked.connect(self.leftBtnClicked)
self.rightBtn.clicked.connect(self.rightBtnClicked)
self.comboBox.activated[str].connect(self.comboBoxChanged)
self.listWidget.itemSelectionChanged.connect(self.listWidgetSelectionChanged)
self.searchBar.textChanged.connect(self.searchBarChanged)
# App displays all entries at first
global allEntries
allEntries = self.databaseData("All", "All")
for row in allEntries:
self.listWidget.addItem(row[0])
self.loadEntries("All", "All")
self.show()
# Load appropriate entries
def loadEntries(self, row, value):
validEntries = self.databaseData(row, value)
validEntriesNames = []
for entry in validEntries:
validEntriesNames.append(entry[0])
# Entries that meet filter criteria are shown, otherwise they are hidden
setFirst = False
for i in range(0,self.listWidget.count()):
row = self.listWidget.item(i)
if row.text() in validEntriesNames:
row.setHidden(False)
# Select the first visible entry
if setFirst == False:
self.listWidget.setCurrentItem(row)
setFirst = True
else:
row.setHidden(True)
# Fetch data from database
def databaseData(self, row, value):
db = pymysql.connect(
host="sql9.freesqldatabase.com",
user="sql9591398",
password="VWvBl4fp5U",
database="sql9591398"
)
cursor = db.cursor()
# Search for all pokemon
if value == "All":
sql = "SELECT * FROM Pokemon"
# Search for both primary and secondary typings
elif row == "Type":
sql = "SELECT * FROM Pokemon WHERE Type1 = '{type}' OR Type2='{type}'".format(type=value)
# Search for a name starting with the value
elif row == "StartsName":
sql = "SELECT * FROM Pokemon WHERE Name like '{name}%'".format(name=value)
else:
# General search with provided row and value
sql = "SELECT * FROM Pokemon WHERE {row} = '{type}'".format(row=row,type=value)
# Attempt to fetch data
try:
cursor.execute(sql)
return cursor.fetchall()
except:
print("Error: Unable to fetch data")
db.close()
# Filter by type with the combo box
def comboBoxChanged(self):
self.loadEntries("Type", self.comboBox.currentText())
self.searchBar.clear()
def listWidgetSelectionChanged(self):
pokemon = self.databaseData("Name", self.listWidget.selectedItems()[0].text())[0]
self.nameLabel.setText(pokemon[0])
self.categoryLabel.setText("The " + pokemon[1] + " Pokémon")
self.numberLabel.setText("#" + pokemon[2])
self.type1Label.setText(pokemon[3])
self.type2Label.setText(pokemon[4])
self.notesLabel.setText(pokemon[5])
imagePath = ":/images/images/pokemon/" + pokemon[0] + ".png"
self.pictureLabel.setPixmap(QtGui.QPixmap(imagePath))
def searchBarChanged(self):
print(self.searchBar.toPlainText())
if self.searchBar.toPlainText() == "":
return
self.loadEntries("StartsName", self.searchBar.toPlainText())
# Scroll back on visible entries
def leftBtnClicked(self):
if self.listWidget.currentItem() == self.currentVisibleEntries()[0]:
return
newRow = self.listWidget.currentRow() - 1
while self.listWidget.item(newRow).isHidden() == True:
newRow -= 1
self.listWidget.setCurrentRow(newRow)
# Scroll forward on visible entries
def rightBtnClicked(self):
if self.listWidget.currentItem() == self.currentVisibleEntries()[-1]:
return
newRow = self.listWidget.currentRow() + 1
while self.listWidget.item(newRow).isHidden() == True:
newRow += 1
self.listWidget.setCurrentRow(newRow)
def currentVisibleEntries(self):
visible = []
for i in range(0,self.listWidget.count()):
row = self.listWidget.item(i)
if row.isHidden() == False:
visible.append(row)
return visible
def window():
app = QApplication(sys.argv)
win = MyWindow()
sys.exit(app.exec_())
window()