Передать выделенное окно списка в главное окно - PullRequest
0 голосов
/ 21 января 2019

Это мой первый настоящий проект на Python.В настоящее время я разрабатываю графический интерфейс в Tkinter, который позволяет пользователю выбирать задачи и резюме для автоматической компиляции документов с использованием стандартных предварительно определенных задач и текстов резюме из базы данных.

Я создал две кнопки «Добавить» в главном окнедобавить Задачи и резюме, которые отображают всплывающее окно со списком, позволяющее пользователю выбрать Задачи и резюме, которые он хочет включить в коммерческое предложение.Мне удалось создать всплывающее окно как отдельный класс, и оно сохраняет выбранные задачи в списке, но теперь мне нужно передать список с выбранными элементами в список в главном окне, когда пользователь нажимает кнопку Выбрать ввсплывающее окно, но я не могу разобраться, как это сделать.

Я исследовал различные форумы и смотрел различные видео на Youtube, но все они фокусируются на всплывающих окнах или каком-то другом.

Это код для главного окна:

from tkinter import *
from Add import *

# make main window
root = Tk()

theLabel = Label(root, text="ProposalBuilder")
theLabel.grid(row=0)

# make frames
taskFrame = Frame(root)
taskFrame.grid(row=1, column=0)

CVFrame = Frame(root)
CVFrame.grid(row=1, column=1)

buildFrame = Frame(root)
buildFrame.grid(row=2, columnspan=2)

# add labels to frames
taskLabel = Label(taskFrame, text="Tasks")
taskLabel.pack()

CVLabel = Label(CVFrame, text="CVs")
CVLabel.pack()

# add listboxes to frames
scrollTask = Scrollbar(taskFrame, orient=VERTICAL)
listTask = Listbox(taskFrame, selectmode=MULTIPLE, yscrollcommand=scrollTask.set)
scrollTask.config(command=listTask.yview)
scrollTask.pack(side=RIGHT, fill=Y)
listTask.pack()

scrollCV = Scrollbar(CVFrame, orient=VERTICAL)
listCV = Listbox(CVFrame, selectmode=MULTIPLE, yscrollcommand=scrollCV.set)
scrollCV.config(command=listCV.yview)
scrollCV.pack(side=RIGHT, fill=Y)
listCV.pack()

# add commands to buttons
def addTask():
    taskBox = Add('C:\\Users\\204703\\ProposalBuilder\\Database')
    sel_test = taskBox.selection

def addCV():
    CVBox = Add('C:\\Users\\204703\\ProposalBuilder\\Database')

# add buttons to frames
buttonAddTask = Button(taskFrame, text="Add", command=addTask)
buttonAddTask.pack(fill=X)
buttonDelTask = Button(taskFrame, text="Delete")
buttonDelTask.pack(fill=X)
buttonUpTask = Button(taskFrame, text="Up")
buttonUpTask.pack(fill=X)
buttonDownTask = Button(taskFrame, text="Down")
buttonDownTask.pack(fill=X)

buttonAddCV = Button(CVFrame, text="Add", command=addCV)
buttonAddCV.pack(fill=X)
buttonDelCV = Button(CVFrame, text="Delete")
buttonDelCV.pack(fill=X)
buttonUpCV = Button(CVFrame, text="Up")
buttonUpCV.pack(fill=X)
buttonDownCV = Button(CVFrame, text="Down")
buttonDownCV.pack(fill=X)

buttonBuild = Button(buildFrame, text="Build Proposal")
buttonBuild.pack(side=RIGHT)

root.mainloop()

Это код для отдельного класса, который я создал для всплывающего окна:

from tkinter import*
from os import *

class Add:
    def __init__(self, path):
        # the slected tasks
        self.selection = []
        # make a frame
        top = Toplevel()

        # get file names from the directory (path) and save in list
        self.path = path
        self.dirList = listdir(self.path)

        # add listbox to frames and populate with file names
        self.scrollList = Scrollbar(top, orient=VERTICAL)
        self.listbox = Listbox(top, selectmode=MULTIPLE, yscrollcommand=self.scrollList.set)
        self.scrollList.config(command=self.listbox.yview)
        self.scrollList.pack(side=RIGHT, fill=Y)
        for item in self.dirList:
            self.listbox.insert(END,item)
        self.listbox.pack()

        # add buttons to frame
        self.selectButton = Button(top, text="Select", command=self.select)
        self.selectButton.pack()

        self.quitButton = Button(top, text="Quit", command=top.destroy)
        self.quitButton.pack()

    # identify selected rows and return a list with the selection
    def select(self):
        selectedRows = self.listbox.curselection()
        for item in selectedRows:
                self.selection.append(self.dirList[item])
        print(self.selection)
        return self.selection

1 Ответ

0 голосов
/ 21 января 2019

Вопрос : передать список с выбранными элементами в список в главном окне

Вам нужна ссылка на главное окно списка.

Я покажу, как пользоваться listTask

  1. Расширьте __init__, чтобы принять ссылку target_listbox

    class Add:
        def __init__(self, target_listbox, path):
            self.target_listbox = target_listbox
    
  2. Вставьте выбранные элементы в .target_listbox
    Примечание : Ваш return self.selection бесполезен, Button.command не может обработать возврат .

    def select(self):
        selectedRows = self.listbox.curselection()
        for item in selectedRows:
            self.target_listbox.insert(tk.END, self.dirList[item])
    
  3. Передать ссылку listTask на Add(...

    taskBox = Add(listTask, ...)
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...