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

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

 # -*- 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()
PEHDOM
в таком виде можно было и не писать класс. В каждом методе куча global, причем я не вижу особой необходимости в их использовании. summ, categorySelected, totalW, x, item можно сделать атрибутами класса, а category хотябы передать агрументом.
stas90
Подправлю, большое спасибо!
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