updated mainFrame

This commit is contained in:
Falko Victor Habel 2024-10-10 09:37:41 +02:00
parent 50b5470ae8
commit e15835e8cd
1 changed files with 110 additions and 15 deletions

View File

@ -1,7 +1,11 @@
from collections import deque
import customtkinter as ctk
from views.mainScreen import MainFrame
from models.data import TextData
from Ai.interence import VeraMindInference
from utils.database.database import FakeNewsChecker
from models.provider import Provider
from collections import Counter
from Ai.llm import ArticleRater
BAD_WORDS = ["FAKE", "SATIRE", "Fake", "fake"]
@ -12,24 +16,39 @@ WORDS = BAD_WORDS + GOOD_WORDS
class MainFrameController:
def __init__(self,frame:MainFrame) -> None:
"""
Controller class for the main frame of the application.
Handles user interactions, data processing, and database operations.
"""
def __init__(self, frame: MainFrame) -> None:
"""
Initialize the controller with the main frame and required components.
:param frame: The main frame of the application
"""
self.frame = frame
self.model_inference = VeraMindInference('VeraMind-Mini')
self.db = FakeNewsChecker()
self.update_provider_list()
self.rater = ArticleRater()
def get_textdata(self) -> TextData:
def get_text_data(self) -> TextData:
"""
Retrieve text data from the UI input fields.
:return: TextData object containing URL and text content
"""
text_data = TextData()
text_data.url = self.frame.entry_url.get()
if text_data.text_from_url():
if not text_data.text_from_url():
text_data.text = self.frame.input_textbox.get("0.0", "end")
return text_data
def press_check_button(self):
text_data = self.get_textdata()
print(text_data.text)
self.prediction(text_data)
self._predict(text_data)
self.frame.output_textbox.configure(state="normal")
self.frame.output_textbox.delete("0.0", "end")
@ -55,7 +74,8 @@ class MainFrameController:
self.process_highlighting(highlight_buffer)
self.frame.output_textbox.configure(state="disabled")
self.update_provider_list()
def process_highlighting(self, highlight_buffer):
start_index = self.frame.output_textbox.index(f"end-{sum(len(c) for c in highlight_buffer)}c")
end_index = self.frame.output_textbox.index("end")
@ -83,11 +103,86 @@ class MainFrameController:
self.frame.output_textbox.tag_config(tag_name, foreground=GOOD_COLOR)
start = pos + len(word)
def prediction(self, text_data:TextData) -> TextData:
def _predict(self, text_data: TextData) -> TextData:
"""
Make a prediction using the VeraMind model.
:param text_data: TextData object containing the text to analyze
:return: Updated TextData object with prediction results
"""
result = self.model_inference.predict(text_data.text)
text_data.confidence = result["confidence"]
text_data.result = result["result"]
print(f"Prediction: {text_data.result}")
print(f"Confidence: {text_data.confidence}")
return text_data
text_data.result = result["result"]
text_data.is_fake_news = result["is_fake"]
return text_data
def _add_to_db(self, text_data: TextData) -> None:
"""
Add the analyzed data to the database.
:param text_data: TextData object containing the analyzed information
"""
self.db.insert_data(url=text_data.url, anbieter=text_data.get_provider(),is_fake_news= text_data.is_fake_news)
def _fetch_db_data(self):
self.text_data_list = []
data = self.db.fetch_data()
if data:
for row in data:
print(f"ID: {row[0]}, URL: {row[1]}, Anbieter: {row[2]}, Fake News: {'Ja' if row[3] else 'Nein'}")
text_data = TextData(url=row[1], provider=row[2], is_fake_news= row[3])
self.text_data_list.append(text_data)
def sort_provider(self, text_data_list):
# Gruppiere TextData-Objekte nach Provider
provider_groups = {}
for text_data in text_data_list:
if text_data.provider:
if text_data.provider not in provider_groups:
provider_groups[text_data.provider] = []
provider_groups[text_data.provider].append(text_data)
# Zähle die Häufigkeit jedes Providers
provider_counts = Counter(text_data.provider for text_data in text_data_list if text_data.provider)
# Erstelle und sortiere die Provider-Liste
sorted_providers = [
Provider(name, count, provider_groups.get(name, []))
for name, count in sorted(provider_counts.items(), key=lambda x: x[1], reverse=True)
]
return sorted_providers
def update_provider_list(self):
self._fetch_db_data()
# Lösche vorhandene Einträge in der scrollbaren Ansicht
for widget in self.frame.provider_container.winfo_children():
widget.destroy()
# Sortiere und zähle die Provider
sorted_providers = self.sort_provider(self.text_data_list)
# Füge die sortierten Provider zur scrollbaren Ansicht hinzu
for i, provider in enumerate(sorted_providers):
provider_frame = ctk.CTkFrame(self.frame.provider_container)
provider_frame.pack(fill="x", padx=5, pady=2)
name_label = ctk.CTkLabel(provider_frame, text=provider.title)
name_label.pack(side="left", padx=5)
count_label = ctk.CTkLabel(provider_frame, text=str(provider.get_fake_percentage())+"%")
count_label.pack(side="right", padx=5)
def _update_output(self, output: str) -> None:
"""
Update the output text box with the result.
:param output: String containing the output to display
"""
self.frame.output_textbox.configure(state="normal")
self.frame.output_textbox.delete("0.0", "end")
self.frame.output_textbox.insert("0.0", output)
self.frame.output_textbox.configure(state="disabled")