Найти - Пользователи
Полная версия: Фильтр по кнопке "В реальном времени"
Начало » Центр помощи » Фильтр по кнопке "В реальном времени"
1
Soy
Всем привет.
Я новичок как в питоне, так и в программировании вообще. Мой пробег 3 месяца
Решил попробовать знания на практике и написать простую программку. Суть ее проста - показать текущее состояние задач, поставленных перед сотрудниками отдела. (Скрин прилепил)
Никак не получается заставить отфильтровать записи, то есть запускаем прогу и видим таблицу на 1000 строк. В строку вводим, например, фамилию ответственного, нажимаем кнопку и в таблице остаются только задачи указанного сотрудника. Если мы оставляем поле пустым и жмем кнопку - отображаются снова все записи. Много способов перепробовал, но даже если этот код запускается, то фильтрация не работает.
Не совсем понимаю, как можно из конструкции
Button(somewin, text="sometxt", command=somecomm)
получить конкретную переменную со значением?

Собственно кодище:
from tkinter import *
from queries import createCommand
from queries import searchText
from tkinter.ttk import *
import sqlite3
import os
import datetime
def search(mainWindow):
    queryForm = Frame(mainWindow)
    labelForm = Frame(queryForm)
    entryForm = Frame(queryForm)
    queryForm.pack(side=TOP, fill=X)
    labelForm.pack(side=LEFT)
    entryForm.pack(side=LEFT, expand=YES, fill=X)
    lab = Label(labelForm, text="Поиск", width=6)
    ent = Entry(entryForm)
    lab.pack(side=TOP)
    ent.pack(side=TOP, expand=YES, fill=X)
    var = StringVar()
    ent.config(textvariable=var)
    return var
def fetch(var):
    return var.get()
    #print("Input :::", var.get())
    
def close(mainWindow):
    pass
def table(mainWindow, heads, sqlCommand):
    tableForm = Frame(mainWindow)
    tableForm.pack(side=TOP)
    table = Treeview(tableForm, show="headings", selectmode="browse", height=12)
    table["columns"]=heads
    table["displaycolumns"]=heads
    table.heading("id", text="ID", anchor=CENTER)
    table.heading("task", text="Задача", anchor=CENTER)
    table.heading("subtask", text="Подзадача", anchor=CENTER)
    table.heading("person", text="Сотрудник", anchor=CENTER)
    table.heading("date", text="Дата", anchor=CENTER)
    table.heading("status", text="Статус", anchor=CENTER)
    table.heading("comment", text="Коммент", anchor=CENTER)
    table.heading("currstat", text="Тек. статус", anchor=CENTER)
    table.heading("dayrem", text="Осталось", anchor=CENTER)
    table.column("id", stretch=0, width=30)
    table.column("task", stretch=0, width=70)
    table.column("subtask", stretch=0, width=170)
    table.column("person", stretch=0, width=70)
    table.column("date", stretch=0, width=70)
    table.column("status", stretch=0, width=70)
    table.column("comment", stretch=0, width=70)
    table.column("currstat", stretch=0, width=70)
    table.column("dayrem", stretch=0, width=70)
    cursor.execute(sqlCommand) # Здесь 
    result = cursor.fetchall()
    for i in result:
        table.insert('', END, values=(i[0], i[1], i[2], i[3], i[4], i[5], i[6], i[7], i[8]))
    scrolltable = Scrollbar(tableForm, command=table.yview)
    table.configure(yscrollcommand=scrolltable.set)
    table.pack(side=LEFT, expand=YES, fill=BOTH)
    scrolltable.pack(side=LEFT, expand=YES, fill=Y)
    
def showRecords(keyword):
    if keyword == None:
        sqlCommand = ("SELECT * FROM tasks")
    else:
        sqlCommand = searchText.format(kword=keyword)
    return sqlCommand
    
