Найти - Пользователи
Полная версия: Listbox в Tkinter
Начало » GUI » Listbox в Tkinter
1 2 3 4 5 6
Yura_Lemeshko
Здравствуйте, вот какая задачка, нужно что бы, пользователь мог добавлять и удалять записи в 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()
4kpt_II
Код оберните в теги.
Вопрос такого плана: как должно быть добавление? При нажатии на кнопку или … Распишите подробнее, что Вы хотите. Помогу с удовольствием, но надо знать, где помогать
Yura_Lemeshko
Только что обдумал как его точнее реализовать, вышло сложнее.
Кнопка “Редактиравать” открывает окно с списком где тоже есть кнопки “+”, “Р”. Кликаем на “+” появляется что-то вроде edit в который записывается элемент списка нажимаем на “Сохранить” или “Отменить”. Кнопка “Р” - редактровать если надо перезаписать неправильно введеные значения.
Во наваял. )
4kpt_II
Подождите. Запутался. Зачем второе окно…
Есть список. Внизу кнопка. Когда Вы находитесь на нужном поле, то просто нажимаете на кнопку. Появляется окно edit и Вы редактируете текст в поле. Так годится?
AZJIO
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()
4kpt_II
Увидел

from tkinter import *

и

for i in list1: # Цикл вставки в Listbox
	lbox1.insert(END,i)

Дальше читать просто не стал…
AZJIO
4kpt_II
Слабое место этого всего отсутствие справки. Начал с того что перевёл 50% Listbox, теперь ещё создать примеры раскрывающие все варианты конструкции и переписать справку в виде справочника. И так для всех элементов tkinter, а потом ещё и для PySide и wxPython… А потом только начнём учится программировать.
4kpt_II
Зачем? Есть нормальная документация. Ее хватает за голову. NewMexicoTech рулит
AZJIO
А, этот жёлтый сайт… Я был там. Но мой тезис звучал по другому - русский справочник, готовые примеры. Я не люблю несколько раз одно и тоже переводить при каждом обращении к справке, лучше сделать это 1 раз.
4kpt_II
Если примеры будут такого же уровня, как и код выше, то лучше не надо

А вот за перевод многие скажут спасибо. Уже часть перевода, к слову, кем - то была сделана. Можете порыться и дописать там то, чего не хватает. Вот это будет очень полезное дело.
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