Поднимите сообщение об ошибке в пользовательском интерфейсе tkinter, если нет выбора списка из нескольких списков - PullRequest
0 голосов
/ 09 января 2020

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

Я пытаюсь ввести в приведенный ниже скрипт функцию, которая проверяет, выбран ли какой-либо отдельный элемент в любом из списков, если нет выбора для сообщения об ошибке.

Я попытался сделать это с помощью кода функции checkSelection, но, похоже, он не работает.

Это приведенный ниже код, я попытался сохранить его наименьшим количеством возможных строк.

from tkinter import *
from tkinter import messagebox

def newItem():
    root2 = Tk()
    curs1 = lb1.curselection()
    curs2 = lb2.curselection()

    def checkSelection():
        if [curs1, curs2] is False:
            messagebox.showerror("error", "Select a List Box stooopid!")
    checkSelection()

    def saveclose():
        a = entry_1.get()
        if curs1 is not None:
            try:
                lb1.insert(curs1, a)
                root2.destroy()
            except:
                pass
        if curs2 is not None:
            try:
                lb2.insert(curs2, a)
                root2.destroy()
            except:
                pass

    entry_1 = Entry(root2)
    entry_1.grid(row=1, column=0, columnspan=5, rowspan=1, padx=5, pady=2, sticky=EW)
    saveButt = Button(root2, text="Ok", command=saveclose)
    saveButt.grid(row=6, column=1, sticky=E, padx=2, pady=2)

    root2.mainloop()

root = Tk()

newButt = Button(root, text="New Item", command=newItem)
newButt.pack(side=LEFT, padx=2, pady=2)

lb1 = Listbox(root, bg="green")
lb1items = ["ItemNumber1", "ItemNumber2", "ItemNumber3"]

for i in range(len(lb1items)):
    try:
        lb1.insert(i + 1, lb1items[i])
        lb1.pack(side=BOTTOM)
    except:
        pass

lb2 = Listbox(root, bg="blue")
lb2items = ["lb2 ItemNumber1", "lb2 ItemNumber2", "lb2 ItemNumber3"]
for j in range(len(lb2items)):
    try:
        lb2.insert(j + 1, lb2items[j])
        lb2.pack(side=BOTTOM)
    except:
        pass

root.mainloop()

1 Ответ

1 голос
/ 09 января 2020

Вы усложняете дело - вызов для создания другого экземпляра Tk просто для запроса строки можно упростить с помощью tkinter.simpledialog, например:

import tkinter as tk
from tkinter import messagebox, simpledialog

root = tk.Tk()

def newItem():
    result = simpledialog.askstring("Add new","Enter new item")
    if result and any(s.curselection() for s in (lb1,lb2)):
        lb1.insert(tk.END,result) if lb1.curselection() else lb2.insert(tk.END,result)
    else:
        messagebox.showerror("error", "Select a List Box stooopid!")

newButt = tk.Button(root, text="New Item", command=newItem)
newButt.pack(side=tk.LEFT, padx=2, pady=2)

lb1 = tk.Listbox(root, bg="green")
lb1.pack(side=tk.BOTTOM)
lb1items = ["ItemNumber1", "ItemNumber2", "ItemNumber3"]

lb2 = tk.Listbox(root, bg="blue")
lb2.pack(side=tk.BOTTOM)
lb2items = ["lb2 ItemNumber1", "lb2 ItemNumber2", "lb2 ItemNumber3"]

for a,b in zip(lb1items,lb2items):
    lb1.insert(tk.END, a)
    lb2.insert(tk.END, b)

root.mainloop()
...