heads=('id', 'task', 'subtask', 'person', 'date', 'status', 'comment', 'currstat', 'dayrem')
#headsru=('ID', "Задача", "Подзадача", "Сотрудник", "Дата", "Статус", "Коммент", "Тек. статус", "Осталось")
dbpath = os.path.join(os.getenv('HOMEDRIVE'), os.getenv('HOMEPATH'), 'documents\\Tasker')
if not os.path.exists(dbpath):
    os.mkdir(dbpath)
#dbfile = (dbpath + os.sep + 'tasker.db')
dbfile='D:\\GDrive\\python\\pysql\\bases\\tasker.db' # Временная база
connection = sqlite3.connect(dbfile)
cursor = connection.cursor()
try:
    cursor.execute(createCommand)
except sqlite3.OperationalError:
    pass
### SELFTESTING ###
mainWindow = Tk()
mainWindow.title("Tasker 0.1")
mainWindow.geometry("720x400")
var = search(mainWindow)
btn = Button(mainWindow, text="Найти",
             command=lambda: fetch(var)).pack() # жмем на кнопочку
showRecords(keyword=var.get()) # значение попадает сюда и тут формируется комманда sql
table(mainWindow, heads, sqlCommand) # таблица заполняется отфильтрованными значениями
mainWindow.mainloop()

Содержимое файла queries:

createCommand = """
    CREATE TABLE tasks (
        id INTEGER PRIMARY KEY,
        task NVARCHAR(1000),
        subtask NVARCHAR(1000),
        person NVARCHAR(50),
        date DATE,
        status NVARCHAR(200),
        comment NVARCHAR(1000),
        currstat NVARCHAR(30),
        dayremain INTEGER
    );"""
searchText = """
    SELECT * FROM tasks
    WHERE task = "{kword}"
        OR subtask = "{kword}"
        OR person = "{kword}"
        OR currstat = "{kword}";"""
Kir@
Используйте excel для этой задачи.
Да, я понимаю, что хочется перед самим собой выпендриться и сделать это на пайтоне.
Да, я понимаю, гордость за СВОЮ программу.

У меня тоже такие есть. Штук 15. Используйте excel для этой задачи.
Потому что программирование - это в первую очередь, выбор простого, нетрудоемкого и рабочего пути решения задачи. К тому же таблица вскоре потребует расширения. И вы все равно переделаете ее в excel.
doza_and
Kir@
Используйте excel для этой задачи.
Не согласн. Используйте для этой задачи LibreOffice. Функционал тот-же, но это свободно распространяемое кроcсплатформенное ПО.
Kir@
выпендриться и сделать это на пайтоне.
Ну тут есть смысл, например программа при запуске определяет текущего пользователя и показывает задачи именно для него и для его подчиненных. Т.е. могут быть полезные плюшки которые нужны в бизнес процессе данной организации и только в ней. Тогда свой код лучше. Другое дело что таблицу можно все равно показать в LibreOffice. С тем же успехом можно говорить о web или Qt. Это уже дело вкуса.
Soy
Не пойдет ни эксель ни любой другой табличный процессор. Это лишь одна из функций конечной проги. Еще она должна сигналить, когда истекает срок, отведенный под определенную задачу, принимать запросы на внесение правок (если сроки сдвинуты, или задача завершена).
К слову, сейчас для этой цели используется эксель и это очень неудобно.

Другое дело что таблицу можно все равно показать в LibreOffice
Можно хранилище открывать в офисных приложениях, тока надо доустановить sqlite3 драйвер.

Да, я понимаю, что хочется перед самим собой выпендриться и сделать это на пайтоне.
Отчасти соглашусь, но основной мотив - все-таки живая практика. Тут буду и поддерживать свой мини-проект и дорабатывать и править.

P.S. Свой вопрос (из первого поста) почти решил. Дома еще откатаю различные ситуации.
И, да. Запрос на поиск не работает в том виде. Надо так:
Заметьте, названия столбцов должны быть без кавычек. Странно…
    SELECT * FROM tasks
    WHERE Задача like "%{kword}%"
        OR Подзадача like "%{kword}%"
        OR Сотрудник like "%{kword}%"
        OR Тек статус like "%{kword}%";
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB