Форум сайта python.su
Всем привет.
Я новичок как в питоне, так и в программировании вообще. Мой пробег 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()
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)
Прикреплённый файлы: tasker1.jpg (46,6 KБ)
Офлайн
Используйте excel для этой задачи.
Да, я понимаю, что хочется перед самим собой выпендриться и сделать это на пайтоне.
Да, я понимаю, гордость за СВОЮ программу.
У меня тоже такие есть. Штук 15. Используйте excel для этой задачи.
Потому что программирование - это в первую очередь, выбор простого, нетрудоемкого и рабочего пути решения задачи. К тому же таблица вскоре потребует расширения. И вы все равно переделаете ее в excel.
Офлайн
Kir@Не согласн. Используйте для этой задачи LibreOffice. Функционал тот-же, но это свободно распространяемое кроcсплатформенное ПО.
Используйте excel для этой задачи.
Kir@Ну тут есть смысл, например программа при запуске определяет текущего пользователя и показывает задачи именно для него и для его подчиненных. Т.е. могут быть полезные плюшки которые нужны в бизнес процессе данной организации и только в ней. Тогда свой код лучше. Другое дело что таблицу можно все равно показать в LibreOffice. С тем же успехом можно говорить о web или Qt. Это уже дело вкуса.
выпендриться и сделать это на пайтоне.
Офлайн
Не пойдет ни эксель ни любой другой табличный процессор. Это лишь одна из функций конечной проги. Еще она должна сигналить, когда истекает срок, отведенный под определенную задачу, принимать запросы на внесение правок (если сроки сдвинуты, или задача завершена).
К слову, сейчас для этой цели используется эксель и это очень неудобно.
Другое дело что таблицу можно все равно показать в LibreOfficeМожно хранилище открывать в офисных приложениях, тока надо доустановить sqlite3 драйвер.
Да, я понимаю, что хочется перед самим собой выпендриться и сделать это на пайтоне.Отчасти соглашусь, но основной мотив - все-таки живая практика. Тут буду и поддерживать свой мини-проект и дорабатывать и править.
SELECT * FROM tasks WHERE Задача like "%{kword}%" OR Подзадача like "%{kword}%" OR Сотрудник like "%{kword}%" OR Тек статус like "%{kword}%";
Отредактировано Soy (Март 23, 2016 15:01:49)
Офлайн