Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 2, 2017 19:07:24

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Tkinter, два listbox'a

Конечно можно, даже нужно!



Офлайн

#2 Июнь 4, 2017 05:43:06

stas90
Зарегистрирован: 2017-05-04
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter, два listbox'a

Подскажите пожалуйста, как?
Можно хотя бы на пальцах что куда

Офлайн

#3 Июнь 6, 2017 13:56:06

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Tkinter, два listbox'a

stas90
Можно хотя бы на пальцах что куда
Ваше окно это одельный класс, а все ваши процедуры методы класса
Переработать способ заполнения листбоксов. у вас сейчас оно берет из словарей котроые прописаны прямо в коде. А откуда оно будет брать эти данные в продакшине? Файл, СУБД, Сайт?
Написать отдельный класс типа Loader у которого бдут методы получитьСписокКатегорий() и получитьСписокЭлементов(категория).Тогда вы сможете абстрагироваться от того откуда пришли данные, и из окна просто дергать методы loader-a. А уже в самом лоадере прописыать толи вычитывать из БД это толи из файлов, толи еще окуда.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#4 Июнь 6, 2017 18:14:32

stas90
Зарегистрирован: 2017-05-04
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter, два listbox'a

Большое спасибо!

Сейчас в командировке, а на следующей неделе перепишу и скину на проверку ;-)

Офлайн

#5 Июнь 7, 2017 18:30:07

stas90
Зарегистрирован: 2017-05-04
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter, два listbox'a

В общем вот так получилось,
данные будут загружаться из словарей в коде, т.к. нового ничего не будет:

 # -*- coding: utf-8 -*-
# coding: utf8
# coding=utf8
import collections
from tkinter import Label, Entry, Listbox, Tk, END, Button
import tkinter.ttk
other = collections.OrderedDict(
    [
    ("Гайка", "0.2"),
    ("Груз (кг)", "1")
    ])
anchor = collections.OrderedDict(
    [
    ('А1', '1.6'),
    ('А2', '2.45'),
    ('А3', '3')
    ])
plate = collections.OrderedDict(
    [
    ("1001", "0.314"),
    ("1002", "0.3925"),
    ("1003", "0.471")
    ])
category = collections.OrderedDict()
category["Анкера"]=anchor
category["Шайба"]=plate
category["Прочее"]=other
summ = {}
categorySelected = ""
totalW = 0
x=0
item=""
class MainWindow:
    def __init__(self,master):
        self.master = master
        self.master.title("Расчет веса")
        self.tree = tkinter.ttk.Treeview(master)
        self.tree["columns"]=("c","a","b")
        self.tree.column("c", width=100 )
        self.tree.column("a", width=100 )
        self.tree.column("b", width=100)
        self.tree.heading("c", text="Длина")
        self.tree.heading("a", text="Количество")
        self.tree.heading("b", text="Вес, кг")
        self.lbl = Label(master, text = 'Количество:')
        self.enterField = Entry(master,width=10)
        self.lbl1 = Label(master, text = 'Длина:')
        self.enterFieldQ = Entry(master,width=10)
        self.lblRes = Label(master, text="Итого:")
        self.lblRes1 = Label(master, text="")
        self.resetBtn = Button(master, text="Сброс", command=self.resetFunc)
        self.categoryList = Listbox(master, width = 15)
        self.productList = Listbox(master, width = 30)
        self.tree.grid(row=3, columnspan=2)
        self.enterField.grid(row=1,column=1)
        self.lbl.grid(row=2, column=0)
        self.enterFieldQ.grid(row=2,column=1)
        self.lbl1.grid(row=1, column=0)
        self.lblRes.grid(row=4, column=0)
        self.lblRes1.grid(row=4, column=1)
        self.resetBtn.grid(row=5,columnspan=2)
        self.categoryList.grid(row=0, column=0)
        self.productList.grid(row=0, column=1)
        self.productList.bind('<<ListboxSelect>>', self.onSelectItem)
        self.categoryList.bind('<<ListboxSelect>>', self.onSelectCategory)
        self.enterField.bind("<Return>", self.addToTree)
        self.enterFieldQ.bind("<Return>", self.addToTree)
        self.tree.bind("<Double-1>", self.doubleClick)
        for i in category:
            self.categoryList.insert(END, i)
    def onSelectCategory(self,evt):
        print("Category selected")
        global categorySelected
        itemsCounter = self.productList.size()
        if itemsCounter > 0:
            self.productList.delete(0, END)
        categorySelected = self.categoryList.get(self.categoryList.curselection())
        tableFill = {}
        if categorySelected == "Анкера":
            tableFill = anchor
        elif categorySelected == "Шайба":
            tableFill = plate
        elif categorySelected == "Прочее":
            tableFill = other
        for i in tableFill:
            self.productList.insert(END, i)
    def onSelectItem(self,evt):
        print ("Item selected")
        global item
        item = self.productList.get(self.productList.curselection())
    def addToTree(self,evt):
        global x
        global categorySelected
        global totalW
        global item
        print ("Pressed enter")
        quantity = self.enterFieldQ.get()
        length = self.enterField.get()
        if length == "":
            length = 1
        if quantity != "":
            weight = float(category[categorySelected][item])
            try:
                length = length.replace(',','.')
            except:
                pass
            weight = weight * float(length)
            if item == "АК15":
                weight = weight + 0.2
            if item == "А16В2":
                weight = weight + 0.2
            if item == "А20В2":
                weight = weight + 0.2
            if item == "А22В2":
                weight = weight + 0.2
            if item == "А25В2":
                weight = weight + 0.2
            weight = int(quantity)*weight
            weight = round(weight,2)
            if categorySelected != "Анкера":
                length = ""
            self.tree.insert("" , x, text=item, values=(length,quantity,weight))
            self.tree.column("a", anchor="e")
            self.tree.column("b", anchor="e")
            self.tree.column("c", anchor="e")
            totalW = totalW + weight
            totalW = round(totalW,2)
            self.lblRes1.configure(text=totalW)
            self.enterField.delete(0,END)
            self.enterFieldQ.delete(0,END)
            x=x+1
    def doubleClick(self,evt):
        global totalW
        print("doubleClick")
        if totalW > 0:
            selected_item = self.tree.selection()[0]
            print (selected_item)
            curItem = self.tree.focus()
            minusWeight = float(self.tree.item(curItem)["values"][2])
            totalW = totalW - minusWeight
            totalW = round(totalW,2)
            self.lblRes1.configure(text=totalW)
            self.tree.delete(selected_item)
    def resetFunc(self):
        #global categorySelected
        global totalW
        global x
        global item
        #categorySelected = ""
        totalW = 0
        x=0
        item=""
        for i in self.tree.get_children():
            self.tree.delete(i)
        self.lblRes1.configure(text="")
def main():
    root = Tk()
    app = MainWindow(root)
    root.mainloop()
if __name__ == '__main__':
    main()

Офлайн

#6 Июнь 7, 2017 22:21:19

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Tkinter, два listbox'a

в таком виде можно было и не писать класс. В каждом методе куча global, причем я не вижу особой необходимости в их использовании. summ, categorySelected, totalW, x, item можно сделать атрибутами класса, а category хотябы передать агрументом.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Июнь 7, 2017 22:22:23)

Офлайн

#7 Июнь 8, 2017 04:12:09

stas90
Зарегистрирован: 2017-05-04
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter, два listbox'a

Подправлю, большое спасибо!

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version