@Sventiler

В чем ошибка кода?

есть код на python , нужно сделать так чтоб был поиск уже созданном окне ,,Окно поиска,,
выписывал значения , выводится полностью все , а должно именно конкретное , также не работает поиск никакой кроме id.
скрин предоставлен где ошибка:
657ed5126cc21598238736.png
657ed3fe6ece7700729790.png

import tkinter as tk
from tkinter import ttk, messagebox, filedialog
import sqlite3
import pandas as pd

class SearchWindow(tk.Toplevel):
    def __init__(self, master, search_callback, conn):
        super().__init__(master)
        self.title("Окно поиска")
        self.transient(master)
        self.grab_set()

        self.search_callback = search_callback
        self.conn = conn

        self.create_widgets()

    def create_widgets(self):
        self.label = tk.Label(self, text="Введите значения для поиска:")
        self.label.grid(row=0, column=0, padx=10, pady=10, sticky="w")

        self.filters = {
            "ID": tk.StringVar(),
            "Город": tk.StringVar(),
            "Температура": tk.StringVar(),
            "Погода": tk.StringVar(),
            "Скорость ветра": tk.StringVar(),
        }

        row_num = 1
        for criteria, var in self.filters.items():
            label = tk.Label(self, text=criteria)
            label.grid(row=row_num, column=0, padx=10, pady=5, sticky="w")

            entry = tk.Entry(self, textvariable=var)
            entry.grid(row=row_num, column=1, padx=10, pady=5, sticky="w")

            row_num += 1

        self.search_button = tk.Button(self, text="Выполнить поиск", command=self.perform_search)
        self.search_button.grid(row=row_num, column=0, columnspan=2, padx=10, pady=10, sticky="w")

        # Добавим Treeview для отображения результатов поиска
        self.tree = ttk.Treeview(self, columns=("ID", "Город", "Температура", "Погода", "Скорость ветра"), show="headings")
        self.tree.heading("ID", text="ID")
        self.tree.heading("Город", text="Город")
        self.tree.heading("Температура", text="Температура")
        self.tree.heading("Погода", text="Погода")
        self.tree.heading("Скорость ветра", text="Скорость ветра")
        self.tree.grid(row=row_num + 1, column=0, columnspan=2, pady=10, padx=10, sticky="w")

    def perform_search(self):
        filter_values = {criteria: var.get() for criteria, var in self.filters.items()}

        # Очистить предыдущие данные в Treeview
        for row in self.tree.get_children():
            self.tree.delete(row)

        # Поиск данных по всем критериям
        cursor = self.conn.cursor()
        query = "SELECT * FROM weather WHERE "
        conditions = []
        for criteria, value in filter_values.items():
            if value:
                conditions.append(f"{criteria} LIKE ?")
        cursor.execute(query + " AND ".join(conditions), ['%' + value + '%'])

        data = cursor.fetchall()

        if data:
            for row in data:
                self.tree.insert("", "end", values=row)
        else:
            messagebox.showinfo("Данные о погоде", "Нет данных для введенных значений")

