Program Analisis Kerusuhan
Ini adalah aplikasi analisis kerusuhan. Kumpulkan data menggunakan API kerusuhan dan tunjukkan berbagai data kepada pengguna. Tidak terlalu mendalam.
File GUI - File ini adalah file GUI untuk program tersebut. Saya memiliki kelas yang membuat sisa frame program. Setelah mengklik tombol untuk mencari pemanggil, itu akan mengumpulkan data dari kelas lain dalam game dan mengembalikan daftar 5 data dengan masing-masing jenis yang berbeda (membunuh, mati, membantu, penglihatan, menang). Saya memiliki dua variabel global yang tidak ingin saya gunakan di kelas DataCollected, sepertinya saya tidak dapat menemukan cara untuk tidak menggunakannya.
import tkinter as tk
from tkinter import font as tkfont
from getId import id_collected
from games import Game
from wins import is_player_good
class RiotApp(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
self.title_font = tkfont.Font(family='Helvetica', size=18, weight="bold", slant="italic")
container = tk.Frame(self)
container.pack(side="top", fill="both", expand=True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
for F in (StartPage, MenuPage, KillPage, DeathPage, CsPage, HonestPage):
page_name = F.__name__
frame = F(parent=container, controller=self)
self.frames[page_name] = frame
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame("StartPage")
def show_frame(self, page_name):
frame = self.frames[page_name]
frame.tkraise()
class StartPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
c = DataCollected()
self.controller = controller
self.label = tk.Label(self, text="Enter summoner name:", width = 20, font = ("bold", 20))
self.label.place(x=90,y=53)
self.entry = tk.Entry(self)
self.entry.place(x=190,y=130)
self.button = tk.Button(self, text="Search",width = 20, bg = 'brown', fg = 'white',
command=lambda: data_collected(self,controller))
self.button.place(x=180,y=200)
def data_collected(self,controller):
name = self.entry.get()
Key = '****************************************'
a = id_collected(name, Key)
if a != 'NO':
controller.show_frame("MenuPage")
c.collect_data(name, Key)
else:
controller.show_frame('StartPage')
class DataCollected():
def collect_data(self, name, Key):
num_games = 20
game = Game()
accId = id_collected(name, Key)
game_list = game.find_game_ids(accId, Key, num_games)
global stat_list
stat_list = game.game_data(game_list, Key, name, num_games)
global honest
honest = is_player_good(stat_list[5])
class MenuPage(tk.Frame,DataCollected):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
label = tk.Label(self, text="Main Menu", font=controller.title_font)
label.place(x=180,y=50)
button = tk.Button(self, text="Kill Average",width = 20, bg = 'brown', fg = 'white',
command=lambda: controller.show_frame("KillPage")).place(x=180,y=100)
button = tk.Button(self, text="Death Average",width = 20, bg = 'brown', fg = 'white',
command=lambda: controller.show_frame("DeathPage")).place(x=180,y=150)
button = tk.Button(self, text="Cs Average",width = 20, bg = 'brown', fg = 'white',
command=lambda: controller.show_frame("CsPage")).place(x=180,y=200)
button = tk.Button(self, text="Honest Truth",width = 20, bg = 'brown', fg = 'white',
command=lambda: controller.show_frame("HonestPage")).place(x=180,y=250)
button = tk.Button(self, text="Back",width = 20, bg = 'brown', fg = 'white',
command=lambda: controller.show_frame("StartPage")).place(x=180,y=300)
class KillPage(tk.Frame, DataCollected):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
self.label = tk.Label(self, text = 'Kills Average', width=20,font=("bold", 20))
self.label.place(x=90, y=100)
self.label1 = tk.Label(self, text = ' ', width=20,font=("bold", 20))
self.label1.place(x=90, y=150)
self.label1.after(1000, self.refresh_label)
self.button = tk.Button(self, text = "Back", width = 20, bg = 'brown', fg = 'white',
command=lambda: controller.show_frame("MenuPage")).place(x=180,y=300)
def refresh_label(self):
self.label1.configure(text = stat_list[1])
self.label1.after(1000,self.refresh_label)
class DeathPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
self.label = tk.Label(self, text = 'Deaths Average', width=20,font=("bold", 20))
self.label.place(x=90, y=100)
self.label2 = tk.Label(self, text="", width=20,font=("bold", 20))
self.label2.place(x=90, y=150)
self.label2.after(1000, self.refresh_label)
self.button = tk.Button(self, text="Back", width = 20, bg = 'brown', fg = 'white',
command=lambda: controller.show_frame("MenuPage")).place(x=180,y=300)
def refresh_label(self):
self.label2.configure(text = stat_list[0])
self.label2.after(1000,self.refresh_label)
class CsPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
self.label = tk.Label(self, text = 'Cs Average', width=20,font=("bold", 20))
self.label.place(x=90, y=100)
self.label3 = tk.Label(self, text="", width=20,font=("bold", 20))
self.label3.place(x=90,y=150)
self.label3.after(1000, self.refresh_label)
self.button = tk.Button(self, text="Back", width = 20, bg = 'brown', fg = 'white',
command=lambda: controller.show_frame("MenuPage")).place(x=180,y=300)
def refresh_label(self):
self.label3.configure(text = stat_list[4])
self.label3.after(1000,self.refresh_label)
class HonestPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
self.label = tk.Label(self, text = 'Honest Truth', width=20,font=("bold", 20))
self.label.place(x=90, y=100)
self.label4 = tk.Label(self, text = " ", width=20,font=("bold", 20))
self.label4.place(x=90,y=150)
self.label4.after(1000, self.refresh_label())
self.button = tk.Button(self, text = "Back", width = 20, bg = 'brown', fg = 'white',
command=lambda: controller.show_frame("MenuPage")).place(x=180,y=300)
def refresh_label(self):
self.label4.configure(text = honest)
self.label4.after(1000,self.refresh_label)
if __name__ == "__main__":
stat_list = [1,1,1,1,1,1,1]
honest = ' '
root = RiotApp()
root.geometry("500x500")
root.mainloop()
File game - File ini dimulai dengan mengumpulkan ID game dan menggunakan ID game tersebut untuk mengumpulkan statistik summoner tersebut di masing-masing dari 20 game tersebut. Kemudian mengembalikannya ke file gui.
import requests
class Game:
def find_game_ids(self, accId, key, num_games):
i = 0
GAMEID = []
num_games = 20
url_match_list = ('https://na1.api.riotgames.com/lol/match/v4/matchlists/by-account/' + (accId) + '?queue=420&endIndex=20&api_key=' + (key))
response2 = requests.get(url_match_list)
# Adding 20 games into the list
while num_games > 0:
GAMEID.append('https://na1.api.riotgames.com/lol/match/v4/matches/'+str(response2.json()['matches'][i]['gameId']) + '?api_key=' + (key))
i = i + 1
num_games = num_games - 1
return GAMEID
def game_data(self, game_list, key, sumName, num_games):
wins = []
deaths = []
deaths = []
kills = []
assists = []
visions = []
csTotal = []
# Finding the data of said summoner in each game id
for urls in game_list:
response = requests.get(urls)
resp_json = response.json()
Loop = 0
index = 0
while Loop <= 10:
if resp_json['participantIdentities'][index]['player']['summonerName'] != sumName:
Loop = Loop+1
index = index+1
elif resp_json['participantIdentities'][index]['player']['summonerName'] == sumName:
deaths.append(resp_json['participants'][index]['stats']['deaths'])
kills.append(resp_json['participants'][index]['stats']['kills'])
assists.append(resp_json['participants'][index]['stats']['assists'])
visions.append(resp_json['participants'][index]['stats']['visionScore'])
csTotal.append(resp_json['participants'][index]['stats']['totalMinionsKilled'])
wins.append(resp_json['participants'][index]['stats']['win'])
break
# Finding avg of each stat
deaths = sum(deaths)/num_games
kills = sum(kills)/num_games
assists = sum(assists)/num_games
visions = sum(visions)/num_games
csTotal = sum(csTotal)/num_games
wins = sum(wins)/num_games
stat_list = []
stat_list.append(deaths) #0
stat_list.append(kills) #1
stat_list.append(assists) #2
stat_list.append(visions) #3
stat_list.append(csTotal) #4
stat_list.append(wins) #5
return stat_list
Dapatkan file id - File ini mengumpulkan id pemanggil untuk kelas Game dalam file game.
import requests
def id_collected(sumName, key):
# COLLECTING DATA TO BE INSERTING FOR MATCHLIST DATABASE
url = ('https://na1.api.riotgames.com/lol/summoner/v4/summoners/by-name/'+(sumName)+'?api_key='+
(key))
response = requests.get(url)
if response.status_code == 200:
accId = (response.json()['accountId'])
return accId
else:
accId = 'NO'
return accId
win file - File ini akan digunakan stat_list[5]untuk menentukan apakah pemain sudah bagus dalam 20 game terakhir dan akan mengembalikan sebuah frase.
import random
def is_player_good(winlist):
if winlist < 0.33:
message = ['DIS MANE STINKS', 'run while you can', 'I repeat, YOU ARE NOT WINNING THIS', 'I predict a fat L', 'Have fun trying to carry this person', 'He is a walking trash can', 'He needs to find a new game', 'BAD LUCK!!!']
return (random.choice(message))
elif winlist > 0.33 and winlist <= 0.5:
message = ['Losing a bit', 'Not very good', 'He needs lots of help', 'Your back might hurt a little', 'Does not win much']
return (random.choice(message))
elif winlist > 0.5 and winlist <= 0.65:
message = ['He is ight', 'He can win a lil', 'You guys have a decent chance to win', 'Serviceable', 'Should be a dub']
return (random.choice(message))
elif winlist > 0.65:
message = ['DUB!', 'You getting carried', 'His back gonna hurt a bit', 'winner winner chicken dinner', 'Dude wins TOO MUCH', 'You aint even gotta try', 'GODLIKE']
return (random.choice(message))
Jawaban
Variabel lokal
Karena Fadalah variabel lokal - meskipun secara teknis merupakan referensi ke kelas, dan kelas dikapitalisasi - Fharus menggunakan huruf kecil. Juga, layak memiliki nama yang bukan hanya satu huruf. Keyjuga harus menggunakan huruf kecil.
Lambdas
Ini:
command=lambda: data_collected(self,controller))
tidak pantas menjadi lambda. Karena Anda juga menyimpan controllerpada self, lebih baik untuk hanya membuat metode di kelas untuk ini, dan lulus referensi terikat metode itu untuk command.
Daftar sensitif posisi
stat_list[5]
adalah bau kode. Dugaan saya, ini adalah daftar statistik, di mana setiap posisi dalam daftar memiliki jenis statistik yang berbeda. Ini harus diubah menjadi kelas, atau setidaknya, tupel bernama.
Penambahan di tempat
i = i + 1
seharusnya
i += 1
Pengujian jarak
winlist > 0.33 and winlist <= 0.5
seharusnya
0.33 < winlist <= 0.5
Parens
Ini:
return (random.choice(message))
tidak membutuhkan tanda kurung luar dan harus menghapusnya.
Salah ketik?
Masuk He is ight.