Форум сайта python.su
Здравствуйте, вот какая задачка, нужно что бы, пользователь мог добавлять и удалять записи в Listbox. Какие соображения будут?
# -*- coding: UTF-8 -*-
from tkinter import *
import tkinter.filedialog as fdialog
from tkinter import messagebox
from tkinter.messagebox import *
root = Tk()
root.geometry('800x450')
root.title('Окно оформления')
root.resizable(width = False, height = False)
#####
label_70 = Label(root, text = u'Замовник: ')
label_70.place(x = 300, y = 10 )
#
lbox1 = Listbox(root)
lbox1.grid(padx=300, pady = 30)
list1=
for i in list1:
lbox1.insert(END,i)
edit1 = Entry(root)
edit1.grid()
def list_to_entry(evt):
value = lbox1.get(lbox1.curselection()) # ya zadolbalsya s 3tim, vse svoistva na angl, poka doper 4to oni zna4at i kak primenbt'
edit1.delete(0, END) # esli ne o4iwatb, to on budet dopisivatb, a nado, 4to bi perezapisival
edit1.insert(0,value) # bilo tipo: 200300400, a budet: 200, 300, 400
lbox1.bind('<<ListboxSelect>>',list_to_entry)
#——————————————SAVE_AS_START————————————————————————
def save_as():
if askyesno(“Save As?”, “Зберегти введенне?”):
#Объявление переменных
zamownik = ‘ Замовник ’ + str(edit1.get())
###############
print ( zamownik, ‘\n’,
‘————————————————————-’)
list_1 =
sa = fdialog.asksaveasfilename(filetypes = ) # собственно, само сохранение
f = open(sa, ‘a’)
for i in list_1:
f.write(i)
f.close()
# Список фиг запишешь в фаил,
# пришлось циклично записывать по строкам
#—————————————————-SAVE_AS_END——————————————————————————————–
frame_1 = Frame(root, bg = ‘red’, bd = 2)
button_0 = Button(frame_1, text = u'Зберегти', command = save_as)
button_0.pack()
frame_1.place(x = 400, y = 360 )
root.mainloop()
Офлайн
Код оберните в теги.
Вопрос такого плана: как должно быть добавление? При нажатии на кнопку или … Распишите подробнее, что Вы хотите. Помогу с удовольствием, но надо знать, где помогать
Офлайн
Только что обдумал как его точнее реализовать, вышло сложнее.
Кнопка “Редактиравать” открывает окно с списком где тоже есть кнопки “+”, “Р”. Кликаем на “+” появляется что-то вроде edit в который записывается элемент списка нажимаем на “Сохранить” или “Отменить”. Кнопка “Р” - редактровать если надо перезаписать неправильно введеные значения.
Во наваял. )
Прикреплённый файлы:
Пример.JPG (30,0 KБ)
Офлайн
Подождите. Запутался. Зачем второе окно…
Есть список. Внизу кнопка. Когда Вы находитесь на нужном поле, то просто нажимаете на кнопку. Появляется окно edit и Вы редактируете текст в поле. Так годится?
Офлайн
Yura_Lemeshko
Попробовал поковырять ваш код. Кстати попробуйте скопировать свой же код, который вы выложили и заставаить его хотя бы запуститься.
ОТдельное окно я не делал, потому что не знаю как, но сделал добавление и редактирование пунктов используя поле ввода. Пробуйте в него вводить текст и добавлять пункт или выбрав пункт в списке ввделите в поле новый текст и жми “Редактировать”.
#!/usr/bin/python3 # -*- coding: UTF-8 -*- from tkinter import * import tkinter.filedialog as fdialog from tkinter import messagebox from tkinter.messagebox import * root = Tk() # Окно root.geometry('800x450') # Размер окнаа root.title('Окно оформления') # Заголовок окна root.resizable(width = False, height = False) # Запрет на изменение размеров окна label_70 = Label(root, text = 'Замовник: ') # Создаём лейбл label_70.place(x = 300, y = 10 ) # Задаём координаты лейбла lbox1 = Listbox(root) # Создаём список (http://effbot.org/tkinterbook/listbox.htm) lbox1.grid(padx=300, pady = 30) # Создаём сетку (?) list1=["Пункт 1","Пункт 2","Пункт 3","Пункт 4","Пункт 5","Пункт 6"] # Массив данных для вставки в Listbox for i in list1: # Цикл вставки в Listbox lbox1.insert(END,i) edit1 = Entry(root) # Создаём поле ввода edit1.grid() # Функция связанная с выбором в Listbox def list_to_entry(evt): value = lbox1.get(lbox1.curselection()) # Получить выделенное edit1.delete(0, END) # очищает поле ввода edit1.insert(0,value) # вставляет текст в поле ввода # Связали (забиндили) событие выбора в Listbox с функцией "list_to_entry" lbox1.bind('<<ListboxSelect>>',list_to_entry) #— Начало функции сохранения ————————————————————————————————————— # Функция связанная с кнопкой сохранения def save_as(): # Если окейнули кнопку в вопросительном диалоге, то if askyesno('Предупреждение', 'Вы действительно хотите сохранить список?'): edit1text = ' В поле ввода: ' + str(edit1.get()) # Получаем текст поля ввода, проверяем вывод в консоли print(edit1text, '\n', '————————————————————-') # И чо? Заного ввод? # list2=[u"Канберра",u"Сидней",u"Мельбурн",u"Аделаида"] list_1=lbox1.get(0, END) # Получить все пункты списка # Можно через lbox1.size() получить число пунктов и считывать/записывать по одному, без выделения памяти под кортеж list_1. sa = fdialog.asksaveasfilename(filetypes = '') # вызов диалога сохранения f = open(sa, 'a') # Открыть файл, режим добавления for i in list_1: # Откуда этот спимок? С какого потолка? f.write(i + '\n') # пишем пункт вставляя перенос строки f.close() # Закрываем файл после записи # Список фиг запишешь в фаил, (не удивительно, ведь его (списка) нет (не было)) # пришлось циклично записывать по строкам (можно в памяти соединить строки, но этож накладней) #~ #— Конец функции сохранения ————————————————————————————————————— # Создаём фрейм frame_1 = Frame(root, bg = 'red', bd = 2) # Почему red? frame_1.place(x = 400, y = 360 ) # Координаты размещения фрейма # Создаём кнопку button_0 = Button(frame_1, text = 'Зберегти', command = save_as) # Создаём кнопку, связываем с функцией save_as button_0.pack() #~ Функция вставки def added(): text = str(edit1.get()) # Читаем поле ввода if not (text==''): # Проверяем что текст не пустой, перед вставкой lbox1.insert(END,text) # Вставляет в конец списка lbox1.insert(3,'- "' + text + '" - вставлен в поз:3') # Вставляет в позицию 3 button_1 = Button(frame_1, text = '+', command = added) # Создаём кнопку, связываем с функцией save_as button_1.pack() #~ Функция Редактирования def _Item_Edit(): text = str(edit1.get()) # Читаем поле ввода if not (text==''): # Проверяем что текст не пустой, перед вставкой #~ print (text) #~ inx = lbox1.get(ACTIVE) # получаем текст пункта inx = lbox1.index(ANCHOR) # получаем индекс пункта if inx > lbox1.size() - 1: # Защита от редактирования пункта без выбора print ('выберите пункт для начала') return lbox1.delete(inx) # удаляем пункт по индексу lbox1.insert(inx, text + ' (удача ?)') # Вставляет пункт по индексу edit1.delete(0, END) # очищает поле ввода button_2 = Button(frame_1, text = 'Редактировать', command = _Item_Edit) # Создаём кнопку, связываем с функцией save_as button_2.pack() root.mainloop()
Офлайн
Увидел
from tkinter import *
for i in list1: # Цикл вставки в Listbox lbox1.insert(END,i)
Отредактировано 4kpt_II (Сен. 10, 2014 20:00:47)
Офлайн
4kpt_II
Слабое место этого всего отсутствие справки. Начал с того что перевёл 50% Listbox, теперь ещё создать примеры раскрывающие все варианты конструкции и переписать справку в виде справочника. И так для всех элементов tkinter, а потом ещё и для PySide и wxPython… А потом только начнём учится программировать.
Офлайн
Зачем? Есть нормальная документация. Ее хватает за голову. NewMexicoTech рулит
Отредактировано 4kpt_II (Сен. 10, 2014 20:56:17)
Офлайн
А, этот жёлтый сайт… Я был там. Но мой тезис звучал по другому - русский справочник, готовые примеры. Я не люблю несколько раз одно и тоже переводить при каждом обращении к справке, лучше сделать это 1 раз.
Офлайн
Если примеры будут такого же уровня, как и код выше, то лучше не надо
А вот за перевод многие скажут спасибо. Уже часть перевода, к слову, кем - то была сделана. Можете порыться и дописать там то, чего не хватает. Вот это будет очень полезное дело.
Офлайн