class WeatherApp:
    def __init__(self, master):
        self.master = master
        self.master.title("Погодное приложение")

        self.create_widgets()

        # Подключение к базе данных
        self.conn = sqlite3.connect("weather.db")
        self.create_table()

    def create_widgets(self):
        self.label = tk.Label(self.master, text="Погодное приложение", font=("Helvetica", 16))
        self.label.grid(row=0, column=0, columnspan=3, pady=10, sticky="w")

        self.data_menu = tk.Menu(self.master, tearoff=0)
        self.data_menu.add_command(label="Вывести все данные", command=self.show_all_data)
        self.data_menu.add_separator()
        self.data_menu.add_command(label="Экспорт в Excel", command=self.export_to_excel)
        self.data_menu.add_command(label="Импорт из Excel", command=self.import_from_excel)

        self.data_button = tk.Button(self.master, text="Данные", command=self.show_menu)
        self.data_button.grid(row=1, column=0, pady=5, padx=10, sticky="w")

        self.search_entry = tk.Entry(self.master, width=30)
        self.search_entry.grid(row=2, column=0, pady=5, padx=10, sticky="w")

        self.search_button = tk.Button(self.master, text="Поиск по городу", command=self.search_by_city)
        self.search_button.grid(row=2, column=1, pady=5, padx=10, sticky="w")

        self.search_window_button = tk.Button(self.master, text="Открыть окно поиска", command=self.open_search_window)
        self.search_window_button.grid(row=2, column=2, pady=5, padx=10, sticky="w")

        self.tree = ttk.Treeview(self.master, columns=("ID", "Город", "Температура", "Погода", "Скорость ветра"), show="headings")
        self.tree.heading("ID", text="ID")
        self.tree.heading("Город", text="Город")
        self.tree.heading("Температура", text="Температура")
        self.tree.heading("Погода", text="Погода")
        self.tree.heading("Скорость ветра", text="Скорость ветра")
        self.tree.grid(row=3, column=0, columnspan=3, pady=20, padx=10, sticky="w")

    def create_table(self):
        cursor = self.conn.cursor()
        cursor.execute('''
            CREATE TABLE IF NOT EXISTS weather (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                city TEXT NOT NULL,
                temperature INTEGER,
                weather_conditions TEXT,
                wind_speed INTEGER
            )
        ''')
        self.conn.commit()

    def show_all_data(self):
        for row in self.tree.get_children():
            self.tree.delete(row)

        cursor = self.conn.cursor()
        cursor.execute("SELECT * FROM weather")
        data = cursor.fetchall()

        if data:
            for row in data:
                self.tree.insert("", "end", values=row)
        else:
            messagebox.showinfo("Данные о погоде", "Нет данных о погоде")

    def search_by_city(self):
        for row in self.tree.get_children():
            self.tree.delete(row)

        city = self.search_entry.get()
        cursor = self.conn.cursor()
        cursor.execute("SELECT * FROM weather WHERE city=?", (city,))
        data = cursor.fetchall()

        if data:
            for row in data:
                self.tree.insert("", "end", values=row)
        else:
            messagebox.showinfo("Данные о погоде", f"Нет данных о погоде для города {city}")

    def show_menu(self):
        self.data_menu.post(self.data_button.winfo_rootx(), self.data_button.winfo_rooty() + self.data_button.winfo_height())

    def export_to_excel(self):
        cursor = self.conn.cursor()
        cursor.execute("SELECT * FROM weather")
        data = cursor.fetchall()

        if data:
            file_path = filedialog.asksaveasfilename(defaultextension=".xlsx", filetypes=[("Excel files", "*.xlsx")])
            if file_path:
                df = pd.DataFrame(data, columns=["ID", "Город", "Температура", "Погода", "Скорость ветра"])
                df.to_excel(file_path, index=False)
                messagebox.showinfo("Экспорт в Excel", f"Данные успешно экспортированы в Excel ({file_path})")
        else:
            messagebox.showinfo("Экспорт в Excel", "Нет данных для экспорта")

    def import_from_excel(self):
        file_path = filedialog.askopenfilename(filetypes=[("Excel files", "*.xlsx")])
        if file_path:
            try:
                df = pd.read_excel(file_path)
                cursor = self.conn.cursor()
                cursor.executemany("INSERT INTO weather (city, temperature, weather_conditions, wind_speed) VALUES (?, ?, ?, ?)",
                                   df[["Город", "Температура", "Погода", "Скорость ветра"]].values.tolist())
                self.conn.commit()
                messagebox.showinfo("Импорт из Excel", "Данные успешно импортированы из Excel")
            except Exception as e:
                messagebox.showinfo("Импорт из Excel", f"Произошла ошибка: {str(e)}")

    def open_search_window(self):
        search_window = SearchWindow(self.master, self.search_by_criteria, self.conn)

    def search_by_criteria(self, criteria, value):
        for row in self.tree.get_children():
            self.tree.delete(row)

        # Поиск данных по всем критериям
        cursor = self.conn.cursor()
        query = f"SELECT * FROM weather WHERE {criteria} LIKE ?"
        cursor.execute(query, ('%' + value + '%',))
        data = cursor.fetchall()

        if data:
            for row in data:
                self.tree.insert("", "end", values=row)
        else:
            messagebox.showinfo("Данные о погоде", f"Нет данных о погоде для {criteria}={value}")

if __name__ == "__main__":
    root = tk.Tk()
    app = WeatherApp(root)
    root.mainloop()
  • Вопрос задан
  • 208 просмотров
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Ошибка в том, что ты пытаешься делать две вещи сразу.
У тебя описан словарь фильтров:
self.filters = {  # тут у тебя человекочитаемые заголовки
            "ID": tk.StringVar(),
            "Город": tk.StringVar(),
            "Температура": tk.StringVar(),
            "Погода": tk.StringVar(),
            "Скорость ветра": tk.StringVar(),
}

Но дальше ты делаешь
# тут ты переносишь пару заголовок-значение в словарь строка:строка
filter_values = {criteria: var.get() for criteria, var in self.filters.items()}
...
for criteria, value in filter_values.items():
    if value:  # а тут ты внезапно решаешь что у тебя ключ - имя поля, а не заголовок
        conditions.append(f"{criteria} LIKE ?")


Собственно, почему только с ID и работает поиск. Потому что это единственное поле, где заголовок совпадает с именем поля в таблице БД.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы