Уведомления

Группа в Telegram: @pythonsu

#1 Март 19, 2016 08:02:08

Soy
Зарегистрирован: 2016-03-15
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Фильтр по кнопке "В реальном времени"

Всем привет.
Я новичок как в питоне, так и в программировании вообще. Мой пробег 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}";"""

Отредактировано Soy (Март 19, 2016 08:02:50)

Прикреплённый файлы:
attachment tasker1.jpg (46,6 KБ)

Офлайн

#2 Март 23, 2016 03:37:44

Kir@
Зарегистрирован: 2015-08-13
Сообщения: 124
Репутация: +  0  -
Профиль   Отправить e-mail  

Фильтр по кнопке "В реальном времени"

Используйте excel для этой задачи.
Да, я понимаю, что хочется перед самим собой выпендриться и сделать это на пайтоне.
Да, я понимаю, гордость за СВОЮ программу.

У меня тоже такие есть. Штук 15. Используйте excel для этой задачи.
Потому что программирование - это в первую очередь, выбор простого, нетрудоемкого и рабочего пути решения задачи. К тому же таблица вскоре потребует расширения. И вы все равно переделаете ее в excel.

Офлайн

#3 Март 23, 2016 06:43:38

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Фильтр по кнопке "В реальном времени"

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



Офлайн

#4 Март 23, 2016 14:58:43

Soy
Зарегистрирован: 2016-03-15
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Фильтр по кнопке "В реальном времени"

Не пойдет ни эксель ни любой другой табличный процессор. Это лишь одна из функций конечной проги. Еще она должна сигналить, когда истекает срок, отведенный под определенную задачу, принимать запросы на внесение правок (если сроки сдвинуты, или задача завершена).
К слову, сейчас для этой цели используется эксель и это очень неудобно.

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

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

P.S. Свой вопрос (из первого поста) почти решил. Дома еще откатаю различные ситуации.
И, да. Запрос на поиск не работает в том виде. Надо так:
Заметьте, названия столбцов должны быть без кавычек. Странно…
    SELECT * FROM tasks
    WHERE Задача like "%{kword}%"
        OR Подзадача like "%{kword}%"
        OR Сотрудник like "%{kword}%"
        OR Тек статус like "%{kword}%";

Отредактировано Soy (Март 23, 2016 15:01:49)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version